OPENCV-4 学习笔记

OPENCV-4 学习笔记

ROI—设定感兴趣的区域(region of interest)

定义:

Mat imageROI;  
//方法一:通过Rect指定矩形区域 
imageROI=image(Rect(500,250,logo.cols,logo.rows))
//方法二  指定感兴趣行或列的范围(Range)
imageROI=srcImage3(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));  

利用ROI将一幅图加到另一幅图的指定位置

bool ROI_AddImage()  
{  
       //【1】读入图像  
       Mat srcImage1= imread("1.jpg");  
       Mat logoImage= imread("2.jpg");  
       if(!srcImage1.data ) { printf("读取srcImage1错误~! \n"); return false; }  
       if(!logoImage.data ) { printf("读取logoImage错误~! \n"); return false; }  

       //【2】定义一个Mat类型并给其设定ROI区域  
       Mat imageROI= srcImage1(Rect(200,250,logoImage.cols,logoImage.rows));  

       //【3】加载掩模(必须是灰度图)  
       Mat mask= imread("2.jpg",0);  

       //【4】将掩膜拷贝到ROI  
       logoImage.copyTo(imageROI,mask);  

       //【5】显示结果  
       namedWindow("<1>利用ROI实现图像叠加示例窗口");  
       imshow("<1>利用ROI实现图像叠加示例窗口",srcImage1);  

       return true;  
}  

初级图像混合——线性混合操作

公式:

实现函数:addWeighted函数

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
  • dst = src1[I]*alpha+ src2[I]*beta + gamma;

    bool LinearBlending()
    {
    //【0】定义一些局部变量
    double alphaValue = 0.5;
    double betaValue;
    Mat srcImage2, srcImage3, dstImage;

       //【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )  
       srcImage2= imread("mogu.jpg");  
       srcImage3= imread("rain.jpg");  
    
       if(!srcImage2.data ) { printf("你妹,读取srcImage2错误~! \n"); return false; }  
       if(!srcImage3.data ) { printf("你妹,读取srcImage3错误~! \n"); return false; }  
    
       //【2】做图像混合加权操作  
       betaValue= ( 1.0 - alphaValue );  
       addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);  
    
       //【3】创建并显示原图窗口  
       namedWindow("<2>线性混合示例窗口【原图】 by浅墨", 1);  
       imshow("<2>线性混合示例窗口【原图】 by浅墨", srcImage2 );  
    
       namedWindow("<3>线性混合示例窗口【效果图】 by浅墨", 1);  
       imshow("<3>线性混合示例窗口【效果图】 by浅墨", dstImage );  
    
       return true;  
    

    }

分离颜色通道

  • split函数—将一个多通道数组分离成几个单通道数组
    void split(const Mat& src, Mat*mvbegin);
    void split(InputArray m,OutputArrayOfArrays mv);
    //第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。
    //第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。
  • merge函数—将多个数组组合合并成一个多通道的数组。
    它通过组合一些给定的单通道数组,将这些孤立的单通道数组合并成一个多通道的数组,从而创建出一个由多个单通道阵列组成的多通道阵列
    void merge(const Mat* mv, size_tcount, OutputArray dst)
    void (InputArrayOfArrays mv,OutputArray dst)

创建轨迹条——createTrackbar函数

int createTrackbar(conststring& trackbarname, conststring& winname,
 int* value, int count, TrackbarCallback onChange=0,void* userdata=0); 
 //创建轨迹条  
createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue,  
300,ContrastAndBright );// g_nContrastValue为全局的整型变量,ContrastAndBright为回调函数的函数名(即指向函数地址的指针) 

获取当前轨迹条的位置——getTrackbarPos函数

int getTrackbarPos(conststring& trackbarname, conststring& winname);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值