zoukankan      html  css  js  c++  java
  • 树莓派(6-1)模板匹配跟踪

    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)
    

      

  • 相关阅读:
    poj 3318 Matrix Multiplication 夜
    hdu 4331 Image Recognition 夜
    poj 3277 City Horizon 夜
    poj 3301 Texas Trip 夜
    poj 1151 Atlantis 夜
    poj 3286 How many 0's 夜
    poj 2454 Jersey Politics 夜
    poj 1465 Multiple 夜
    poj 1095 Trees Made to Order 夜
    Null和undefined的区别?
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/12399286.html
Copyright © 2011-2022 走看看