Ios 利用OpenCV匹配模板提高图像匹配精度

Ios 利用OpenCV匹配模板提高图像匹配精度,ios,objective-c,opencv,image-processing,Ios,Objective C,Opencv,Image Processing,我正在制作一个iOS应用程序,它可以在较大的图像中找到较小(类似)图像的实例。例如,类似于: cv::Mat ref = [bigImage CVMat]; cv::Mat tpl = [smallImage CVMat]; cv::Mat gref, gtpl; cv::cvtColor(ref, gref, CV_LOAD_IMAGE_COLOR); cv::cvtColor(tpl, gtpl, CV_LOAD_IMAGE_COLOR); cv::Mat res(ref.rows-tpl.

我正在制作一个iOS应用程序,它可以在较大的图像中找到较小(类似)图像的实例。例如,类似于:

cv::Mat ref = [bigImage CVMat];
cv::Mat tpl = [smallImage CVMat];
cv::Mat gref, gtpl;
cv::cvtColor(ref, gref, CV_LOAD_IMAGE_COLOR);
cv::cvtColor(tpl, gtpl, CV_LOAD_IMAGE_COLOR);
cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
cv::threshold(res, res, [tolerance doubleValue], 1., CV_THRESH_TOZERO);


    double minval, maxval, threshold = [tolerance doubleValue]; 
    cv::Point minloc, maxloc;
    cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

    if (maxval >= threshold) {
       // match
我们正在搜索的图像

我们正在搜索的图像

匹配的图像

主要考虑的是,<代码> SimultIsI/Cuff>大小将匹配<代码> BigIsIs/COD>中的目标大小,但是对象可能在BigI图中略微模糊(因为它们不总是相同的)。另外,我正在处理的图像比我这里的示例要小得多,我试图匹配的图像(小图像)介于32 x 32像素和80 x 80像素之间,而大图像大约为1000 x 600像素。除了可能被轻微遮挡外,小图像将在各个方面(大小、颜色、旋转等)与大图像中的对象匹配

我已经尝试了一些使用OpenCV的方法。特征匹配似乎不够精确,给了我数百个毫无意义的结果,所以我正在尝试模板匹配。我的代码看起来像:

cv::Mat ref = [bigImage CVMat];
cv::Mat tpl = [smallImage CVMat];
cv::Mat gref, gtpl;
cv::cvtColor(ref, gref, CV_LOAD_IMAGE_COLOR);
cv::cvtColor(tpl, gtpl, CV_LOAD_IMAGE_COLOR);
cv::Mat res(ref.rows-tpl.rows+1, ref.cols-tpl.cols+1, CV_32FC1);
cv::matchTemplate(gref, gtpl, res, CV_TM_CCOEFF_NORMED);
cv::threshold(res, res, [tolerance doubleValue], 1., CV_THRESH_TOZERO);


    double minval, maxval, threshold = [tolerance doubleValue]; 
    cv::Point minloc, maxloc;
    cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);

    if (maxval >= threshold) {
       // match
  • bigImage
    是我们试图在其中找到目标的大图像

  • smallImage
    是我们在bigImage中寻找的图像

  • 公差
    是匹配的公差(介于0和1之间)

这确实有效,但存在一些问题

我最初尝试使用我试图匹配的图像对象的完整图像(即,整个冰箱的图像),但我发现它非常不准确,当公差较高时,它找不到任何匹配,当公差较低时,它发现许多不正确的匹配

接下来,我使用图像的较小部分进行了测试,例如:

这提高了在大图像中查找目标的准确性,但也会导致许多不正确的匹配

我尝试了所有可用的
matchTemplate
方法,它们都返回大量错误匹配,除了
CV\u TM\u CCOEFF\u NORMED
返回的匹配较少(但也大多是错误匹配)

如何在iOS中使用OpenCV提高图像匹配的准确性?

编辑: 我在谷歌上搜索了很多内容,最有用的帖子是:


如果您搜索的图像中的模板图像没有旋转(或在某种投影失真下),我找不到任何关于如何提高精度的建议-由于保留了所有几何和纹理属性(假设遮挡不是很大),所以剩下的唯一变量是比例。因此,在原始模板的多个尺度上运行模板匹配算法,然后在所有尺度上获得最大的规范化响应,应该会得到完美的匹配。一个问题可能是,对于一个完美的匹配,猜测(优化)精确的比例在计算上会很昂贵,或者涉及一些启发式。一种启发式方法是,在3个不同的尺度(1、2、4)下运行模板匹配,假设您在特定尺度下获得最佳响应(比如2),在(1.5、2.25、3)之间进行尝试,然后继续优化。当然,这是一种启发式方法,可能在实践中效果很好,但在理论上不是一种找到正确尺度的正确方法,并且可能陷入局部极小值


基于特征的方法对此类图像不起作用的原因是,它们依赖于纹理/尖锐的梯度,而这些在您所展示的同质模板图像中并不十分明显

你读过它的答案吗?这个问题似乎和你的问题很接近。@AldurDisciple我有,答案建议使用功能匹配而不是模板匹配,我已经尝试过了,据我所知,在匹配图像旋转/倾斜/缩放的情况下效果最好。我的特征匹配实现成功了,但出现了大量错误匹配,并且没有足够的正确匹配能够自信地识别匹配的图像您正在搜索的对象会在图像中旋转吗?@BharatSingh不,模板图像正是搜索图像中显示的方式,没有任何类型的旋转/倾斜/颜色变化/失真(除了可能被部分遮挡,但不超过20%)尝试向模板添加遮罩,以便遮住均匀的白色背景,从而不会干扰分数。你可能需要在那里留下一个小的边界,这样冰箱的边缘就不会被遮住。谢谢你的回答。模板图像的大小与搜索图像中显示的大小完全相同。+1由于功能匹配不起作用,我认为功能匹配更适用于“有机”图像,如照片。通过各种比例运行,最终对我有效,谢谢。