我正在开发一个程序,我应该检测相同类型的形状,并用不同的颜色为每种类型着色。
我正在使用cv2.findCountours
然后cv2.approxPolyDP
来检测每个形状。
程序检测到任何形状有8条边作为圆形,所以我决定添加一些检查 - 我正在使用cv2.contourArea
检查当前轮廓的区域,我也检查{的区域{1}}当前轮廓。
如果他们是平等的,我们就有一个圈子。
cv2.minEnclosingCircle(cnt)
我打印了每个区域,看到结果不同 - 即使形状明显是圆形。
例如,对于相同的形状,我为minEnclosingCircle区域获得了628.254637106,为了contourArea获得了569。 另一个例子:minEnclosingCircle区域为2220.55512328,contourArea为2032.0。
如何正确计算这个区域?
我将不胜感激任何帮助!
我使用的图像:
和检测到的形状:
答案 0 :(得分:2)
我认为使用Hu时刻检测圈子会更好:
https://en.wikipedia.org/wiki/Image_moment
可以使用opencv:
计算它们http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html
Circle有明确定义的时刻:
https://users.cs.cf.ac.uk/Paul.Rosin/resources/papers/Hu-circularity-PR-postprint.pdf(第4页)
以这种方式定义的圆形可用于识别圆圈。
编辑:python中的Hu Moments教程:
https://www.pyimagesearch.com/2014/10/27/opencv-shape-descriptor-hu-moments-example/
关于stackoverflow的类似问题:
答案 1 :(得分:1)
而不是比较区域,你应该检查计数器的凸性
elif len(approx)==8:
k=cv2.isContourConvex(approx)
if k:
#now you select a circle
答案 2 :(得分:0)
您可以尝试使用属于每个blob的一些属性。偏心,坚固,紧凑......等特征可以帮助你区分形状。
您可以在下面的链接中找到一些信息(但在C ++中)以提供一些提示