树莓派(6)模板匹配跟踪

https://blog.csdn.net/wc781708249/article/details/78518447

 1抠图

import cv2
import numpy as np

if __name__ == '__main__' :

    # Read image
    im = cv2.imread("image.jpg")

    # Select ROI
    r = cv2.selectROI(im)

    # Crop image
    imCrop = im[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]

    # Display cropped image
    cv2.imshow("Image", imCrop)
    cv2.waitKey(0)

 

从左上角拖动矩形到右下角

如果你像我一样,你会喜欢把一个矩形从左上角拖到右下角,而不是从中心拖动。 那么,我们可以很容易地解决这个问题,用下面一行代替突出显示的行。

 fromCenter = False

    r = cv2.selectROI(im, fromCenter)

不想显示十字线?

现在,假设你不喜欢十字准线,并希望看到没有它的矩形。 您可以修改代码以不显示十字线。

showCrosshair = False
fromCenter = False
r = cv2.selectROI("Image", im, fromCenter, showCrosshair)

 

2 保存

import cv2
 
cv2.namedWindow("Image") #创建窗口
 
img = cv2.imread('ver.jpg')
cv2.imshow("Image",img)
 
cv2.imwrite('test.jpg',img,[int(cv2.IMWRITE_JPEG_QUALITY),70])
 
cv2.waitKey(0)
cv2.destroyWindow("Image")  #关闭窗口
  

  

 3 匹配

单对象匹配

  • 模板匹配也是应用卷积来实现的:假设原图大小为W×H,模板图大小为w×h,那么生成图大小是(W-w+1)×(H-h+1),生成图中的每个像素值表示原图与模板的匹配程度。
  • 模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法:
    • 平方差匹配 CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0
    • 归一化平方差匹配 CV_TM_SQDIFF_NORMED
    • 相关匹配 CV_TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
    • 归一化相关匹配CV_TM_CCORR_NORMED
    • 相关系数匹配 CV_TM_CCOEFF:用两者的相关系数匹配,1表示完美的匹配,-1表示最差的匹配
    • 归一化相关系数匹配 CV_TM_CCOEFF_NORMED

https://zhuanlan.zhihu.com/p/62643151

import cv2
import numpy as np
from matplotlib import pyplot as plt


# 1.模板匹配
img = cv2.imread('dog.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
template = cv2.imread('face_dog.jpg', 0)
h, w = template.shape[:2]  # rows->h, cols->w

# 6种匹配方法
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for meth in methods:
    img2 = img.copy()

    # 匹配方法的真值
    method = eval(meth)
    res = cv2.matchTemplate(img_gray, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv2.circle(res, top_left, 10, 0, 2)
    # 画矩形|
    cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)

  

多对象匹配

✔️ 单个匹配是找最大匹配的点,所以只能匹配一次。

✔️ 对于多对象匹配,我们需要设定一个匹配阈值来匹配多次。

img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.jpg', 0)
h, w = template.shape[:2]

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
# 取匹配程度大于%80的坐标
loc = np.where(res >= threshold)

for pt in zip(*loc[::-1]):  # *号表示可选参数
    bottom_right = (pt[0] + w, pt[1] + h)
    cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)
cv2.imshow('img_rgb', img_rgb)
cv2.waitKey(0)

  

猜你喜欢

转载自www.cnblogs.com/kekeoutlook/p/12399286.html