我正在寻找一种有效的方法来编辑/读取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;
}
}
只有图像的一部分变黑。
在这里您可以看到快速元素访问的一些可能性。
但如果你想按照自己的方式来做,你需要加一个括号。否则,索引计算不正确:
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;
}
}
这是从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]);
}
}