1

我是计算机视觉领域的新手。

我在 EmguCV(OpenCV 的 .NET 包装器)中找到了一些我正在尝试使用的代码示例。

目前我正在研究三角形交通标志识别,我正在使用 cvMatchShapes 函数。

该函数在理想情况下返回“零”,表示形状相同且数量为

如果形状相似,则接近于零。

问题是,在我的情况下,函数返回的结果是不合逻辑的。当函数将三角形与圆形进行比较时,它返回小于数字的数字,这是比较两个三角形后得到的。

这是我使用的功能和图像:

                double ratio = CvInvoke.cvMatchShapes(modelSignTraffic, trafficSign, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);

modelSignTraffic - 是一个模板。就我而言,它是-

在此处输入图像描述

trafficSign - 应该与模板进行比较的形状。

首先比较形状-

在此处输入图像描述

第二个比较形状-

在此处输入图像描述

对于第一个形状,我得到 ratio 0.55 ,对于第二个形状,我得到 ratio 0.61 。

如果有人能解释为什么我会得到如此不合逻辑的结果以及如何解决它,我将不胜感激?

先感谢您。

4

2 回答 2

2

我不明白你为什么认为这个结果不合逻辑。你读过公式CV_CONTOURS_MATCH_I3吗?在这里。我 100% 确信,如果你手动计算这个系数,你会得到相同的结果。

顺便说一句,你必须为轮廓(形状)而不是图像计算这个系数。所以首先检测形状,然后再使用MatchShapes

更新:

你的解决方案是错误的。您必须先对红色进行分割,然后在此使用后findContours才能检测红色形状。

于 2012-08-25T17:42:44.340 回答
0

在Resize扩展的帮助下将图像缩放到相同大小后,我能够从cvMatchShapes函数中获得更好的结果。

不幸的是,这个解决方案并不理想,因为当使用这种方法检查其他选项时,我并不总是得到想要的结果。

这是代码:

     Image<Bgr, Byte> triangleModel = new Image<Bgr, Byte>("TriangleTamplate.jpg")
                        .Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
     Image<Gray, Byte> grayModel = triangleModel.Convert<Gray, Byte>();
     Image<Gray, Byte> cannyModel = grayModel .Canny(new Gray(100), new Gray(160));


     Image<Bgr, Byte> comparedImage = new Image<Bgr,Byte>("ImageToCompare.jpg")
                         .Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
     Image<Gray, Byte> grayImage = tempImage.Convert<Gray, Byte>();
     Image<Gray, Byte> cannyImage = grayImage.Canny(new Gray(100),new Gray(160));

     double eRatio = CvInvoke.cvMatchShapes(cannyModel.Ptr, cannyImage,Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);

对于三角形比率是 0.0320

对于圆比是 0.0829

于 2012-09-06T22:47:42.397 回答