【问题标题】:cvMatchShapes returns me result which is out of logiccvMatchShapes 返回不合逻辑的结果
【发布时间】:2012-09-07 13:50:22
【问题描述】:

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

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

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

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

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

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

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

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

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

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

首先比较形状-

第二个比较形状-

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

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

提前谢谢你。

【问题讨论】:

    标签: image-processing opencv computer-vision emgucv


    【解决方案1】:

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

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

    更新:

    您的解决方案是错误的。您必须先分割红色,然后使用findContours 来检测红色形状。

    【讨论】:

    • Astor,我借助 Canny 功能检测图像文件上的形状。
    • Astor,所有的形状都在上面。首先在我写的时候,我在 canny func 的帮助下检测到它们,然后我使用 FindContours 方法,最后一步是 cvMatchShapes。
    • 您的情况不需要 Canny。只需进行颜色分割并找到轮廓。在此之后使用匹配形状。你最好阅读交通标志检测文章。
    • @Michael 你有结果了吗??
    • 是的,我得到了更好的结果。但结果仍然远非理想。 Image circleleModel = new Image("triangle-model.jpg").Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR, true);这是要比较的形状: Image tempImage = img .Resize(200,200,Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR); IE。图像之间的标准化。
    【解决方案2】:

    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

    【讨论】:

    • 您为什么不编辑您的问题并发布答案?查看我的答案的更新。
    • 颜色分割和使用findContours有什么关系?比较形状的参数必须是灰度的。一世 。 e、我理解为了比较这两种形式必须是灰度的。或者我遗漏了什么,请解释一下。
    • 因为使用这种技术你可以找到标志的形状(轮廓)。您最好阅读有关 TSD 的文章。
    • Astor,我按照你的建议实施了:
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2018-10-10
    • 1970-01-01
    • 2017-04-10
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多