1. 程式人生 > >opencv學習篇(4)Mat

opencv學習篇(4)Mat

Mat

在2001年剛剛出現的時候,OpenCV基於 C 語言介面而建。為了在記憶體(memory)中存放影象,當時採用名為 IplImage 的C語言結構體,時至今日這仍出現在大多數的舊版教程和教學材料。但這種方法必須接受C語言所有的不足,這其中最大的不足要數手動記憶體管理,其依據是使用者要為開闢和銷燬記憶體負責。雖然對於小型的程式來說手動管理記憶體不是問題,但一旦程式碼開始變得越來越龐大,你需要越來越多地糾纏於這個問題,而不是著力解決你的開發目標。

幸運的是,C++出現了,並且帶來類的概念,這給使用者帶來另外一個選擇:自動的記憶體管理(不嚴謹地說)。這是一個好訊息,如果C++完全相容C的話,這個變化不會帶來相容性問題。為此,OpenCV在2.0版本中引入了一個新的C++介面,利用自動記憶體管理給出瞭解決問題的新方法。使用這個方法,你不需要糾結在管理記憶體上,而且你的程式碼會變得簡潔(少寫多得)。但C++介面唯一的不足是當前許多嵌入式開發系統只支援C語言。所以,當目標不是這種開發平臺時,沒有必要使用 

 方法(除非你是自找麻煩的受虐狂碼農)。

關於 Mat ,首先要知道的是你不必再手動地(1)為其開闢空間(2)在不需要時立即將空間釋放。但手動地做還是可以的:大多數OpenCV函式仍會手動地為輸出資料開闢空間。當傳遞一個已經存在的 Mat 物件時,開闢好的矩陣空間會被重用。也就是說,我們每次都使用大小正好的記憶體來完成任務。

基本上講 Mat 是一個類,由兩個資料部分組成:矩陣頭(包含矩陣尺寸,儲存方法,儲存地址等資訊)和一個指向儲存所有畫素值的矩陣(根據所選儲存方法的不同矩陣可以是不同的維數)的指標。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依影象的不同而不同,通常比矩陣頭的尺寸大數個數量級。因此,當在程式中傳遞影象並建立拷貝時,大的開銷是由矩陣造成的,而不是資訊頭。OpenCV是一個影象處理庫,囊括了大量的影象處理函式,為了解決問題通常要使用庫中的多個函式,因此在函式中傳遞影象是家常便飯。同時不要忘了我們正在討論的是計算量很大的影象處理演算法,因此,除非萬不得已,我們不應該拷貝 

 的影象,因為這會降低程式速度。

為了搞定這個問題,OpenCV使用引用計數機制。其思路是讓每個 Mat 物件有自己的資訊頭,但共享同一個矩陣。這通過讓矩陣指標指向同一地址而實現。而拷貝建構函式則 只拷貝資訊頭和矩陣指標 ,而不拷貝矩陣。

1
2
3
4
5
6
Mat A, C;                                 // 只建立資訊頭部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 這裡為矩陣開闢記憶體

Mat B(A);                                 // 使用拷貝建構函式

C
= A; // 賦值運算子

以上程式碼中的所有Mat物件最終都指向同一個也是唯一一個數據矩陣。雖然它們的資訊頭不同,但通過任何一個物件所做的改變也會影響其它物件。實際上,不同的物件只是訪問相同資料的不同途徑而已。這裡還要提及一個比較棒的功能:你可以建立只引用部分資料的資訊頭。比如想要建立一個感興趣區域( ROI ),你只需要建立包含邊界資訊的資訊頭:

1
2
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries

現在你也許會問,如果矩陣屬於多個 Mat 物件,那麼當不再需要它時誰來負責清理?簡單的回答是:最後一個使用它的物件。通過引用計數機制來實現。無論什麼時候有人拷貝了一個 Mat 物件的資訊頭,都會增加矩陣的引用次數;反之當一個頭被釋放之後,這個計數被減一;當計數值為零,矩陣會被清理。但某些時候你仍會想拷貝矩陣本身(不只是資訊頭和矩陣指標),這時可以使用函式 clone() 或者 copyTo() 。

1
2
3
Mat F = A.clone();
Mat G;
A.copyTo(G);

現在改變 F 或者 G 就不會影響 Mat 資訊頭所指向的矩陣。總結一下,你需要記住的是

  • OpenCV函式中輸出影象的記憶體分配是自動完成的(如果不特別指定的話)。
  • 使用OpenCV的C++介面時不需要考慮記憶體釋放問題。
  • 賦值運算子和拷貝建構函式( ctor )只拷貝資訊頭。

相關推薦

opencv學習4Mat

Mat 在2001年剛剛出現的時候,OpenCV基於 C 語言介面而建。為了在記憶體(memory)中存放影象,當時採用名為 IplImage 的C語言結構體,時至今日這仍出現在大多數的舊版教程和教學材料。但這種方法必須接受C語言所有的不足,這其中最大的不足要數手動記憶體管理,其依據是使用者要為開闢和銷燬

OpenCV學習總結4- 目標跟蹤

opened 背景 key font sin mic 目標 mil cap 視覺算法原理:背景提取  1. 打開視頻(文件或攝像頭)  2. 從視頻中提取當前幀  3. 計算背景:以前多幀求取平均  4. 根據背景得到運動目標(當前幀 - 背景)  5. 返回2,程序不斷循

docker學習4--查詢、獲取映象

概述如何查詢想要的docker映象如何獲取想要的映象如何檢視拉去的本地映象如何將映象推送到docker hub網站1、查詢想要的映象1)https://hub.docker.com/ 網站進行搜尋        2)docker search  [options] 映象名稱 

