OpenCV的执行速度(for loops和meanStdDev)
OpenCV execution speed (for loops and meanStdDev)
我对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的时间。
相关文章:
- 如何在自定义类中启用'auto loops'?
- 需要帮助定义循环控制变量(while loops)C++
- opencv::meanStdDev with vector<vector<double>>
- C 用于IF-Statments和while-loops的短路
- C++ and for/in (?) loops
- Xcode 调试不显示 for- 或 while-loops
- Range-for-loops 和 std::vector<bool>
- 为什么"% for loops"与求和算法相比内存成本相对较高?
- 如何使我的自定义类型与"range-based for loops"一起使用?
- OpenCV的执行速度(for loops和meanStdDev)
- GPU for loops:避免扭曲发散和隐式同步线程
- Arduino timed void draw() loops
- Difference in two for nested loops.(C++)