模板匹配源码

来源:互联网 发布:怎么清除dnf异常数据 编辑:程序博客网 时间:2024/06/06 14:54
import cv2 import numpy as npfrom numpy import * import aircv as ac#在图像上下左右取额定大小的区域,并计算每个区域的sobel算子矩阵#定义模板此尺寸template_size = 60def 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 resdef 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 resultdef typeconvert(a):    for i in range(len(a)):       # 迭代输出列        for j in range(len(a[0])):            a[i][j] = a[i][j] * (256)    return adef 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 npfrom numpy import * import aircv as ac#在图像上下左右取额定大小的区域,并计算每个区域的sobel算子矩阵#定义模板此尺寸template_size = 80def 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 resdef 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 resultdef typeconvert(a):    for i in range(len(a)):       # 迭代输出列        for j in range(len(a[0])):            a[i][j] = a[i][j] * (256)    return adef 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()
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机锁屏锁住了怎么办 三星屏锁忘记了怎么办 文字下面有蓝色直线怎么办 苹果x不能截屏了怎么办 u盘在电脑上打不开怎么办 电脑桌面上文档剪切了怎么办 苹果官网查不到保修日期怎么办 吃了发霉的花生怎么办 鸡吃大蒜多了怎么办 玖瑰花叶子黄怎么办 羊偷吃腥油和花生饼吃多了怎么办 肉牛眼睛有点变黄少吃东西怎么办 黑坑草鱼不开口怎么办 花生和瓜子受潮皮了怎么办? 菜叶上长了腻虫怎么办 磨辊耐磨层脱落怎么办 磨辊耐磨层小块脱落怎么办 密封胶皮圈松了怎么办 汽筒里胶皮垫密封不严怎么办 磁耦气缸脱磁了怎么办 无杆气缸行程大怎么办 c4d中模型变成线怎么办 内径槽异性需要车一刀怎么办 轴承太紧影响转速怎么办 电动车前轮蝶刹抱死怎么办 摩托三轮车油刹抱死怎么办 手动档汽车离合抱死怎么办 别克gl8后轮吃胎怎么办 扭力梁后轮吃胎怎么办 非独立悬挂吃胎怎么办 货车半轴法兰盘裂纹怎么办 小天才平板裂屏了怎么办 新车撞了个坑怎么办 新车碰了个坑怎么办 汽车顶被砸了个坑怎么办 途观l前减震异响怎么办 锦明8代声音太大怎么办 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办