opencv python 轮廓抠图粘贴到另外一张图像上

主要用到:opencv-python numpy

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 = [np.zeros((len(contourData), 2), int)]
    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
    triangles_list[0][:, 0] = contourData[:, 0] +drawPosition[0]
    triangles_list[0][:, 1] = contourData[:, 1] +drawPosition[1]
    outContourData=triangles_list[0]



    return outPutImg,outContourData#,outRectData
if(__name__=="__main__"):
    imgStr=r'E:\Maidipu\originalSVS\test\input.jpg'
    imgMaskStr = r'E:\Maidipu\originalSVS\test\mask.jpg'
    img=cv2.imread(imgStr)
    maskImg=cv2.imread(imgMaskStr)
    contourData=np.array([(57,7),(107,30),(107,120),(62,122),(2,95),(9,32)])
    outPutImg,outContourData=mergeImg(img, maskImg, contourData, (10,10))
    #print(outPutImg)
    cv2.imshow('2',outPutImg)
    cv2.imshow('3', maskImg)
    cv2.waitKey(0)

效果如下:左边小图轮廓(轮廓点这里我是用到手工获取不太准,可以结合计算轮廓算法达到精准绘制)以内的图像粘贴到右图上

车辆,车牌,反光衣,安全帽等数据集,链接,有兴趣的朋友可以看下 链接:链接:https://pan.baidu.com/s/1mG7X71rngtWqP2tsfFm26A 提取码:5555

您好!要将一张粘贴到另一张片上,可以使用以下步骤: 1. 使用 OpenCV 读取源图像和目标图像。 ```python import cv2 src_img = cv2.imread('source_image.jpg') dst_img = cv2.imread('destination_image.jpg') ``` 2. 确定源图像粘贴到目标图像的位置。 ```python # 粘贴位置左上角的坐标 x_offset = 100 y_offset = 100 # 粘贴位置的宽度和高度 width = src_img.shape[1] height = src_img.shape[0] ``` 3. 使用 OpenCV 的 `cv2.resize()` 函数将源图像的大小调整为与粘贴位置的大小相同。 ```python # 调整源图像的大小 resized_src_img = cv2.resize(src_img, (width, height)) ``` 4. 使用 OpenCV 的 `cv2.addWeighted()` 函数将源图像叠加到目标图像的指定位置上。 ```python # 将源图像叠加到目标图像的指定位置上 dst_img[y_offset:y_offset+height, x_offset:x_offset+width] = cv2.addWeighted(resized_src_img, 1, dst_img[y_offset:y_offset+height, x_offset:x_offset+width], 0, 0) ``` 完整代码如下: ```python import cv2 # 读取源图像和目标图像 src_img = cv2.imread('source_image.jpg') dst_img = cv2.imread('destination_image.jpg') # 确定源图像粘贴到目标图像的位置 x_offset = 100 y_offset = 100 width = src_img.shape[1] height = src_img.shape[0] # 调整源图像的大小 resized_src_img = cv2.resize(src_img, (width, height)) # 将源图像叠加到目标图像的指定位置上 dst_img[y_offset:y_offset+height, x_offset:x_offset+width] = cv2.addWeighted(resized_src_img, 1, dst_img[y_offset:y_offset+height, x_offset:x_offset+width], 0, 0) # 显示结果 cv2.imshow('Result', dst_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意:在将源图像叠加到目标图像的指定位置上时,需要确保两张片的大小和粘贴位置的大小相同,否则可能会出现意想不到的结果。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值