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

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>