我对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秒。
请帮帮我。
答案 0 :(得分:1)
回答你的问题和一些评论:在发布模式下编译lib肯定会增加计算时间,这取决于它所依赖的顺序,例如,如果你使用eigen它可能会加速很多事情。 / p>
如果你真的想自己做循环,可以考虑直接指向数据的行指针mat.data
或mat.ptr<cv::Vec3b>
。
如果您想加快在图像的任何部分计算mean / stdDev的任务,请使用integral images。该文档非常清楚,我非常确定它甚至可能在调试模式下花费不到2.5秒。