Open CV小细节

本文介绍了Open CV在处理图像时的一些实用小技巧,包括记录时间、保持图像效果大小与原图一致、判断读取错误、选择ROI并叠加、图片融合、使用split函数分离色彩通道以及merge函数将多个数组合并成多通道数组。
摘要由CSDN通过智能技术生成

Open CV小细节

1.记录时间
double time = static_cast<double>(getTickCount());  
time = ((double)getTickCount() - time)/getTickFrequency();
2.效果图的大小、类型与原图片相同
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());
3.判定读取错误的方法
if( !srcImage1.data ) 
{ printf("读取srcImage1错误~! \n");
  return false; }
4.选定ROI并将等大小图片叠加上
//定义一个Mat类型并给其设定ROI区域
    Mat imageROI= SrcImage1(Rect(200,250,logoImage.cols,logoImage.rows));

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

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

注意copyto的用法:
srcImage.copyto(dstImage, mask)
mask作为一个掩模板,如果在某个像素点(i, j)其值为1(只看第一通道,所以mask单通道即可)则把srcImage.at(i, j)处的值直接赋给dstImage.at(i, j),如果其值为0则dstImage.at(i, j)处保留其原始像素值。

5.图片融合
addWeighted( src1, alpha, src2, beta, 0.0, dst);  

//! computes weighted sum of two arrays (dst = alpha*src1 + beta*src2 + gamma)  
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);  
//opencv 通过 addWeighted 函数实现图片的线性融合.
//可以看出这个函数最小需要6个参数。
6.分离色彩通道split函数
void split(const Mat& src, Mat*mvbegin);  
void split(InputArray m,OutputArrayOfArrays mv);  

关于变量介绍:

第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。
第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。
例如:

Mat srcImage;  
Mat imageROI;  
vector<Mat> channels;  
srcImage= cv::imread("dota.jpg");  
// 把一个3通道图像转换成3个单通道图像  
split(srcImage,channels);//分离色彩通道  
       imageROI=channels.at(0);  
       addWeighted(imageROI(Rect(385,250,logoImage.cols,logoImage.rows)),1.0,  
              logoImage,0.5,0.,imageROI(Rect(385,250,logoImage.cols,logoImage.rows)));  

       merge(channels,srcImage4);  

       namedWindow("sample");  
       imshow("sample",srcImage);  
7.多个数组组合合并成一个多通道的数组的函数merge
void merge(const Mat* mv, size_tcount, OutputArray dst)  
void merge(InputArrayOfArrays mv,OutputArray dst)  

第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

//例程见上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值