opencv使用copyTo()实现图片叠加 贴图 水印

目录

函数介绍

使用测试

效果输出


函数介绍

用法一:logo.copyTo(src_ROI,logo_mask)

 
  • 内部操作: logo将自己经过 logo_mask掩膜后,再复制到 src_ROI
  • 参数要求:logo和src_ROI要类型一致;logo和src_ROI和logo_mask要尺寸一致
 
用法二: logo.copyTo(src_ROI)
 
  • 内部操作: logo将自己复制到 src_ROI
  • 参数要求:logo和src_ROI:类型一致,尺寸一致
 
 

使用测试

实际使用情况多是:logo_IMG(贴图)为小尺寸图具有黑色背景的图,src_IMG(被贴图)为大尺寸的图。
1.copyTo使用条件要求logo和src_ROI和logo_mask要尺寸一致,所以要将src_IMG的要贴图ROI区域提取出来给src_IMG_ROI,ROI区域 cv::Rect(贴图起点X,贴图起点y,贴图尺寸宽,贴图尺寸高)
     cv::Mat src_IMG_ROI =src_IMG(cv::Rect(20, 20,logo_IMG.cols,logo_IMG.rows));
2.copyTo使用条件要求logo_IMG和src_ROI要类型一致,如果类型不一致就需要转换,例如logo_IMG是一通道的CV_8UC1格式灰度图,而src_IMG是三通道的CV_8UC3格式彩色图,则要转logo_IMG成三通道CV_8UC3格式
    cv::cvtColor(logo_IMG,logo_IMG, cv::COLOR_GRAY2BGR);
 
cv::Mat src_IMG=cv::imread("src.jpg");//读取被贴图(漂亮的艺珍)
cv::Mat logo_IMG=cv::imread("logo.png");//读取贴图(名字)
cv::Mat logo_IMG_mask=cv::imread("logo.png",0);//读取灰度的贴图做mask图


if (!src_IMG.empty() && !logo_IMG.empty() && !logo_IMG_mask.empty()//三张图片都读取成功
        && src_IMG.type()==logo_IMG.type() ) {//logo_IMG(贴图)和src_IMG(被贴图)的类型需要一致

    cv::imshow("src",src_IMG);
    cv::imshow("logo",logo_IMG);
    cv::imshow("mask",logo_IMG_mask);

    //用法一
    cv::Mat src_IMG_ROI =src_IMG(cv::Rect(30, 20,logo_IMG.cols,logo_IMG.rows));//提取src_IMG的ROI区域到src_IMG_ROI
    logo_IMG.copyTo(src_IMG_ROI,logo_IMG_mask);//logo_IMG经过logo_IMG_mask掩膜后的图复制到src_IMG_ROI
    cv::imshow("Usage 1",src_IMG);

    //用法二
    logo_IMG.copyTo(src_IMG_ROI);//logo_IMG图复制到src_IMG
    cv::imshow("Usage 2",src_IMG);

}
else{
    cout<<"ERROR: no file or Different types!"<<endl;
    cout<<"src_IMG"<<src_IMG.type()<<endl;
    cout<<"logo_IMG"<<logo_IMG.type()<<endl;
           
 

效果输出

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值