2012-10-05 76 views
0

我想訪問來自轉換視頻幀爲灰度的openCV矩陣元素。我的代碼是這樣的:爲什麼我無法訪問openCV中的矩陣元素?

int C = 3; 
cv::Mat grayPrevious; 
cv::cvtColor (previousFrame, grayPrevious, CV_RGB2GRAY ); 
double* grayPtr = grayPrevious.ptr <double>(); 

double mean [600][800][3]; 

///... // set some values to mean here 

for (int i = 0; i < 600; i ++) 
{ 
    for (int j = 0; j < 800; j ++) 
    { 
     for (int m = 0; m < C; m ++) 
     { 
      diff [i][j][m]= abs(grayPtr[ 800* (i-1)+j] - mean[i][j][m]); 
     } 

    } 
} 

但它在for循環崩潰。這與數據類型有關嗎?我該如何改變它?另外,我的第二個問題是,我嘗試使用「grayPrevious.at」在屏幕上查看grayPrevious矩陣的元素,但它顯示的值爲「double」的「-5.235125e + 30」或「 - 11242433「爲」int「。這也是困惑我,我期待看到0至255之間,並

回答

2

由於您正在處理灰度圖像,因此您應該使用uchar而不是intdouble。 (你可以投uchar打印:cout<<(int)grayPrevious.at<uchar>(i,j);

是否有任何理由你試圖直接訪問像素的「困難的方式」? 你可以做grayprevious.at<uchar>(i,j)(假設你的圖像是800x600),這更容易調試,然後使用直接像素訪問。

編輯:我覺得應該是:

uchar* grayPtr = grayPrevious.ptr <uchar>();然後grayPtr[grayPrevious.cols*i+j];

你也不要grayPrevious.data[grayPrevious.cols*i+j];(不ptr還是直接進入)

+0

我正在使用這種方式,因爲「grayPrevious.at」方法正在進行範圍檢查,並且對我來說耗時很長。 –

+0

@ederman看到編輯了! – Sassa

+0

謝謝你的回答。 –

1

值我嚴重懷疑此行也許問題

for (int m = 0; m < C; m ++) 

檢查你的C值時,你的循環運行和崩潰,也許意思是,試圖訪問數組邊界之外的元素。最有可能的是它超過3個。爲什麼你不使用預增量操作符。在這個例子中可能沒有關係,但是使用預增量操作符而不是後增量操作符是一種好的做法。

+0

我編輯我的代碼,其實我的 「C」 是3. –

+0

@ederman是否greyPtr和grayPrevious **已初始化?你的荒謬價值可能是因爲它沒有被正確初始化。 – DumbCoder

+0

@DumbCoder,爲什麼preincrement比post increment更好? – CallMeNorm