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

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

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,大家有什么意见吗?=

// 创建输出图像
    cv::Mat normalizedImg(fixFreImg.size(), CV_8U);
    // 计算归一化参数
    double minVal, maxVal;
    cv::minMaxLoc(fixFreImg, &minVal, &maxVal);
    double alpha = 255.0 / (maxVal - minVal);
    double beta = -minVal * alpha;

    // 使用OpenMP并行化归一化操作

字符串

pragma omp parallel for num_threads(threads)

for (int i = 0; i < fixFreImg.rows; i++)
    {
        uchar* ptr = normalizedImg.ptr<uchar>(i);
        float* fptr = fixFreImg.ptr<float>(i);

        for (int j = 0; j < fixFreImg.cols; j++)
        {
            ptr[j] = cv::saturate_cast<uchar>(alpha * fptr[j] + beta);
        }
    }


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

qybjjes1

qybjjes11#

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

相关问题