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()