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