我对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的时间。