? ? ? ? 最近準備開始閱讀Opencv 3 Computer Vision Application Programming CodeBook, 在第一章中學習到Mat的一些特性,在此記錄一下,以后在OpenCV開發(fā)中肯定可以用得到。
? ? ? ? Mat結構(類)是OpenCV中進行圖像處理的基本元素,代表一幅圖像??梢詣?chuàng)建一個空的Mat對象(cv::Mat img),可以創(chuàng)建指定圖像大小和數(shù)據格式的Mat對象(cv::Mat img(128, 128, cv::CV_8UC3, cv::Scalar(255,255,0)) - 經過初始化的彩色圖像, cv::Mat img(cv::Size(128,128), cv::CV_8U) - 未初始化的灰度圖像),可以從文件讀取圖片然后賦值給一個Mat對象(cv::Mat img = cv::imread("img.jpg", 1)),還可以從攝像頭等設備讀取數(shù)據然后保存到Mat對象。同時,也可以將一個cv::Mat對象賦值給另一個cv::Mat對象。
? ? ? ? cv::Mat對象的賦值操作需要注意,首先,cv::Mat結構包括兩個部分:特性區(qū)和數(shù)據區(qū),特性區(qū)存放的是圖像或者數(shù)據矩陣的行/列值,數(shù)據類型(無符號值,整數(shù),浮點數(shù)等)等信息,數(shù)據區(qū)存放的是圖像中像素值。在賦值中,OpenCV雖然新建了一個cv::Mat對象,但是兩個對象共用一個數(shù)據區(qū),只是特性區(qū)屬于各自對象,當其中一個對象的生命期結束要釋放空間時,如果數(shù)據區(qū)仍然被其他cv::Mat對象引用,那么就不會釋放,直到最后引用此數(shù)據區(qū)的cv::Mat對象被釋放。
? ? ? ? 根據cv::Mat數(shù)據區(qū)的這一特性,在選擇ROI(Region of Interest)的時候,創(chuàng)建的小圖像從大圖像中選擇一塊區(qū)域,實際小圖像的Mat對象只是新建了特性區(qū),數(shù)據區(qū)仍然指向大圖像的數(shù)據區(qū)的興趣部分。
? ? ? ? 同時,在函數(shù)傳參時,雖然傳入的是cv::Mat對象,但是,并非將整個cv::Mat對象進行拷貝,只是拷貝了特性區(qū),形參和傳參共用同一塊數(shù)據區(qū)。因此在函數(shù)內部修改數(shù)據區(qū),那么傳入的cvMat對象也會被修改,而不必用傳入引用或者傳入指針代替。
? ? ? ? 還有一個特點,使用cv::Mat::create()成員函數(shù)時,雖然使為cv::Mat對象特性變化,如果原對象的數(shù)據區(qū)能夠容下新對象的數(shù)據區(qū),那么OpenCV就不會釋放舊的數(shù)據區(qū)再新建,而是直接采用原數(shù)據區(qū)。