我正在开发一个iOS应用程序,它可以在大图片中查找小(相似)图像的实例。例如:
The image we are searching inside
The image we are searching for
The matched image
需要考虑的主要问题是,
我尝试使用 OpenCV 进行了几种方法。特征匹配似乎不够准确,并给我带来了数百个无意义的结果,因此我正在尝试模板匹配。我的代码看起来像:
![The image we are searching inside](https://istack.dev59.com/QpZ7Y.webp)
![enter image description here](https://istack.dev59.com/LS1ji.webp)
![enter image description here](https://istack.dev59.com/1hWHh.webp)
smallImage
的大小将与 bigImage
中的目标匹配,但在 bigImage 中可能会略微遮挡对象(因此它们不总是完全相同)。另外,我处理的图像比这里的示例要小得多,我尝试匹配的图像(smallImage)大小在 32 x 32 像素和 80 x 80 像素之间,而大图像约为 1000 x 600 像素。除了可能会被遮挡之外,smallImage 在大小、颜色、旋转等方面都与 big image 中的对象匹配。我尝试使用 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中要查找的图像tolerance
是匹配容差(介于0和1之间)
这个方法可以工作,但存在一些问题。
我最初尝试使用整个对象图像的完整图像(即整个冰箱的图像),但我发现它非常不准确。当容差高时,它什么也没有找到,当容差低时,它会找到许多不正确的匹配项。
接下来,我尝试使用图像的较小部分,例如:
这提高了在bigImage中查找目标的准确性,但也导致了很多错误的匹配。
我已经尝试了这里所有可用的matchTemplate
方法,它们都返回大量的错误匹配,除了CV_TM_CCOEFF_NORMED
,它返回更少的匹配(但大多数也是错误的匹配)
如何在iOS中使用OpenCV提高图像匹配的准确性?
编辑: 我已经谷歌了很多,最有用的帖子是:
- Pattern Matching - Find reference object in second image
- Measure of accuracy in pattern recognition using SURF in OpenCV
- Template Matching
- Algorithm improvement for Coca-Cola can shape recognition
我找不到任何关于如何提高准确性的建议。