2012-09-28 87 views
0

我想讀取OpenCV中的視頻幀,然後將數據複製到另一個C++代碼中執行其他操作。我的代碼如下:複製數據的奇怪錯誤

cv::Mat capturedFrame; 
int newData[600][800]; 
std::cout<<"Debug1 " << std::endl; 
memcpy((char*)newData, (char*)capturedFrame.data, 600*800*sizeof(int)); 
std::cout<<"Debug2 " << std::endl; 
mycode.setData (newData); 
std::cout<<"Debug3 " << std::endl; 

則類 「使用setData」 的定義如下:

char data [600][800]; 
void mycode::setData (char newData[600][800]) 
{ 
    for (int m=0; m < 600; m ++) 
    { 
     for (int n = 0; n < 800; n ++) 
     { 
      data[i][j] = newData[i][j]; 
     } 
    } 
} 

但是,當涉及到行的代碼將停止:

mycode.setData (newData); 

什麼讓我困惑的是,如果我刪除了這段代碼,那麼我可以在屏幕上看到「Debug1」爲「Debug3」,這是正常的。但是,如果我使用此代碼,即使沒有在屏幕上打印出「Debug1」和「Debug2」,程序也會停止。這真的很奇怪。我還嘗試將「setData」類中的所有行註釋掉,以使其成爲空類,但錯誤仍然相同。所以我相信這不是關於「setData」類的。 我也知道「capturedFrame.data」是正確的,因爲我對其執行了一些其他過濾器,結果很好。有人可以在這裏解釋錯誤嗎?

編輯:

我用了一個調試器,但沒有錯誤消息,但該程序只是停止響應。另外,我將數據類型改爲「char」。

+0

你能剪切粘貼你的代碼嗎? 'data = newData;'行不應該編譯,更不用說你遇到運行時問題。 –

+1

您在'mycode :: setData'函數的'data = newData'行中分配了相同的值480000次。如果兩個緩衝區的大小相同,則可以使用'memcpy'。看看[這個答案](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c/4810668)瞭解更多關於C++數組。 –

+0

對不起,我的錯誤,我編輯成「data [i] [j] = [i] [j]」。 –

回答

4

此數組:

int newData[600][800]; 

是大於1 MB。如果這是一個局部變量,那麼你很可能會吹出堆棧。

數組data也是如此,但由於代碼片段的上下文很少,很難知道靜態分配的內容與自動分配的內容。

我想你應該考慮動態分配這些大型數組。

1

如果您註釋掉

mycode.setData (newData); 

編譯優化器可以知道newData沒有使用,所以

memcpy((int*)newData, (int*)capturedFrame.data, 600*800*sizeof(int)); 

同樣可以因此可能不會被執行淘汰。

這個問題可能存在於memcpy方法中,甚至是其他地方。

根據您提供的有限信息,很難調查真實原因,但我建議您可以深入研究其他代碼。

+0

我編輯了我的問題。 –