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]擁有一樣的尺寸和深度,並且通道的數量是矩陣陣列中的通道的總數。
//例程見上