首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高性能OpenCV矩阵从16UC 3到8UC3的转换

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

Stack Overflow用户
提问于 2019-11-28 08:39:58
回答 1查看 822关注 0票数 1

我有一个OpenCV CV_16UC3矩阵,其中每个信道只占用较低的8比特。我想从它创建一个CV_8UC3。目前,我使用这种方法:

代码语言:javascript
复制
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);

  • De-Mosaiking -> cv::cvtColor(mat16uc1_bayer, mat16uc3_rgb, cv::COLOR_BayerGR2BGR);中安装原始字节缓冲区的

需要0.008808s

  • pixel移位( 16位中只有12位被占用,但我们只需要8位) ->使用openCV对像素使用mat16uc3_rgb.forEach<>的并行访问

需要0.004927s

  • conversion从CV_16UC3到CV_8UC3 mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);需要0.006913 s

我认为,如果没有将原始缓冲区转换为CvMat或去透明化,我就无法做到这一点。像素移动可能不会进一步加速(这里已经使用了并行化的forEach() )。我希望在从CV_8UC3转换到CV_16UC3时,可以更新矩阵头信息或类似的信息,因为矩阵数据已经正确,不再需要缩放或类似。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 09:31:32

我认为您可以安全地假设cv::Mat::convertTo是该操作最快的实现。看到你从一个颜色空间到另一个颜色空间,它很可能不会是一个零成本的操作。重新排列需要内存副本。

如果您正在设计一个非常高性能的系统,您应该对您的瓶颈进行深入分析,并重新设计您的系统以尽量减少它们。扪心自问:这个转换在这一点上真的需要吗?我可以通过一个自定义函数将多个操作集成在一起来解决这个问题吗?我可以使用CPU并行扩展,多线程或GPU加速吗?等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59084698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档