模板匹配源码

import cv2 
import numpy as np
from numpy import * 
import aircv as ac

#在图像上下左右取额定大小的区域,并计算每个区域的sobel算子矩阵

#定义模板此尺寸
template_size = 60

def getROISobel(src, index_x , index_y):
    global template_size
    xBegin = (src.shape[0]/4) * (2*index_x + 1) - (template_size/2)
    yBegin = (src.shape[1]/4) * (2*index_y + 1) - (template_size/2)
    xBegin = int(xBegin)
    yBegin = int(yBegin)
    print(src[xBegin : (xBegin + template_size), yBegin : (yBegin + template_size)].shape)
    after_translation_x = cv2.Sobel(src[xBegin : xBegin+template_size, yBegin : yBegin + template_size] ,cv2.CV_16S, 1, 0)
    after_translation_y = cv2.Sobel(src[xBegin : xBegin+template_size, yBegin : yBegin + template_size] ,cv2.CV_16S, 0, 1)
    after_translation_x_abs = np.fabs(after_translation_x)
    after_translation_y_abs = np.fabs(after_translation_y)
    after_translation_magnitude = cv2.addWeighted(after_translation_x_abs,0.5,after_translation_x_abs,0.5,0) 
    return after_translation_magnitude

#获取每一份sobel区域矩阵的sum值
def sum(src):
    sum = 0
    for i in range(0, src.shape[0]):
        for j in range(0, src.shape[1]):
            sum += src[i][j]
    return sum

