Opencv 检测图像中的三角形、椭圆和矩形

Opencv 检测图像中的三角形、椭圆和矩形,opencv,detection,Opencv,Detection,我正试图探测交通标志的区域。使用OpenCV,我的方法如下: 彩色图像: 使用“消除照明差异”选项: 均衡直方图: 和二值化(Cv2.Threshold(blob,blob,127255,ThresholdTypes.binarynv): 使用并使用blob作为掩码迭代每个blob。如果它是红色,则可能是红色符号 然后,使用该工具获取该斑点的轮廓 使用简化轮廓并检查每个轮廓的点: 如果有3个点,则三角形形状是可接受的-->三角形符号的候选形状 如果有4个点,则形状是可接受的-->候选形

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

彩色图像:

使用“消除照明差异”选项:

均衡直方图:

和二值化
(Cv2.Threshold(blob,blob,127255,ThresholdTypes.binarynv)

使用并使用blob作为掩码迭代每个blob。如果它是红色,则可能是红色符号

然后,使用该工具获取该斑点的轮廓

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

  • 如果有3个点,则三角形形状是可接受的-->三角形符号的候选形状
  • 如果有4个点,则形状是可接受的-->候选形状
  • 如果超过4个点,则BBox尺寸是可接受的,并且大多数点位于拟合的椭圆上()-->候选者
这种方法适用于二值图像中分离的斑点,如我的示例中的圆形100km符号。但是,如果与外部对象有连接,如二值图像中的三角形左下部分,则失败

因为,这个斑点的平均值远不是红色

但是,在某些情况下使用帮助会使其他许多图像的效果更差

使用不同的阈值进行二值化也适用于某些情况,但在许多情况下会失败;例如侵蚀

使用的速度非常慢,我无法在使用参数时获得好的效果

我尝试过使用
匹配形状
,但没有得到好的结果

有谁能告诉我实现我想要的目标的另一种方法(用合理的计算时间)

任何语言的任何信息或代码都是wellcome

编辑: 使用()或我上面描述的方法,当三角形和椭圆分开时,可以找到它们。但是当轮廓像这样时,例如:


我找不到一个可靠的方法来提取三角形块。如果可以,我会检查平均颜色,并确定它是否为红色标志候选。对不起,我没有资格发表评论,但你不能使用红色吗

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()
导入通用
myshow=common.myshow
img=cv2.imread(“ms0QB.png”)
灰色=np.零(图像形状[:2],np.uint8)

你试过形态开放(侵蚀+扩张)吗而不仅仅是腐蚀?它可以帮助去除噪声连接,同时保留原来坚固的连接部件。机器学习是否适用于该任务?如果您拥有一些交通标志学习基础,您可以训练一个Haar级联或神经网络来为您进行标志检测。如果仍然接近从图像处理方面来看,您可以看看这篇文章:。它提供了一个快速而健壮的Hough transofrm,但不幸的是,我没有看到它在OpenCV或任何地方实现。是的,训练样本最好只包含所需的检测目标(背景或其他方面的一些小错误)。目标应该从不同的视角呈现。除非我错得很厉害,否则这将涉及到任何分类器和描述性特征的选择。对不起,我从另一个角度理解了你的意思。这是一个值得注意的问题,但是,我恐怕无法从零开始判断问题所在。尽管我可以建议照明规范化(上述TanTriggs预处理)对于训练集和测试集。也许这可以简化分类器的任务。这是一个好主意。实际上,我的应用程序有一些迭代来查找ROI。对于HSV,我使用minH=169;maxH=7;minS=0;maxS=40;minV=230;maxV=30。另一个迭代基于实验室颜色,另外两个迭代基于Hasan Fleyeh关于segmentat的论文离子。我检查这些在某些情况下(雾、日落照明)可能不成功。我还尝试寻找其他颜色标志,包括黑白标志。我正在搜索是否可以在一个文件中使用TanTriggs预处理解决所有颜色问题;并提高性能。