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