2016-01-10 74 views
0

我有Matces数据访问问题。我在图片上执行操作,并且需要分离地访问每个像素。 我必须对简单类型(float,int等)进行必要的操作。 我accesing数据的方法是象下面这样:OpenCv垫到阵列访问

for (int idx = 0; idx < image.rows; idx++) { 
     for (int idy = 0; idy < image.cols; idy++) { 
      int color_tid = idx * image.cols * image.channels() + idy * image.channels(); 
      uint8_t blue = image.data[color_tid]; 
      uint8_t green = image.data[color_tid + 1]; 
      uint8_t red = image.data[color_tid + 2]; 
      float pixelVal = (int) blue + (int) green + (int) red; 
      (...) 
     } 
    } 

这种方法是否正常工作只方形的图像(N×N像素),但对于N×M个有正方形区域(小刃)之外的异常。 有谁知道任何其他方式来访问图片垫的数据? 示例图片(正确的结果):

enter image description here

异常(我的问题)

enter image description here

+2

没有看到所有的代码,很难说这是怎么回事。然而,在你的循环内,你可以写:'Vec3b v = image(row,col); float pixelVal = v [0] + v [1] + v [2];'。还要记住_rows_是_y_坐标,而_cols_是_x_。所以你可能只是换了你的指数。 – Miki

+0

Vec3b v不是简单的类型...我必须使用image.data –

+0

你**必须** ....是功课还是什么? – Miki

回答

1

我建议遵循data layoutMat

enter image description here

所以你的循环变成:

for (int r = 0; r < img.rows; ++r) 
{ 
    for (int c = 0; c < img.cols; ++c) 
    { 
     uchar* ptr = img.data + img.step[0] * r + img.step[1] * c; 
     uchar blue = ptr[0]; 
     uchar green = ptr[1]; 
     uchar red = ptr[2]; 

     float pixelVal = blue + green + red; 
    } 
} 

最后,您可以执行像少一些操作:

for (int r = 0; r < img.rows; ++r) 
{ 
    uchar* pt = img.data + img.step[0] * r; 
    for (int c = 0; c < img.cols; ++c) 
    { 
     uchar* ptr = pt + img.step[1] * c; 
     uchar blue = ptr[0]; 
     uchar green = ptr[1]; 
     uchar red = ptr[2]; 

     float pixelVal = blue + green + red; 
    } 
} 
+0

Thx为回应,但您的方法会产生像我一样的问题。明天我会详细检查它,并会写出如果确切的问题 –

+0

@ jak5z这工作正常,并且还处理非连续的矩阵。但是你的方法在连续矩阵上工作正常,所以我敢打赌,问题在于你如何传递数据。再次,没有[mcve],很难说。 – Miki

+0

我没有使用这个metod,但我知道很好。谢谢 –

1

在你的问题中的代码包含了一些缺陷:

  • 行和列被交换(行是Y,列是X)
  • 行之间的步长(又名“步幅”)并不总是等于列

使用Mat::at<>的数量使得代码更简单:

for(int row = 0; row < image.rows; ++row) 
{ 
    for(int col = 0; col < image.cols; ++col) 
    { 
     const Vec3b& pt = image.at<Vec3b>(row, col); 
     float pixelVal = pt[0] + pt[1] + pt[2]; 
     ...  
    } 
} 
+0

const Vec3b&pt = image.at (row,col);不是简单的类型...我必须使用image.data –

+0

@ jak5z:Miki的解决方案也应该为你工作。我很惊讶它没有。 – alexm