2012-09-26 107 views
6

我想用openCV讀取視頻幀,將數據保存在cv :: Mat格式中。那麼我想用我的另一個代碼,接受「int類型矩陣」到這個視頻幀。我知道「cvMat」和「int type matrix」不兼容。也許我不熟悉opencv,但是我可以在「cvMat」和「int mat」之間進行任何類型的轉換,以便我可以將我的代碼用於捕獲的視頻幀? 我說「INT墊」,也許這是不正確的,但我的意思是這樣的:在OpenCV矩陣和int矩陣之間的轉換

cv::Mat videoFrame; 
int inputData[600][400]; 

我想要做的事,如:

inputData = videoFrame; 

謝謝。

回答

6

快速的方法是共享內存:不需要複製。不過,如果你修改一個矩陣,其他的將被修改(明顯!)

int inputData[600][400]; 
cv::Mat videoFrame(600, 400, CV_32UC1, inputData); 

請注意,videoFrame改變其類型/大小的任何進一步的OpenCV的通話將分配一個新的一片內存,結果會存儲。

如果你想擁有單獨的數據矩陣,可以使用memcpy - 它是複製數據的最快方法:

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int)); 

這種方法的問題是,它不是安全的。如果videoFrame不是int類型的呢? (很可能是char)。如果它沒有連續存儲在內存中(可能發生)呢? ...

+0

親愛的Vasile,非常感謝你的回答。你建議的方法很好,但我害怕玩內存分配。就像你提到的那樣,它可能不安全,到目前爲止我已經經歷過很多內存問題(不是這種情況)。那麼是否還有其他解決方案?由於內存問題,我真的不希望我的代碼可能會再次死機。再次感謝你。 –

+1

安全的方法是根本不使用inputData。看看你的算法,看看你是否可以單獨使用videoFrame。重複數據有時是編碼不好的跡象 – Sam

+0

好的,謝謝你的建議。 –