opencv筆記(1)
OpenCV庫分為多個模組:opencv_core模組包含庫的核心功能,opencv_imgproc模組包含主要的影象處理函式,opencv_highgui模組提供了讀寫影象和視訊的函式以及一些使用者互動函式。
讀取影象:
image=cv::imread("puppy.bmp");
if(image.empty()){
}
顯示影象:
cv::nameWindow("Original Image");//定義視窗
cv::imshow("Original Image",image);
在OpenCV的C++API中,所有類和函式都在名稱空間cv內定義。
回撥函式:void onMouse(int event,int x,int y,int flags,void *param);
第一個引數是整數,表示觸發回撥函式的滑鼠事件型別。後面兩個引數是事件發生時滑鼠的位置,用畫素座標表示。引數flag表示事件發生時按下了滑鼠的哪個按鍵,最後一個引數指向任意物件的指標,作為附加的引數傳送給函式。
cv::setMouseCallback("original image",onMOuse,reinterpret_cast<void*>(&image));
Mat
Mat有兩個必不可少的組成部分:頭部和資料塊。頭部包含了矩陣的所有相關資訊(大小/通道數量/資料型別)。資料塊包含了影象的所有畫素值。頭部有一個指向資料塊的指標,即data屬性。
1/建立影象方法
cv:: Mat image1(240,320, CV_8U,100);
cv::Mat image2(240,320,CV_8UC3,cv::Scalar(0,0,255));
2/可以隨時用create方法分配或重新分配影象的資料塊。如果影象已被分配,其原來的內容會被先釋放。
image1.create(200,200,CV_8U);
一旦沒有了指向Mat物件的引用,分配的記憶體就會被自動釋放。兩幅影象之間賦值,影象資料並不會被複制,此時兩幅影象都指向同一個記憶體塊。因此只有當影象的所有引用都被釋放或賦值給另一幅影象時,記憶體才會被釋放。
3/影象深度複製方法:
image.copyTo(image2);
或者 image5=image3.clone();
定義感興趣區域ROI
1/如何定義
定義了ROI之後,就可以把ROI當成一個普通的Mat例項進行操作。
A:cv::Rect。imageROI(image,cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));
通過指明左上角的位置和矩陣的尺寸(後兩個引數是尺寸,前兩個是座標)。
B:還可以通過cv::(cv::Range(image.rows-logo.rows,image.rows),cv::Range(image.cols-logo.cols,image.cols));
注意:影象和ROI共享了同一塊影象資料,因此ROI的任何轉變都會影響原始影象的相關區域。在定義ROI時,資料並沒有複製,因此他的執行時間是固定的,不受ROI尺寸的影響。
C:要定義行組成的ROI:cv::Mat imageROI=image.rowRange(start,end);
cv::image.colRange(start,end);
掩碼
掩碼是一個8點陣圖像,如果掩碼中某個位置的值不為0,在這個位置的操作就會起作用。
imageROI=image(cv::Rect(image.cols-logo.cols,jimage.rows-logo.rows,logo.cols,logo.rows));
Mat mask(logo);
logo.copyTo(imageROI,mask);