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