import cv2
import numpy as np
def mergeImg(inputImg, maskImg, contourData, drawPosition):
'''
:param inputImg: 输入的图像
:param maskImg: 输入的模板图像
:param contourData: 输入的模板中轮廓数据 numpy 形式如[(x1,y1),(x2,y2),...,]
:param drawPosition: (x,y) 大图中要绘制模板的位置,以maskImg左上角为起始点
:return: outPutImg:输出融合后的图像
outContourData: 输出轮廓在inputImg的坐标数据
outRectData: 输出轮廓的矩形框在inputImg的坐标数据
'''
# 通道需要相等
if (inputImg.shape[2] != maskImg.shape[2]):
print("inputImg shape != maskImg shape")
return
inputImg_h = inputImg.shape[0]
inputImg_w = inputImg.shape[1]
maskImg_h = maskImg.shape[0]
maskImg_w = maskImg.shape[1]
# inputImg图像尺寸不能小于maskImg
if (inputImg_h < maskImg_h or inputImg_w < maskImg_w):
print("inputImg size < maskImg size")
return
# 画图的位置不能超过原始图像
if (((drawPosition[0] + maskImg_w) > inputImg_w) or ((drawPosition[1] + maskImg_h) > inputImg_h)):
print("drawPosition + maskImg > inputImg range")
return
outPutImg = inputImg.copy()
input_roi = outPutImg[drawPosition[1]:drawPosition[1] + maskImg_h, drawPosition[0]:drawPosition[0] + maskImg_w]
imgMask_array = np.zeros((maskImg_h, maskImg_w, maskImg.shape[2]), dtype=np.uint8)
triangles_list = [contourData]
cv2.fillPoly(imgMask_array, triangles_list, color=(1, 1, 1))
cv2.fillPoly(input_roi, triangles_list, color=(0, 0, 0))
# cv2.imshow('imgMask_array', imgMask_array)
imgMask_array = imgMask_array * maskImg
output_ori = input_roi + imgMask_array
outPutImg[drawPosition[1]:drawPosition[1] + maskImg_h, drawPosition[0]:drawPosition[0] + maskImg_w] = output_ori
return outPutImg
if (__name__ == "__main__"):
#原图
imgStr = r'img/1634081248.020272.jpg'
#篡改后的车牌图像
imgMaskStr = r'plate.png'
img = cv2.imread(imgStr)
maskImg = cv2.imread(imgMaskStr)
# w,h裁剪下来的原车牌size
w=189
h=66
maskImg=cv2.resize(maskImg,(w,h))
print(maskImg.shape[1])
contourData = np.array([(0,0),(maskImg.shape[1],0),(maskImg.shape[1],maskImg.shape[0]),(0,maskImg.shape[0])])
#贴图的起始点,原车牌图像目标框的左上角点
x1=1668
y1=1360
outPutImg= mergeImg(img, maskImg, contourData, (x1,y1))
cv2.imwrite('result.png', outPutImg)