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);