从16UC3到8UC3的高性能OpenCV矩阵转换

问题描述 投票:1回答:1

我有一个OpenCV CV_16UC3矩阵,其中每个通道仅占用较低的8Bit。我想从中创建一个CV_8UC3。目前,我使用此方法:

cv::Mat mat8uc3_rgb(imgWidth, imgHeight, CV_8UC3);
mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);

这具有理想的结果,但是我想知道它是否可以更快或更高效地运行。

编辑

整个处理链仅包含4个子步骤(计算时间由视频场景上的QueryPerformanceCounter测量确定的框架时间)

  1. 在OpenCV-Mat中装入原始字节缓冲区:cv::Mat mat16uc1_bayer(imgHeight, RawImageWidth, CV_16UC1, (uint8*)payload);

  2. 去马赛克->cv::cvtColor(mat16uc1_bayer, mat16uc3_rgb, cv::COLOR_BayerGR2BGR);需要0.008808 [s]

  3. 像素移位(仅占用16位中的12位,但我们只需要其中8位)->使用mat16uc3_rgb.forEach<>使用openCV并行访问像素需要0.004927 [s]

  4. 从CV_16UC3转换为CV_8UC3mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);需要0.006913 [s]

我想,如果不将原始缓冲区转换为CvMat或进行去马赛克,我将无能为力。像素移位可能不会进一步加快(这里已经使用了并行化的forEach())。我希望当从CV_8UC3转换为CV_16UC3时,可以更新矩阵标题信息或类似内容,因为矩阵数据已经正确,不必再进行缩放或类似调整。

c++ opencv rgb
1个回答
0
投票

我认为您可以放心地假设cv::Mat::convertTo是该操作的最快实现。看到您正在从一种色彩空间转到另一种色彩空间,这将可能不是零成本的操作。需要内存复制才能重新排列。

如果您要设计一个非常高性能的系统,则应该对瓶颈进行深入分析,并重新设计系统以将其最小化。问问自己:在这一点上真的需要这种转换吗?我是否可以通过制作将多个操作集成在一起的自定义函数来解决此问题?我可以使用CPU并行性扩展,多线程或GPU加速吗?等

© www.soinside.com 2019 - 2024. All rights reserved.