opencv筆記(1)

OpenCV庫分爲多個模塊:opencv_core模塊包含庫的核心功能,opencv_imgproc模塊包含主要的圖像處理函數,opencv_highgui模塊提供了讀寫圖像和視頻的函數以及一些用戶交互函數。函數

 

讀取圖像:

image=cv::imread("puppy.bmp");ui

if(image.empty()){spa

}指針

顯示圖像:視頻

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

相關文章
相關標籤/搜索