【问题标题】:OpenCV: Matrix IterationOpenCV:矩阵迭代
【发布时间】:2012-08-15 21:59:18
【问题描述】:

我是 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 ”获得相应的值,但我无法获得它的计数。 提前谢谢了。

【问题讨论】:

    标签: opencv matrix iterator iteration


    【解决方案1】:

    慢的不是 for 循环,而是 exampleMat.at&lt;int&gt;(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 
        }
    
    }   
    

    【讨论】:

    • 亲爱的 Martin Beckett 和 Hammer,非常感谢您的回答。我根据您的建议更改了我的代码,然后我还有两个问题:一个是,我使用了“dstMat ( cv::Range::all(), cv::Range ( i * 5 +1, i * 5 + 4 ) ).setTo ( *data )" 设置 dstMat 值,但 "dstMat" 在循环外全为零。我的第二个问题是:这段代码仍然为每个视频帧使用 70-80 毫秒,但我最多只有 30 毫秒。你有什么主意吗?再次感谢您。
    • 我在这里发布了一个新问题:stackoverflow.com/questions/11989003/…
    • ptr方法有没有办法自动返回与底层数据相同类型的指针?我可以做auto p = img.ptr&lt;int&gt;(row) 但如何替换此语句中的int
    • @winterlight - 不是自动的。存储始终是字节(char),标头定义了您将其视为什么类型 - 编译器不知道。
    【解决方案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
    }
    

    如果您正在寻找超快速访问,但我建议您自己操作数据指针。有关迭代速度的详细说明,请参阅第 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++;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2015-07-09
      • 1970-01-01
      相关资源
      最近更新 更多