opencv模板匹配来识别图中的物体

本次识别过程中,由于模板的大小识别的物体不精确,导致识别误差较大。

为了避免由于模板导致的误差,本次读取的模板后对模板进行一定比例的缩放,在去匹配模板,大大提高了识别的准确率。

模板匹配实现过程:

1.准备模板图片以及所要匹配的图片:

2.缩放模板。

3.模板匹配。

4.设置阈值(六种模板匹配算法的阈值有所偏差,其中'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'的阈值越小代表月相似,而'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF'的阈值越大代表越相似)

5.若阈值符合设置标准,绘制匹配物体的图片。

6.显示绘制好的图片。

7.若阈值未达到要求,改变模板大小重新匹配,重复以上2-7步,知道绘制出完成的图片。

import cv2
import numpy as np
# 读取图片,彩色模式
img_color = cv2.imread('523.jpg',cv2.IMREAD_COLOR)
# 读取图片,灰度模式
img_gray = cv2.imread('523.jpg',cv2.IMREAD_GRAYSCALE)
# 读取人脸模板图片,灰度模式
template = cv2.imread('555.png',cv2.IMREAD_GRAYSCALE)
print(template.shape)
mylist = np.random.uniform(0.1,2,50)
for i in mylist:
    w, h = template.shape[::-1]
    print(w,h,"666666666")
    ww = int(w*i)
    hh = int(h*i)
    template1 = cv2.resize(template,(ww,hh))
    w, h = template1.shape[::-1]
    print(w,h,"7777")
    methods = ['cv2.TM_CCOEFF_NORMED']
    # 遍历匹配方法
    for meth in methods:
        # 拷贝图片
        img_color2 = img_color.copy()
        img_gray2 = img_gray.copy()
        # 把字符串转换成代码
        method = eval(meth)
        # 模板匹配
        res = cv2.matchTemplate(img_gray2,template1,method)
        # 获取匹配结果的最大、最小值,及其位置
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        print(min_val )
        print(max_val)
        print(min_loc)
        print(max_loc)
        if max_val > 0.9:
            print("ok")
        # TM_SQDIFF 和 TM_SQDIFF_NORMED匹配方法:值越小,越相似
            if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
                # 取最小值位置,作为矩形框左上角位置
                top_left = min_loc
                print("******")
            else:
                # 取最大值位置,作为矩形框左上角位置
                top_left = max_loc
                print("-------")
            # 根据模板尺寸计算出:矩形框右下角位置
            bottom_right = (top_left[0] + w, top_left[1] + h)
            # 画矩形框
            cv2.rectangle(img_color2,top_left, bottom_right, 255, 2)
            # 显示画好矩形框的图片
            cv2.namedWindow(meth, cv2.WINDOW_AUTOSIZE)
            cv2.imshow(meth,img_color2)
            # 等待退出键
            cv2.waitKey(0)
        else:
            print(i)
            pass
        # 销毁显示窗口
        cv2.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_15256443/article/details/85099011
今日推荐