获取红色线条的坐标

时间:2016-06-13 10:54:42

标签: python opencv

我想在下图中检测到检测到的红色线条中的坐标。 但是当我运行下面的代码时,我得到所有坐标(红色线和其他识别的对象):

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()

输入图片

Original image

任何人都可以帮助我只获得红色线的坐标。

1 个答案:

答案 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)
这样你就会收到所有“红色”的角落。你只需要玩门槛。

请注意,此解决方案相当简单(使用阈值)