OpenCV - 仅检测图像中的特定线条
OpenCV - Detect only a particular line in an image
我正在尝试隔离下图中的一条线,我知道一些方法,例如 CannyEdge Detection 可以检测图像中的所有线,但我正在努力寻找我想要的线有兴趣。
如能提供有关 OpenCV 工具的任何信息,我们将不胜感激。
目标是检测球场顶部的红色轮廓线(我用蓝色勾勒出来)
在Python/OpenCV中,你可以对线条的红色进行阈值处理,然后得到最大的轮廓或大于区域阈值的轮廓,这就是我在下面显示的..
输入:
import cv2
import numpy as np
# read image as grayscale
img = cv2.imread('red_line.png')
# threshold on red color
lowcolor = (0,0,75)
highcolor = (50,50,135)
thresh = cv2.inRange(img, lowcolor, highcolor)
# apply morphology close
kernel = np.ones((5,5), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# get contours and filter on area
result = img.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
result = img.copy()
for c in contours:
area = cv2.contourArea(c)
if area > 5000:
cv2.drawContours(result, [c], -1, (0, 255, 0), 2)
# show thresh and result
cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save resulting images
cv2.imwrite('red_line_thresh.png',thresh)
cv2.imwrite('red_line_extracted.png',result)
阈值图像:
生成的轮廓:
我正在尝试隔离下图中的一条线,我知道一些方法,例如 CannyEdge Detection 可以检测图像中的所有线,但我正在努力寻找我想要的线有兴趣。
如能提供有关 OpenCV 工具的任何信息,我们将不胜感激。
目标是检测球场顶部的红色轮廓线(我用蓝色勾勒出来)
在Python/OpenCV中,你可以对线条的红色进行阈值处理,然后得到最大的轮廓或大于区域阈值的轮廓,这就是我在下面显示的..
输入:
import cv2
import numpy as np
# read image as grayscale
img = cv2.imread('red_line.png')
# threshold on red color
lowcolor = (0,0,75)
highcolor = (50,50,135)
thresh = cv2.inRange(img, lowcolor, highcolor)
# apply morphology close
kernel = np.ones((5,5), np.uint8)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# get contours and filter on area
result = img.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
result = img.copy()
for c in contours:
area = cv2.contourArea(c)
if area > 5000:
cv2.drawContours(result, [c], -1, (0, 255, 0), 2)
# show thresh and result
cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save resulting images
cv2.imwrite('red_line_thresh.png',thresh)
cv2.imwrite('red_line_extracted.png',result)
阈值图像:
生成的轮廓: