OpenCV执行速度(for loops和meanStdDev)

时间:2014-05-15 16:13:23

标签: c++ performance matlab opencv for-loop

我对OpenCV和C ++相当陌生(如果在MATLAB和LabView上进行图像处理,那么在公平分享后立即学习它。)

我有一个奇怪的问题,我想问你的意见。 我试图做一个相当简单的事情:在灰度图像上移动窗口1x9 stdev(~4500X2000像素)。

这是代码的核心:

    Mat src = imread("E:\\moon project\\Photos\\Skyline testing\\IMGP6043 sourse.jpg");
    Scalar roi_mean, roi_stdev;
    Mat stdev_map(src.rows, src.cols, CV_64FC1,Scalar(0));
    cvtColor(src, src_gray, CV_BGR2GRAY);

    int t = clock();
for (int i = 0; i < src_gray.cols - 1; i++)
{
    for (int j = 0; j < src_gray.rows - 8; j++)
    {           
        meanStdDev(src_gray.col(i).rowRange(j,j+9), roi_mean, roi_stdev);
        stdev_map.at<double>(j, i) = roi_stdev[0];
    }
}
t = clock() - t;
cout << "stdev calc : " << t << " msec" << endl;

现在在前面提到的图像上运行双循环(delta t值)需要35秒,即使我扔掉了meanStdDev并且只为stdev_map.at(j,i)分配一个常量,它仍然需要14秒运行双循环。

我很确定我做错了什么,因为在Labview上用完全相同的数学来咀嚼这个宝宝只需要2.5秒。

请帮帮我。

1 个答案:

答案 0 :(得分:1)

回答你的问题和一些评论:在发布模式下编译lib肯定会增加计算时间,这取决于它所依赖的顺序,例如,如果你使用eigen它可能会加速很多事情。 / p>

如果你真的想自己做循环,可以考虑直接指向数据的行指针mat.datamat.ptr<cv::Vec3b>

如果您想加快在图像的任何部分计算mean / stdDev的任务,请使用integral images。该文档非常清楚,我非常确定它甚至可能在调试模式下花费不到2.5秒。