从图像

时间:2017-03-05 04:36:02

标签: opencv detection

我正试图检测交通标志的区域。使用OpenCV,我的方法如下:

彩色图片:

enter image description here

使用TanTriggs Preprocessing摆脱光照差异:

enter image description here

均衡直方图:

enter image description here

二进制化(Cv2.Threshold(blobs, blobs, 127, 255, ThresholdTypes.BinaryInv)

enter image description here

使用blob作为掩码,使用ConnectedComponentsget the mean color value迭代每个blob。如果是红色则可能是红色标志。

然后使用FindContours获取此blob的轮廓。

使用ApproxPolyDP简化轮廓并检查每个轮廓的点:

  • 如果是3分,那么三角形可以接受 - >三角标志的候选人
  • 如果4点,那么形状是可接受的 - >候选
  • 如果超过4个点,BBox尺寸是可以接受的,并且大多数点都在拟合的椭圆上(FitEllipse) - >候选

这种方法适用于二进制图像中的分离斑点,就像我的例子中的圆形100km标记一样。但是,如果存在与外部对象的连接,例如二进制图像中左下角的三角形,则会失败。

enter image description here

因为,这个blob的平均值远非红色!

在某些情况下,使用Erosion会有所帮助,但在许多其他图片中会更糟糕。

对二值化使用不同的阈值也适用于某些人,但许多人失败了;像侵蚀一样。

使用HoughCircle非常慢,我无法使用参数获得良好的效果。

我尝试使用matchShapes,但无法取得好成绩。

有人能告诉我实现我想要的另一种方式(合理的计算时间)吗?

任何语言的任何信息或代码都会受到欢迎。

修改 使用circularity measureC=P^2/4πA)或我上面描述的方法,可以在分离时找到三角形和椭圆形。但是当轮廓像这样时: enter image description here

我找不到提取三角形片段的强大方法。如果可以,我会检查平均颜色,并确定它是否是红色标志候选者。

1 个答案:

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