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]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。
//例程见上