JVM學習4之執行緒安全與鎖優化

執行緒安全與鎖優化 Java中執行緒安全 對共享資料的操作 1.        不可變: 不可變的物件一定是執行緒安全的。如String類。 2.        絕對執行緒安全 3.        相對執行緒安全 4.        執行緒相容 5.        執行緒對

opencv學習2haar人臉檢測

下圖就是使用上述程式碼對內建攝像頭的視訊流進行人臉檢測的結果影象: 注意複製分類器檔案 haarcascade_frontalface_alt.xml 和 haarcascade_eye_tree_eyeglasses.xml 到你的當前目錄下. 他們在OpenCV安裝資料夾 opencv/data/haa

opencv學習7基本繪圖

void MyPolygon( Mat img ) { int lineType = 8; /** 建立一些點 */ Point rook_points[1][20]; rook_points[0][0] = Point( w/4.0, 7*w/8.0 ); rook_points[0

在路上---學習Python 數據結構和算法 (4) --希爾排序、歸並排序

改進 randint 循環 打印 中一 隨機 關鍵詞 shel 條件 獨白:   希爾排序是經過優化的插入排序算法,之前所學的排序在空間上都是使用列表本身。而歸並排序是利用增加新的空間,來換取時間復雜度的減少。這倆者理念完全不一樣,註定造成的所消耗的時間不同以及空間上的不同

OpenCv學習筆記—cv::Mat學習

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OpenCV學習筆記環境配置、影象基本操作、Mat物件

     終於,在國慶假期結束後開始上手OpenCV,一直嚮往著學習影象處理,上手OpenCV後越發覺得影象處理的有趣,確實OpenCV對於培養學習影象處理的興趣以及作為深究演算法的開始無疑是適合的。      我所使用的環境是Win10+OpenCV3.4.3+VS201

OpenCV 2.4.9 學習筆記4—— 畫素型別與Templates的限制使用

限制使用templates   C++中的Templates使得介面機制非常好用,高效而且能夠保證資料與演算法的安全。但是過多地使用templates可能會增加計算時間和程式碼長度,有時候還能難區分介面和實現。在OpenCV中過多使用templates並不是一件好事,OpenCV的refman中提到Open

OpenCV學習筆記04Mat類詳解

1. 前言:Mat類簡介 OpenCV 作為強大的計算機視覺開源庫,很大程度上參考了MatLab的實現細節和語法風格,比如說,在OpenCV2.x版本以後,越來越多的函式實現了MatLab所具有的功能,甚至乾脆連函式名都一模一樣(如 imre

OpenCV學習筆記23cv.Mat 與 .txt 檔案資料的讀寫操作

1、按OpenCV格式實現的 .txt 檔案讀寫可以用 cvSave 和 cvLoad 實現,格式和 .xml/.yml 的差不多,不過如果專用與 OpenCV 的資料讀寫,還是用  .xml/.yml 檔案格式較好,我比較喜歡 .yml 格式,可讀性非常棒。用 cvSave

軟體測試學習筆記4——面試問題

答:Beta測試(β測試)是軟體的多個使用者在一個或多個使用者的實際使用環境下進行的測試。開發者通常不在測試現場,Beta測試不能由程式設計師或測試員完成。因而,Beta測試是在開發者無法控制的環境下進行的軟體現場應用。在Beta測試中,由使用者記下遇到的所有問題,包括真實的以及主管認定的,定期向開發者報告,

OpenCV學習筆記OpenCV 3.4.1 + VS2017 配置

對於EmguCV3.4.1的配置花了我兩天的時間,本來導師要求配置這個但是測試的時候有一個報錯資訊。為此我參考了各大部落格,無論是調debuger,還是x64,x86檔案的拷貝,都居然是失敗,無語死了,真的想吐槽。一怒之下,還是裝起C++的opencv3.4.1吧,硬著頭皮上

OpenCV學習筆記OpenCV使用imwrite儲存4通道圖片僅對png有效

轉載OpenCV官方文件中imwrite函式的說明,如何儲存4通道的影象。 轉載地址 https://www.docs.opencv.org/2.4.13/modules/highgui/doc/reading_and_writing_images_and_video.h

機器學習回顧4:邏輯迴歸

1 引言 邏輯不邏輯,迴歸非迴歸。 回想當年初次學習邏輯迴歸演算法時,看到”邏輯迴歸“這個名字,第一感覺是這是一個與線性迴歸類似的迴歸類別的演算法,只不過這個演算法突出”邏輯“,或者與某個以”邏輯“命名的知識點有關。可後來卻發現,這是

Swift學習筆記4:字符串

min mes 不同的 常用方法 dice 內存空間 全部 there logs 目錄: 初始化 常用方法或屬性 字符串索引 初始化 創建一個空字符串作為初始值: var emptyString = "" // 空字

oracle學習筆記4

linux系統 sta sys 配置 默認 搜索 密碼 多用戶 登錄 4.oracle數據庫的啟動流程   windows操作系統     啟動監聽: lsnrctl start;     啟動數據庫實例:oradim-startup-sid 實例名   linux系統

AngularJs學習筆記4——自定義指令

ref 告訴 ack 生命周期 .com bsp ctrl 參數變量 ng- 對指令的第一印象:它是一個自定義標簽! 先來看一個簡單的指令: <!doctype html> <html ng-app="myApp"> <head>

ASP.NET學習筆記4——上傳圖片

bmi guid ted 介紹 dir filename content put ima 說明(2017-10-8 23:03:43): 1. 後面的內容都是一些雜七雜八的,零零碎碎的,之前都直接略過了,不過其實還是挺重要的,這次重新學習要認認真真敲一遍。 2. 明天中午9