OpenCV的:矩阵迭代(OpenCV: Matrix Iteration)

2019-06-27 02:14发布

我是新来的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”的迭代器形式? 我只能用“*它”我认为得到相应的价值,但我无法得到它的流水号。 提前谢谢了。

Answer 1:

这不是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 
    }

}   


Answer 2:

你需要某种计数变量,你会不得不宣布和自己更新。 这样做的一种简洁的方式将

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++;
}


文章来源: OpenCV: Matrix Iteration