14

我正在寻找一种有效的方法来编辑/读取 Mat(或 Mat3b)变量中的像素。

我用过 :-

Image.at<Vec3b>(i,j)

但它似乎很慢。

我也用过这个:-

A.data[A.channels()*A.cols*i + j + 0]

但我面临的问题是当我运行这个循环时

for(i=0; j<A.rows; i++){
   for(j=0; j<A.cols; j++){
           A.data[A.channels()*A.cols*i + j + 0] = 0;
           A.data[A.channels()*A.cols*i + j + 1] = 0;
           A.data[A.channels()*A.cols*i + j + 2] = 0;
    }
} 

只有一部分图像变黑。

4

2 回答 2

19

在这里,您可以看到快速元素访问的一些可能性。

但是,如果您想按照自己的方式进行操作,则需要添加一个括号。否则你的索引计算不正确:

for(int i=0; i<A.rows; i++){
   for(int j=0; j<A.cols; j++){
           A.data[A.channels()*(A.cols*i + j) + 0] = 0;
           A.data[A.channels()*(A.cols*i + j) + 1] = 0;
           A.data[A.channels()*(A.cols*i + j) + 2] = 0;
    }
} 

但是由于填充,不能保证内存的布局是连续的。所以根据这个你应该使用这样的公式:

for(int i=0; i<A.rows; i++){
   for(int j=0; j<A.cols; j++){
           A.data[A.step[0]*i + A.step[1]* j + 0] = 0;
           A.data[A.step[0]*i + A.step[1]* j + 1] = 0;
           A.data[A.step[0]*i + A.step[1]* j + 2] = 0;
    }
} 
于 2012-04-02T12:02:04.640 回答
14

这是从 cv::Mat 编辑/读取像素的最有效方法之一。创建指向行的指针(如果需要,可以创建特定通道)

for(int i=0; i<A.rows;i++){
  uchar* rowi = A.ptr/*<uchar>*/(i);
  for(int j=0; j<A.cols; j++){
     doProcessOnPixel(rowi[j]);
  }
}
于 2012-04-02T11:46:47.330 回答