我想使用 OpenCV 和 Python 编写一个程序来检查较小的图像是否在较大的图像中。
我知道大图里面是什么,但是小图可能每次都变,所以避免误报对我来说很重要。
我使用 cv2.matchTemplate
和 cv2.TM_CCOEFF_NORMED
模式来检查置信度,如果较小的图像只是完整图像的裁剪版本,那效果很好图片。
但是,如果较小的图像是 1x1 白色像素,则会出现问题。我的大图像中有很多空白,我不希望它匹配。
这是我的代码:
#!/usr/bin/env python
import cv2
def main():
source = cv2.imread('source.png', 0)
template = cv2.imread('template.png', 0)
res = cv2.matchTemplate(source, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
if max_val < 0.9:
print 'Confidence score is less than 0.9, no match found.'
return
print 'Match found!'
if __name__ == '__main__':
main()
我该如何改进?我想会有一种方法来检查匹配是否至少达到一定大小(例如 50x50),这样如果将小图像用作模板,系统就不会中断,但我不确定。
最佳答案
如果图像变小如 1x1,图像的特征就会变得太少。很难正确匹配。
模板匹配大小合适后可以尝试其他匹配算法。
- SURF(或 SIFT)匹配:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html
-SURF 是一种生成图像描述符的算法。它从图像中找到几个特征,并为每个特征制作一个向量。并且您可以使用一些距离计算(例如 L2-Distance)来比较其他图像的特征之间的相似性。
.
-颜色直方图是图像自身的颜色分布。您可以尝试使用它来比较多张图片的相似度。
关于python - 使用 OpenCV 进行模板匹配时如何避免误报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424812/