我有一个OpenCV CV_16UC3矩阵,其中每个信道只占用较低的8比特。我想从它创建一个CV_8UC3。目前,我使用这种方法:
cv::Mat mat8uc3_rgb(imgWidth, imgHeight, CV_8UC3);
mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);这有期望的结果,但我不知道它是否可以更快或更好的表现。
编辑
整个处理链只有4个子步骤(由视频场景上的QueryPerformanceCounter测量确定的计算时间)。
在OpenCV-Mat:cv::Mat mat16uc1_bayer(imgHeight, RawImageWidth, CV_16UC1, (uint8*)payload);
cv::cvtColor(mat16uc1_bayer, mat16uc3_rgb, cv::COLOR_BayerGR2BGR);中安装原始字节缓冲区的需要0.008808s
mat16uc3_rgb.forEach<>的并行访问需要0.004927s
mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);需要0.006913 s我认为,如果没有将原始缓冲区转换为CvMat或去透明化,我就无法做到这一点。像素移动可能不会进一步加速(这里已经使用了并行化的forEach() )。我希望在从CV_8UC3转换到CV_16UC3时,可以更新矩阵头信息或类似的信息,因为矩阵数据已经正确,不再需要缩放或类似。
发布于 2019-12-02 09:31:32
我认为您可以安全地假设cv::Mat::convertTo是该操作最快的实现。看到你从一个颜色空间到另一个颜色空间,它很可能不会是一个零成本的操作。重新排列需要内存副本。
如果您正在设计一个非常高性能的系统,您应该对您的瓶颈进行深入分析,并重新设计您的系统以尽量减少它们。扪心自问:这个转换在这一点上真的需要吗?我可以通过一个自定义函数将多个操作集成在一起来解决这个问题吗?我可以使用CPU并行扩展,多线程或GPU加速吗?等。
https://stackoverflow.com/questions/59084698
复制相似问题