【发布时间】:2014-09-08 02:14:57
【问题描述】:
我正在制作一个 iOS 应用程序,它将在较大的图像中找到较小(相似)图像的实例。例如,类似:
我们在里面搜索的图片
我们正在搜索的图片
匹配的图片
要考虑的主要事项是,smallImage 的大小将与 bigImage 中目标的大小相匹配,但对象在 bigImage 中可能会稍微模糊(因为它们并不总是相同)。此外,我正在处理的图像比我这里的示例小很多,我试图匹配的图像(smallImage)在 32 x 32 像素和 80 x 80 像素之间,大图像大约 1000 x 600像素。除了可能被稍微遮挡之外,smallImage 将在各个方面(大小、颜色、旋转等)匹配大图像中的对象。
我已经尝试了一些使用 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 之间)
这确实有效,但存在一些问题。
我最初尝试使用我要匹配的图像对象的完整图像(即整个冰箱的图像),但我发现它非常不准确,当容差很高时它什么也没找到,并且当它很低时,它会发现许多不正确的匹配项。
接下来我使用图像的较小部分进行了测试,例如:
这提高了在大图像中找到目标的准确性,但也会导致很多不正确的匹配。
我已经尝试了here 中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
我找不到任何关于如何提高准确性的建议
【问题讨论】:
-
您阅读过that question 及其答案吗?问题似乎与您很接近。
-
@AldurDisciple 我有,答案建议使用特征匹配而不是模板匹配,我已经尝试过,据我所知,最适合旋转/倾斜/缩放匹配图像的情况。我的特征匹配实现有效,但给出了大量错误匹配,并且没有足够的正确匹配能够自信地识别匹配的图像
-
您正在搜索的对象是否会在图像中旋转?
-
@BharatSingh 不,模板图像正是搜索图像中的显示方式,没有任何旋转/倾斜/颜色变化/扭曲(除了可能被部分遮挡,但不超过可能是 20%)
-
尝试在模板中添加一个遮罩,这样统一的白色背景就被遮住了,从而不会干扰分数。你可能需要在那里留一个小边界,这样冰箱的边缘就不会被遮住。
标签: ios objective-c opencv image-processing