Rav*_*yay 14 c++ opencv getpixel mat
我正在寻找一种从Mat(或Mat3b)变量编辑/读取像素的有效方法.
我用过 :-
Image.at<Vec3b>(i,j)
Run Code Online (Sandbox Code Playgroud)
但它似乎很慢.
我也用过这个: -
A.data[A.channels()*A.cols*i + j + 0]
Run Code Online (Sandbox Code Playgroud)
但我面临的问题是当我运行这个循环时
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;
}
}
Run Code Online (Sandbox Code Playgroud)
只有一部分图像变黑了.
sie*_*hie 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于填充,不能保证存储器的布局是连续的.所以根据这个你应该使用这样的公式:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ric 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]);
}
}
Run Code Online (Sandbox Code Playgroud)