Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing cvMatchShapes返回超出逻辑的结果_Image Processing_Opencv_Computer Vision_Emgucv - Fatal编程技术网

Image processing cvMatchShapes返回超出逻辑的结果

Image processing cvMatchShapes返回超出逻辑的结果,image-processing,opencv,computer-vision,emgucv,Image Processing,Opencv,Computer Vision,Emgucv,我是计算机视觉领域的新手 我在EmguCV(.NET wrapper for OpenCV)中找到了一些代码示例,我正在尝试使用它们 目前我正在研究三角形交通标志识别,并使用cvMatchShapes函数 在理想情况下,函数返回“零”,这意味着形状相同,数字相同 如果形状相似,则接近零 问题是,在我的例子中,函数返回的结果是不合逻辑的。 当函数将三角形和圆进行比较时,它返回的图形小于该图形,得到 在比较了两个三角形之后 以下是我使用的函数和图像: double r

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

我在EmguCV(.NET wrapper for OpenCV)中找到了一些代码示例,我正在尝试使用它们

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

在理想情况下,函数返回“零”,这意味着形状相同,数字相同

如果形状相似,则接近零

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

以下是我使用的函数和图像:

                double ratio = CvInvoke.cvMatchShapes(modelSignTraffic, trafficSign, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);
modelSignTraffic-是一个模板。 就我而言是这样-

交通标志-应与模板进行比较的形状

首先比较形状-

第二比较形状-

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

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


提前谢谢。

我不明白你为什么认为这个结果不合逻辑。您是否阅读了
CV\u等高线\u匹配\u I3
的公式。我100%确信,如果你手工计算这个系数,你会得到同样的结果

顺便说一句,您必须为轮廓(形状)而不是图像计算此系数。因此,首先检测形状,然后使用
匹配形状

更新:


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

cvMatchShapes功能在图像通过Resize扩展缩放到相同大小后,我能够获得更好的结果

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

代码如下:

     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);
Image triangleModel=新图像(“TriangleTamplate.jpg”)
.Resize(200200,Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
Image grayModel=triangleModel.Convert();
图像cannyModel=grayModel.Canny(新灰度(100)、新灰度(160));
Image CompareImage=新图像(“ImageToCompare.jpg”)
.Resize(200200,Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
Image grayImage=tempImage.Convert();
图像cannyImage=grayImage.Canny(新灰度(100)、新灰度(160));
double eRatio=CvInvoke.cvMatchShapes(cannyModel.Ptr、cannyImage、Emgu.CV.CvEnum.CONTOURS\u MATCH\u TYPE.CV\u CONTOURS\u MATCH\u I3,0);
对于三角形,比率为0.0320


对于圆比为0.0829的Astor,我使用canny函数检测图像文件上的形状。Astor,所有形状都在上面。首先,正如我所写的,我使用canny func检测它们,然后使用FindContours方法,最后一步是cvMatchShapes。在你的情况下,你不需要canny。只需做颜色分割和找到轮廓。在此之后,使用匹配形状。你最好读一下交通标志检测的文章。@Michael,你有什么结果吗?是的,我能得到更好的结果。但结果仍然远远不够理想。Image circleleemodel=新图像(“triangle model.jpg”)。调整大小(200200,Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);这里是要比较的形状:Image tempImage=img.Resize(200200,Emgu.CV.CvEnum.INTER.CV\u INTER\u LINEAR);例如,图像之间的标准化。为什么不编辑您的问题并发布答案?请参阅我的答案更新。按颜色分割和使用FindContentours之间有什么关系?用于比较形状的参数必须为灰度。我e、 我知道为了比较这两种形式必须是灰度的。或者我遗漏了什么,请解释一下。因为使用这种技术你可以找到标志的形状(轮廓)。您最好阅读有关TSD的文章。Astor,我按照您的建议实施: