Opencv::normalize太慢了,怎么办?

kd3sttzy  于 2023-11-22  发布在  其他
关注(0)|答案(1)|浏览(244)

cv::Mat fixFreImg = averMat.clone(); //fixFreImg.row=3000 fixFreImg.cols=3000 cv::normalize(fixFreImg, fixFreImg, 0, 255, cv::NORM_MINMAX, CV_8U);这段代码花了283 ms
我使用的环境是C++,MSVC 2017,Opencv4.1.3希望减少这段代码的时间,我没有GPU,无法使用CV_CUDA,大家有什么意见吗?=

  1. // 创建输出图像
  2. cv::Mat normalizedImg(fixFreImg.size(), CV_8U);
  3. // 计算归一化参数
  4. double minVal, maxVal;
  5. cv::minMaxLoc(fixFreImg, &minVal, &maxVal);
  6. double alpha = 255.0 / (maxVal - minVal);
  7. double beta = -minVal * alpha;
  8. // 使用OpenMP并行化归一化操作

字符串

pragma omp parallel for num_threads(threads)

  1. for (int i = 0; i < fixFreImg.rows; i++)
  2. {
  3. uchar* ptr = normalizedImg.ptr<uchar>(i);
  4. float* fptr = fixFreImg.ptr<float>(i);
  5. for (int j = 0; j < fixFreImg.cols; j++)
  6. {
  7. ptr[j] = cv::saturate_cast<uchar>(alpha * fptr[j] + beta);
  8. }
  9. }


这段代码花了156毫秒!
我使用openmp来加速归一化,速度有了显著的提高,但也许还需要进一步的加速,比如块计算。

qybjjes1

qybjjes11#

如果您没有CUDA,并且速度很慢,则有几个选项:
如果你有一个英特尔CPU,你可以使用基于英特尔的并行处理库TBB来加速它。
如果您没有支持的系统或在单核上运行,您也可以调整图像大小,然后以较低的分辨率执行归一化。如果需要,您可以迭代地增加分辨率。
如果不需要高精度,也可以将CV_8U转换为4位表示以加快速度。
在最坏的情况下,您还可以使用英特尔神经计算芯片来卸载这些计算。
总的来说,有许多可能的解决方案。

相关问题