我是一个制作iOS应用程序的应用程序,它将在较大的图像中找到较小(类似)图像的实例。例如,类似于:
我们正在中搜索的图像
我们正在搜索的图像
匹配图像
要考虑的主要问题是,smallImage大小将与bigImage中的目标大小相匹配,但对象在bigImage中可能稍微模糊(因为它们并不总是相同的)。而且,我正在处理的图像比我这里的例子要小一些,我试图匹配的图像( smallImage)在32×32像素到80×80像素之间,而大图像大约是1000 x 600像素。除了潜在的轻微模糊之外,smallImage将在各个方面(大小、颜色、旋转等)匹配大图像中的对象。
我已经尝试了几种使用OpenCV的方法。特征匹配似乎不够准确,给了我数百个毫无意义的结果,所以我尝试模板匹配。我的代码看起来像是:
代码语言:javascript复制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) {
// matchbigImage是我们试图找到目标的大图像。smallImage是我们在bigImage中寻找的图像tolerance是匹配的公差(0到1之间)。这确实有效,但有几个问题。
我最初尝试使用我试图匹配的图像对象的完整图像(即整个冰箱的图像),但我发现这是非常不准确的,当容忍度很高时,它什么也找不到,当容忍度较低时,它发现了许多不正确的匹配。
接下来,我使用图像的较小部分进行了测试,例如:
这增加了在大图像中找到目标的准确性,同时也导致了很多不正确的匹配。
我尝试过从matchTemplate获得这里的所有可用方法,它们都返回了大量的假匹配,除了返回较少匹配的CV_TM_CCOEFF_NORMED (但也大多为假匹配)。
如何在iOS?中使用OpenCV提高图像匹配的精度
编辑:我在googled上搜索了负载,最有帮助的文章是:
模式匹配-在第二幅图像中找到参考对象OpenCV中SURF模式识别精度的测量模板匹配可口可乐形状识别算法的改进我找不到任何关于如何提高准确度的建议