#返回所选模板的参数
def get_position_index(region_1, region_2, region_3, region_4):
    index = array([0,0])    
    if(sum(region_1) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        index = array([0,0])    
    elif (sum(region_2) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        index = array([0,1]) 
    elif (sum(region_3) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        index = array([1,0]) 
    else:
        index = array([1,1]) 

    return index

#找到图像与模板匹配的位置坐标
def findposition(img, position_index):
    imsrc = ac.imread('D:\\python_opencv\\source_image\\1122\\2\\1.jpg')
    imtemplate = imsrc[int((imsrc.shape[0]/4) * (2*position_index[0] + 1) - (template_size/2)) : int((imsrc.shape[0]/4) * (2*position_index[0] + 1) + (template_size/2)), int((imsrc.shape[1]/4) * (2*position_index[1] + 1) - (template_size/2)) : int((imsrc.shape[1]/4) * (2*position_index[1] + 1) + (template_size/2))] #第一个参数代表y方向,第二个参数代表x方向
    imsrc = img
    # find the match position
    #print("imsrc", imsrc)
    pos = ac.find_template(imsrc, imtemplate,threshold=0.2)
    #print("pos", pos)
    center_pos = pos['result']
    return center_pos

#画图
def draw_rectangle(img, pos_1, pos_4, color, line_width):
    cv2.rectangle(img, pos_1, pos_4, color, line_width)
    cv2.imshow('objDetect', imsrc) 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def translate(img, x, y):
    H = np.float32([[1,0,x],[0,1,y]])
    rows,cols = img.shape[:2]
    res = cv2.warpAffine(img,H,(cols,rows)) #需要图像、变换矩阵、变换后的大小
    return res


def add(a,b):
        # 迭代输出行
    result = np.zeros((640,480))
    for i in range(len(a)):
       # 迭代输出列
        for j in range(len(a[0])):
            result[i][j] = a[i][j] + b[i][j]
    return result

def typeconvert(a):
    for i in range(len(a)):
       # 迭代输出列
        for j in range(len(a[0])):
            a[i][j] = a[i][j] * (256)
    return a

def f(x):
    return np.float(x)

def g(x):
    return np.int(x)

if __name__ == "__main__":
    img = cv2.imread("D:\\python_opencv\\source_image\\1123\\1\\1.jpg",0)
    region_1 = getROISobel(img, 0, 0)
    region_2 = getROISobel(img, 0, 1)
    region_3 = getROISobel(img, 1, 0)
    region_4 = getROISobel(img, 1, 1)
    print(sum(region_1))
    print(sum(region_2))
    print(sum(region_3))
    print(sum(region_4))
    position_index = get_position_index(region_1, region_2, region_3, region_4)
    print(position_index)

    imsrc_1 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\1.jpg')
    imsrc_2 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\2.jpg')
    imsrc_3 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\3.jpg')
    imsrc_4 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\4.jpg')
    imsrc_5 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\5.jpg')
    imsrc_6 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\6.jpg')
    imsrc_7 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\7.jpg')
    imsrc_8 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\8.jpg')
    imsrc_9 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\9.jpg')
    imsrc_10 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\10.jpg')

    position_1 = findposition(imsrc_1, position_index)
    position_2 = findposition(imsrc_2, position_index)
    position_3 = findposition(imsrc_3, position_index)
    position_4 = findposition(imsrc_4, position_index)
    position_5 = findposition(imsrc_5, position_index)
    position_6 = findposition(imsrc_6, position_index)
    position_7 = findposition(imsrc_7, position_index)
    position_8 = findposition(imsrc_8, position_index)
    position_9 = findposition(imsrc_9, position_index)
    position_10 = findposition(imsrc_10, position_index)


    print("position_1[0]", position_1[0])
    print("position_1[1]", position_1[1])
    print("position_2[0]", position_2[0])
    print("position_2[1]", position_2[1])
    print("position_3[0]", position_3[0])
    print("position_3[1]", position_3[1])
    print("position_4[0]", position_4[0])
    print("position_4[1]", position_4[1])
    print(position_1[0] - position_2[0])
    print(position_1[1] - position_2[1])
    print(position_1[0] - position_3[0])
    print(position_1[1] - position_3[1])
    print(position_1[0] - position_4[0])
    print(position_1[1] - position_4[1])
    print(position_1[0] - position_5[0])
    print(position_1[1] - position_5[1])
    print(position_1[0] - position_6[0])
    print(position_1[1] - position_6[1])
    print(position_1[0] - position_7[0])
    print(position_1[1] - position_7[1])
    print(position_1[0] - position_8[0])
    print(position_1[1] - position_8[1])
    print(position_1[0] - position_9[0])
    print(position_1[1] - position_9[1])
    print(position_1[0] - position_10[0])
    print(position_1[1] - position_10[1])


    imsrc_1 = translate(imsrc_1, position_1[0] - position_1[0], position_1[1] - position_1[1])
    imsrc_2 = translate(imsrc_2, position_1[0] - position_2[0], position_1[1] - position_2[1])

    imsrc_3 = translate(imsrc_3, position_1[0] - position_3[0], position_1[1] - position_3[1])
    imsrc_4 = translate(imsrc_4, position_1[0] - position_4[0], position_1[1] - position_4[1])
    imsrc_5 = translate(imsrc_5, position_1[0] - position_5[0], position_1[1] - position_5[1])

    imsrc_6 = translate(imsrc_6, position_1[0] - position_6[0], position_1[1] - position_6[1])

    imsrc_7 = translate(imsrc_7, position_1[0] - position_7[0], position_1[1] - position_7[1])
    imsrc_8 = translate(imsrc_8, position_1[0] - position_8[0], position_1[1] - position_8[1])
    imsrc_9 = translate(imsrc_9, position_1[0] - position_9[0], position_1[1] - position_9[1])
    imsrc_10 = translate(imsrc_10, position_1[0] - position_10[0], position_1[1] - position_10[1])


    '''
    imsrc_8 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\8.jpg')
    imsrc_9 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\9.jpg')    
    imsrc_10 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\10.jpg')
    '''
    #imsrc_sum = add(imsrc_1, imsrc_2, imsrc_3, imsrc_4, imsrc_5, imsrc_6, imsrc_7)
    print(imsrc_1.shape)
    f2 = np.vectorize(f)#让函数矩阵化,解决只能一对一强制性变换这一要求
    imsrc_1 = f2(imsrc_1)
    imsrc_2 = f2(imsrc_2)
    #imsrc_sum = imsrc_1 + imsrc_2 + imsrc_3 + imsrc_4 + imsrc_5 + imsrc_6 + imsrc_7
    #imsrc_average = imsrc_sum/7

    imsrc_sum = imsrc_1 + imsrc_2 + imsrc_3 + imsrc_4 + imsrc_5 + imsrc_6 + imsrc_7 + imsrc_8 + imsrc_9 + imsrc_10
    imsrc_average = imsrc_sum/10
    #imsrc_sum = add(imsrc_1, imsrc_2)


    g2 = np.vectorize(g)#让函数矩阵化,解决只能一对一强制性变换这一要求
    #imsrc_average = g2(imsrc_average)
    #imsrc_average = np.unit8(imsrc_average)
    #print(g2(imsrc_average))
    cv2.imshow('merge', typeconvert(g2(imsrc_average)))         
    cv2.waitKey(0)
    cv2.destroyAllWindows()

second_max

import cv2 
import numpy as np
from numpy import * 
import aircv as ac

#在图像上下左右取额定大小的区域,并计算每个区域的sobel算子矩阵

#定义模板此尺寸
template_size = 80

def getROISobel(src, index_x , index_y):
    global template_size
    xBegin = (src.shape[0]/4) * (2*index_x + 1) - (template_size/2)
    yBegin = (src.shape[1]/4) * (2*index_y + 1) - (template_size/2)
    xBegin = int(xBegin)
    yBegin = int(yBegin)
    print(src[xBegin : (xBegin + template_size), yBegin : (yBegin + template_size)].shape)
    after_translation_x = cv2.Sobel(src[xBegin : xBegin+template_size, yBegin : yBegin + template_size] ,cv2.CV_16S, 1, 0)
    after_translation_y = cv2.Sobel(src[xBegin : xBegin+template_size, yBegin : yBegin + template_size] ,cv2.CV_16S, 0, 1)
    after_translation_x_abs = np.fabs(after_translation_x)
    after_translation_y_abs = np.fabs(after_translation_y)
    after_translation_magnitude = cv2.addWeighted(after_translation_x_abs,0.5,after_translation_x_abs,0.5,0) 
    return after_translation_magnitude

#获取每一份sobel区域矩阵的sum值
def sum(src):
    sum = 0
    for i in range(0, src.shape[0]):
        for j in range(0, src.shape[1]):
            sum += src[i][j]
    return sum

#返回所选模板的参数
def get_position_index(region_1, region_2, region_3, region_4):
    index = array([0,0])    
    if(sum(region_1) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        if(sum(region_2) == max(sum(region_2), sum(region_3), sum(region_4))):
            index = array([0,1])
        elif(sum(region_3) == max(sum(region_2), sum(region_3), sum(region_4))):
            index = array([1,0])
        else:
            index = array([1,1])
    elif (sum(region_2) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        if(sum(region_1) == max(sum(region_1), sum(region_3), sum(region_4))):
            index = array([0,0])
        if(sum(region_3) == max(sum(region_1), sum(region_3), sum(region_4))):
            index = array([1,0])
        else:
            index = array([1,1]) 
    elif (sum(region_3) == max(sum(region_1), sum(region_2), sum(region_3), sum(region_4))):
        if(sum(region_1) == max(sum(region_1), sum(region_2), sum(region_4))):
            index = array([0,0])
        if(sum(region_2) == max(sum(region_1), sum(region_2), sum(region_4))):
            index = array([0,1])
        else:
            index = array([1,1]) 
    else:
        if(sum(region_1) == max(sum(region_1), sum(region_2), sum(region_3))):
            index = array([0,0])
        if(sum(region_2) == max(sum(region_1), sum(region_2), sum(region_3))):
            index = array([0,1])
        else:
            index = array([1,0]) 

    return index

#找到图像与模板匹配的位置坐标
def findposition(img, position_index):
    imsrc = ac.imread('D:\\python_opencv\\source_image\\1123\\1\\1.jpg')
    imtemplate = imsrc[int((imsrc.shape[0]/4) * (2*position_index[0] + 1) - (template_size/2)) : int((imsrc.shape[0]/4) * (2*position_index[0] + 1) + (template_size/2)), int((imsrc.shape[1]/4) * (2*position_index[1] + 1) - (template_size/2)) : int((imsrc.shape[1]/4) * (2*position_index[1] + 1) + (template_size/2))] #第一个参数代表y方向,第二个参数代表x方向
    imsrc = img
    # find the match position
    #print("imsrc", imsrc)
    pos = ac.find_template(imsrc, imtemplate,threshold=0.2)
    #print("pos", pos)
    center_pos = pos['result']
    return center_pos

#画图
def draw_rectangle(img, pos_1, pos_4, color, line_width):
    cv2.rectangle(img, pos_1, pos_4, color, line_width)
    cv2.imshow('objDetect', imsrc) 
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def translate(img, x, y):
    H = np.float32([[1,0,x],[0,1,y]])
    rows,cols = img.shape[:2]
    res = cv2.warpAffine(img,H,(cols,rows)) #需要图像、变换矩阵、变换后的大小
    return res


def add(a,b):
        # 迭代输出行
    result = np.zeros((640,480))
    for i in range(len(a)):
       # 迭代输出列
        for j in range(len(a[0])):
            result[i][j] = a[i][j] + b[i][j]
    return result

def typeconvert(a):
    for i in range(len(a)):
       # 迭代输出列
        for j in range(len(a[0])):
            a[i][j] = a[i][j] * (256)
    return a

def f(x):
    return np.float(x)

def g(x):
    return np.int(x)

if __name__ == "__main__":
    img = cv2.imread("D:\\python_opencv\\source_image\\1122\\2\\1.jpg",0)
    region_1 = getROISobel(img, 0, 0)
    region_2 = getROISobel(img, 0, 1)
    region_3 = getROISobel(img, 1, 0)
    region_4 = getROISobel(img, 1, 1)
    print(sum(region_1))
    print(sum(region_2))
    print(sum(region_3))
    print(sum(region_4))
    position_index = get_position_index(region_1, region_2, region_3, region_4)
    print(position_index)

    imsrc_1 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\1.jpg')
    imsrc_2 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\2.jpg')
    imsrc_3 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\3.jpg')
    imsrc_4 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\4.jpg')
    imsrc_5 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\5.jpg')
    imsrc_6 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\6.jpg')
    imsrc_7 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\7.jpg')
    imsrc_8 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\8.jpg')
    imsrc_9 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\9.jpg')
    imsrc_10 = cv2.imread('D:\\python_opencv\\source_image\\1123\\1\\10.jpg')

    position_1 = findposition(imsrc_1, position_index)
    position_2 = findposition(imsrc_2, position_index)
    position_3 = findposition(imsrc_3, position_index)
    position_4 = findposition(imsrc_4, position_index)
    position_5 = findposition(imsrc_5, position_index)
    position_6 = findposition(imsrc_6, position_index)
    position_7 = findposition(imsrc_7, position_index)
    position_8 = findposition(imsrc_8, position_index)
    position_9 = findposition(imsrc_9, position_index)
    position_10 = findposition(imsrc_10, position_index)

    print("position_1[0]", position_1[0])
    print("position_1[1]", position_1[1])
    print("position_2[0]", position_2[0])
    print("position_2[1]", position_2[1])
    print(position_1[0] - position_2[0])
    print(position_1[1] - position_2[1])
    print(position_1[0] - position_3[0])
    print(position_1[1] - position_3[1])
    print(position_1[0] - position_4[0])
    print(position_1[1] - position_4[1])
    print(position_1[0] - position_5[0])
    print(position_1[1] - position_5[1])
    print(position_1[0] - position_6[0])
    print(position_1[1] - position_6[1])
    print(position_1[0] - position_7[0])
    print(position_1[1] - position_7[1])
    print(position_1[0] - position_8[0])
    print(position_1[1] - position_8[1])
    print(position_1[0] - position_9[0])
    print(position_1[1] - position_9[1])
    print(position_1[0] - position_10[0])
    print(position_1[1] - position_10[1])

    imsrc_1 = translate(imsrc_1, position_1[0] - position_1[0], position_1[1] - position_1[1])
    imsrc_2 = translate(imsrc_2, position_1[0] - position_2[0], position_1[1] - position_2[1])
    imsrc_3 = translate(imsrc_3, position_1[0] - position_3[0], position_1[1] - position_3[1])
    imsrc_4 = translate(imsrc_4, position_1[0] - position_4[0], position_1[1] - position_4[1])
    imsrc_5 = translate(imsrc_5, position_1[0] - position_5[0], position_1[1] - position_5[1])
    imsrc_6 = translate(imsrc_6, position_1[0] - position_6[0], position_1[1] - position_6[1])
    imsrc_7 = translate(imsrc_7, position_1[0] - position_7[0], position_1[1] - position_7[1])
    imsrc_8 = translate(imsrc_8, position_1[0] - position_8[0], position_1[1] - position_8[1])
    imsrc_9 = translate(imsrc_9, position_1[0] - position_9[0], position_1[1] - position_9[1])
    imsrc_10 = translate(imsrc_10, position_1[0] - position_10[0], position_1[1] - position_10[1])


    '''
    imsrc_8 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\8.jpg')
    imsrc_9 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\9.jpg')    
    imsrc_10 = cv2.imread('D:\\python_opencv\\source_image\\image_match\\10.jpg')
    '''
    #imsrc_sum = add(imsrc_1, imsrc_2, imsrc_3, imsrc_4, imsrc_5, imsrc_6, imsrc_7)
    print(imsrc_1.shape)
    f2 = np.vectorize(f)#让函数矩阵化,解决只能一对一强制性变换这一要求
    imsrc_1 = f2(imsrc_1)
    imsrc_2 = f2(imsrc_2)
    #imsrc_sum = imsrc_1 + imsrc_2 + imsrc_3 + imsrc_4 + imsrc_5 + imsrc_6 + imsrc_7
    #imsrc_average = imsrc_sum/7

    imsrc_sum = imsrc_1 + imsrc_2 + imsrc_3 + imsrc_9
    imsrc_average = imsrc_sum/4
    #imsrc_sum = add(imsrc_1, imsrc_2)


    g2 = np.vectorize(g)#让函数矩阵化,解决只能一对一强制性变换这一要求
    #imsrc_average = g2(imsrc_average)
    #imsrc_average = np.unit8(imsrc_average)
    #print(g2(imsrc_average))
    cv2.imshow('merge', typeconvert(g2(imsrc_average)))         
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值