我想在下图中检测到检测到的红色线条中的坐标。 但是当我运行下面的代码时,我得到所有坐标(红色线和其他识别的对象):
import cv2
import numpy as np
import matplotlib.pyplot as plt
filename = 'detectedRoof.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# Threshold for an optimal value, it may vary depending on the image.
img[dst > 0.01*dst.max()] = [255, 0, 0]
cv2.imwrite('outputsimple.jpg', img)
coord = np.where(np.all(img == (255, 0, 0), axis=-1))
lol = zip(coord[0], coord[1])
print(lol)
print ("")
x = np.array(lol, dtype="int")
print (x)
filename1 = open("coordinates_simple.txt", "w")
filename1.write(str(lol))
filename1.close()
plt.scatter(coord[0], coord[1])
plt.show()
输入图片
任何人都可以帮助我只获得红色线的坐标。
答案 0 :(得分:1)
首先,“红色”是什么意思?我问,因为自然的红色物体(即角落)也总是有绿色和蓝色通道中的成分。
其次,您可以检测灰度图像中的角点,这意味着所有颜色的角落。之后,将这些对象设置为蓝色像素。
(第三,您是否知道通过设置img[dst > 0.01*dst.max()] = [255, 0, 0]
将这些像素设置为蓝色?)
观察这两个问题我建议修改你的相应代码,类似于此(保留原样):
img = cv2.imread(filename, 1)
b,g,r = cv2.split(img)
gray = np.float32(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
# detect corners in gray scale image
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# threshold (red > X, blue and green < Y) such that only reddish corners arec extracted
dst = np.where((dst > 0.01*dst.max()) & (r > 130) & (g < 100) & (b < 100), dst, 0)
这样你就会收到所有“红色”的角落。你只需要玩门槛。
请注意,此解决方案相当简单(使用阈值)