2014-01-29 112 views
0

這很奇怪。我有以下代碼:奇怪的OpenCV代碼

int white = 0; 
int black = 0; 
for (int i = 0; i < height; i++) { 
    for (int j = 0; j < width; j++) { 
     int total = 0; 
     for (int x = i - 1; x <= i + 1; x++) { 
      for (int y = j - 1; y <= j + 1; y++) { 
       total += data[x*step + y]; 
      } 
     } 
     if (total == (255 * 9)) { 
      white += 1; 
      // data[i*step + j] = 255; 
     } 
     else { 
      black += 1; 
      // data[i*step + j] = 0; 
     } 
    } 
} 
cout << white << endl << black << endl; 

當我運行此代碼時,它將正確輸入白色和黑色。但由於某些原因,當我取消註釋數據時,代碼將會出錯。順便說一句,我只是簡單地削弱了一幅圖像,而這正是我迄今爲止所提出的。

回答

4

當取消註釋那些你會然後「就地」進行修改data[]和,因爲要執行鄰域操作,即修改的數據將被重新用作隨後的迭代中的輸入數據,這將陳述當然會導致結果無效。您需要一個單獨的輸出圖像來將這些新值寫入。

+0

是我試圖做的 - 修改數據。嗯,我試圖做到這一點單獨的輸出圖像(克隆圖像,並將其分配給不同的IplImage),但仍然,輸出是相同的 –

+1

好吧,我終於明白你在說什麼。現在代碼作品謝謝! –

+1

將'IplImage'結果克隆到頭部克隆(需要'cvCreateImage'和'cvCopy'才能正確執行)。 cv :: Mat :: clone()要容易得多。 – William

3

您的代碼溢出。

如果你想檢查一個3x3的鄰域,你需要在所有邊上都留出1個像素的邊界。

也,你不能這樣做就地,你需要第二個墊子的結果。

Mat m2 = m.clone(); 

int white = 0; 
int black = 0; 
for (int i = 1; i < height - 1; i++){  // border 
    for (int j = 1; j < width - 1; j++){  // border 
     int total = 0; 
     for (int x = i - 1; x <= i + 1; x++){ 
      for (int y = j - 1; y <= j + 1; y++){ 
       total += data[x*step + y]; 
      } 
     } 
     if (total == (255 * 9)){ 
      white += 1; 
      m2.data[i*step + j] = 255;  // *write* to a 2nd mat 
     } 
     else{ 
      black += 1; 
      m2.data[i*step + j] = 0;  // *write* to a 2nd mat 
     } 
    } 
} 
cout << white << endl << black << endl; 
+0

嗯感謝您的信息!但這並沒有改變任何東西 –