2014-02-21 96 views
0

我正在使用以下代碼從圖像訪問[5x5]塊。但我得到一個[15x5]塊與每個元素重複三次。任何人都可以指出這個代碼中的錯誤。? 我在下面的鏈接中詢問了有關如何訪問元素的問題。 How to access first 5*5 block from an image in open cv?使用C++訪問打開的cv中的圖像元素

for(int m=0;m<10;m++) 
{ 
    for(int n=0;n<90;n++) 
    { 
     int block_width = Ns; 
     int block_height = Ns; 
     int roi_origin_x = m; 
     int roi_origin_y = n; 
     cv::Rect roi(roi_origin_x, roi_origin_y, block_width, block_height); 
     cv::Mat region = obtained_mask(roi); 
     std::cout<< " region " <<region<< std::endl; 
    } 
} 
+1

如果分別指定'Ns'和'obtain_mask'值和類型,會更好。 – Mohammad

+0

Ns = 5,acquire_mask的類型是double; – kadu

回答

1

看來,你的形象是灰度化,你正試圖從一個文件作爲RGB圖像加載它。所以你在每個頻道都有重複的強度值。 RGB中每個通道的等值表示灰色(從白色到黑色,在RGB立方體的對角線上移動)。您可以使用cvtColorregion轉換爲灰度圖像,或者您可以檢索第一個通道region的像素,這會降低處理週期時間。

1

它可能與您的圖像的RGB通道做。

嘗試以下操作:

int block_width = Ns; 
int block_height = Ns; 
for(int roi_origin_y=0; roi_origin_y<90; ++roi_origin_y) 
{ 
    for(int roi_origin_x=0; roi_origin_x<10; ++roi_origin_x) 
    { 
     if(roi_origin_y+block_width>=obtained_mask.rows || roi_origin_x+block_height>=obtained_mask.cols) 
      break; 
     cv::Mat region(block_height,block_width,obtained_mask.type()); 
     for(int dy=0; dy<block_height; ++dy) 
     { 
      for(int dy=0; dy<block_height; ++dy) 
      { 
       for(int k=0; k<obtained_mask.channels(); ++k) 
        region(dy,obtained_mask.channels()*dx+k) = obtained_mask(roi_origin_y+dy,obtained_mask.channels()*(roi_origin_x+dx)+k); 
      } 
     } 
     // TODO: process NsxNs block stored in region 
    } 
}