Cha*_*ran 4 opencv image image-processing template-matching opencv3.0
我搜索了很多以找到下面提到的方法的阈值。
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', cv2.TM_SQDIFF_NORMED']
Run Code Online (Sandbox Code Playgroud)
我也试图自己弄清楚它们,但我只能找到最大值为 1.0 的 3 种方法的阈值。其他方法的值在 10^5 的范围内。我想知道这些方法的界限。
有人可以指出我正确的方向。我的议程是遍历模板匹配的所有方法并获得最佳结果。我浏览了文档和源代码,但没有运气。
这些是我得到的值,我可以理解 *NORMED 方法的值是 0-1。
cv2.TM_CCOEFF -- 25349100.0
cv2.TM_CCOEFF_NORMED -- 0.31208357214927673
cv2.TM_CCORR -- 616707328.0
cv2.TM_CCORR_NORMED -- 0.9031367897987366
cv2.TM_SQDIFF -- 405656000.0
cv2.TM_SQDIFF_NORMED -- 0.737377941608429
Run Code Online (Sandbox Code Playgroud)
如opencv 文档中 所述,matchTemplate
结果是每个像素的差异总和(因方法而异),因此对于非标准化方法 - 阈值会随模板大小而变化。
考虑到CV_8UC1
图像像素之间的最大差异为 255,您可以查看每种方法的公式并计算模板类型的阈值。
因此,假设您有 2 张灰度图像,最小的一张是10x10。
在这种情况下,TM_SQDIFF 的最小距离将是10x10x0^2=0(图像相同),最大距离将是10x10x255^2= 6502500(一个图像是全黑的,另一个是白色的),这会导致[0, 6502500]边界。
当然,对于未定义的尺寸 [A, B],可以计算出该值。
对于 TM_CCORR,它将是AxBxmax(T(x',y')I(x+x',y+y')) = 65025AB
您可以继续计算剩余的方法,请记住,如果您有不同于 CV_8UC 的图像类型(如 32FC 或 32SC) - 您需要用相应的值替换 255 (max(float) max(int32))