我是新来的OpenCV。 我想用迭代器而不是“for”循环,这是我的情况太慢。 我尝试一些像这样的代码:
MatIterator_<uchar> it, end;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)
{
//some codes here
}
在这里我的问题是:我怎么可以转换为类似循环:
for ( int i = 0; i < 500; i ++ )
{
exampleMat.at<int>(i) = srcMat>.at<int>( i +2, i + 3 )
}
进入迭代器模式? 也就是说,我该怎么办了“我+2,我+ 3”的迭代器形式? 我只能用“*它”我认为得到相应的价值,但我无法得到它的流水号。 提前谢谢了。
这不是for循环是慢它是exampleMat.at<int>(i)
这是做范围检查。
为了efficently遍历所有像素,你可以在每一行与.ptr开始得到的指针数据()
for(int row = 0; row < img.rows; ++row) {
uchar* p = img.ptr(row);
for(int col = 0; col < img.cols; ++col) {
*p++ //points to each pixel value in turn assuming a CV_8UC1 greyscale image
}
or
for(int col = 0; col < img.cols*3; ++col) {
*p++ //points to each pixel B,G,R value in turn assuming a CV_8UC3 color image
}
}
你需要某种计数变量,你会不得不宣布和自己更新。 这样做的一种简洁的方式将
int i = 0;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it,i++)
{
//some codes here involving i+2 and i+3
}
如果您正在寻找超快速访问,但是我会建议操纵数据指针自己。 对于迭代速度看2 OpenCV的计算机视觉应用编程食谱 51页(65 PDF格式)的很好的解释。 然后,您的代码可能看起来LIK
cv::Mat your_matrix;
//assuming you are using uchar
uchar* data = your_matrix.data();
for(int i = 0; i < some_number; i++)
{
//operations using *data
data++;
}