8

我是 OpenCV 的新手。我正在尝试使用迭代器而不是“for”循环,这对我的情况来说太慢了。我尝试了一些这样的代码:

MatIterator_<uchar> it, end;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)
{
    //some codes here
}

我的问题是:如何转换 for 循环,例如:

for ( int i = 0; i < 500; i ++ )
{
    exampleMat.at<int>(i) = srcMat>.at<int>( i +2, i + 3 )
}

进入迭代器模式?也就是说,如何以迭代器形式执行“i +2,i + 3”?我想我只能通过“*it”得到相应的值,但我无法得到它的计数。提前谢谢了。

4

2 回答 2

23

慢的不是 for 循环,而是exampleMat.at<int>(i)进行范围检查的循环。

为了有效地循环遍历所有像素,您可以使用 .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 
    }

}   
于 2012-08-16T04:10:31.237 回答
1

您需要某种计数变量,您必须自己声明和更新它。一种紧凑的方法是

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
}

如果您正在寻找超快速访问但是我建议您自己操作数据指针。有关迭代速度的详细说明,请参阅第 51 页的OpenCV 2 计算机视觉应用程序编程食谱(pdf 中的 65)。您的代码可能看起来像

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++;
}
于 2012-08-16T00:50:09.460 回答