OpenCV的执行速度(for loops和meanStdDev)

OpenCV execution speed (for loops and meanStdDev)

本文关键字:loops meanStdDev for 执行 速度 OpenCV      更新时间:2023-10-16

我对OpenCV和c++相当陌生(在MATLAB和LabView上做了公平的图像处理后,现在学习它)。

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

下面是代码的核心:

    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;

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

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

请帮帮我。

回答你的问题和一些评论:在发布模式下编译库肯定会增加计算时间,这取决于什么顺序,例如,如果你使用的是特征,它可能会加快很多。

如果你真的想自己做循环,考虑直接获取数据的行指针mat.data,或mat.ptr<cv::Vec3b>

如果你想在你的图像的任何部分上加速计算mean/stdDev的任务,那么使用积分图像。文档对此非常清楚,我很确定即使在调试模式下,它也将花费不到2.5s的时间。