OpenCV Mat結構關鍵特性記錄

        最近準備開始閱讀Opencv 3 Computer Vision Application Programming CodeBook, 在第一章中學習到Mat的一些特性,在此記錄一下,以後在OpenCV開發中肯定可以用得到。

        Mat結構(類)是OpenCV中進行圖像處理的基本元素,代表一幅圖像。可以創建一個空的Mat對象(cv::Mat img),可以創建指定圖像大小和數據格式的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)),還可以從攝像頭等設備讀取數據然後保存到Mat對象。同時,也可以將一個cv::Mat對象賦值給另一個cv::Mat對象。

        cv::Mat對象的賦值操作需要注意,首先,cv::Mat結構包括兩個部分:特性區和數據區,特性區存放的是圖像或者數據矩陣的行/列值,數據類型(無符號值,整數,浮點數等)等信息,數據區存放的是圖像中像素值。在賦值中,OpenCV雖然新建了一個cv::Mat對象,但是兩個對象共用一個數據區,只是特性區屬於各自對象,當其中一個對象的生命期結束要釋放空間時,如果數據區仍然被其他cv::Mat對象引用,那麼就不會釋放,直到最後引用此數據區的cv::Mat對象被釋放。

        根據cv::Mat數據區的這一特性,在選擇ROI(Region of Interest)的時候,創建的小圖像從大圖像中選擇一塊區域,實際小圖像的Mat對象只是新建了特性區,數據區仍然指向大圖像的數據區的興趣部分。

        同時,在函數傳參時,雖然傳入的是cv::Mat對象,但是,並非將整個cv::Mat對象進行拷貝,只是拷貝了特性區,形參和傳參共用同一塊數據區。因此在函數內部修改數據區,那麼傳入的cvMat對象也會被修改,而不必用傳入引用或者傳入指針代替。

        還有一個特點,使用cv::Mat::create()成員函數時,雖然使爲cv::Mat對象特性變化,如果原對象的數據區能夠容下新對象的數據區,那麼OpenCV就不會釋放舊的數據區再新建,而是直接採用原數據區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章