我是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”获得相应的值,但我无法得到它的计数数字。 提前谢谢了。
答案 0 :(得分:21)
执行范围检查的exampleMat.at<int>(i)
不是for循环慢。
要有效地遍历所有像素,您可以使用.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
}
}
答案 1 :(得分: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++;
}