我正试图检测交通标志的区域。使用OpenCV,我的方法如下:
彩色图片:
使用TanTriggs Preprocessing摆脱光照差异:
均衡直方图:
二进制化(Cv2.Threshold(blobs, blobs, 127, 255, ThresholdTypes.BinaryInv)
:
使用blob作为掩码,使用ConnectedComponents和get the mean color value迭代每个blob。如果是红色则可能是红色标志。
然后使用FindContours获取此blob的轮廓。
使用ApproxPolyDP简化轮廓并检查每个轮廓的点:
这种方法适用于二进制图像中的分离斑点,就像我的例子中的圆形100km标记一样。但是,如果存在与外部对象的连接,例如二进制图像中左下角的三角形,则会失败。
因为,这个blob的平均值远非红色!
在某些情况下,使用Erosion会有所帮助,但在许多其他图片中会更糟糕。
对二值化使用不同的阈值也适用于某些人,但许多人失败了;像侵蚀一样。
使用HoughCircle非常慢,我无法使用参数获得良好的效果。
我尝试使用matchShapes
,但无法取得好成绩。
有人能告诉我实现我想要的另一种方式(合理的计算时间)吗?
任何语言的任何信息或代码都会受到欢迎。
修改 使用circularity measure(C=P^2/4πA)或我上面描述的方法,可以在分离时找到三角形和椭圆形。但是当轮廓像这样时:
我找不到提取三角形片段的强大方法。如果可以,我会检查平均颜色,并确定它是否是红色标志候选者。
答案 0 :(得分:2)
抱歉,我没有评论的赞誉,但你不能使用红色吗?
import common
myshow = common.myshow
img = cv2.imread("ms0QB.png")
grey = np.zeros(img.shape[:2],np.uint8)
hsv = cv2.cvtColor(img,cv2.COLOR_mask = np.logical_or(hsv[:,:,0]>160,hsv[:,:,0]<10 )
grey[mask] = 255
cv2.imshow("160<hue<182",grey)
cv2.waitKey()