从 16UC3 到 8UC3 的高性能 OpenCV 矩阵转换
High performance OpenCV matrix conversion from 16UC3 to 8UC3
我有一个OpenCVCV_16UC3
矩阵,其中每个通道只有较低的8Bit被占用。我想从中创建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.008808[s]像素偏移(16 位中只有 12 位被占用,但我们只需要其中的 8 位( -> 使用 openCV 并行访问像素,使用
mat16uc3_rgb.forEach<>
需要 0.004927[s]从CV_16UC3到CV_8UC3的转换
mat16uc3_rgb.convertTo(mat8uc3_rgb, CV_8UC3);
需要 0.006913[s]
我想如果没有将原始缓冲区转换为 CvMat 或演示,我将无法做到。像素偏移可能不会进一步加速(这里已经使用了并行化的 forEach((。我希望在从CV_8UC3
转换为CV_16UC3
时可以更新矩阵标题信息或类似信息,因为矩阵数据已经正确,不必再缩放或类似。
我认为您可以放心地假设cv::Mat::convertTo
是该操作的最快实现。 看到你从一个色彩空间到另一个色彩空间,这可能不是一个零成本的操作。重新排列需要内存副本。
如果您正在设计一个非常高性能的系统,您应该对瓶颈进行深入分析,并重新设计您的系统以尽量减少它们。问问自己:此时真的需要这种转换吗?我可以通过制作一个将多个操作集成在一起的自定义函数来解决吗?是否可以使用 CPU 并行扩展、多线程或 GPU 加速?等。
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 将 OpenCV 2 中的ANN_MLP代码转换为 OpenCV 3 代码
- OpenCV - 如何将灰度转换为彩色(CV_8UC3)?
- 将 OpenCV-Matrix 转换为矢量
- 将 opencv 从 2.4.13 转换为 3.3.1 时由 cv::resize() 引起的运行错误
- 从 16UC3 到 8UC3 的高性能 OpenCV 矩阵转换
- HALCON到OpenCV失真系数的转换
- 将节点数组(可变长度)转换为常量浮点**以调用opencv.calcHist
- 如何将垫子转换为 int?(c++,gpu,OpenCV)
- 如何将OpenCV图像数据从Python转换为C++?
- OpenCV转换到慢
- 将OpenCV转换为JavaCV-需要函数cvHoughLines2()中的帮助
- Matlab 到 OpenCV 转换的示例
- 如何将IplImage opencv转换为字节数组(bmp格式)C++
- OpenCV转换图像到字节和回来
- Opencv:转换垫IplImage为cvLabel
- OpenCV转换使用棋盘
- opencv 转换到不起作用
- Android OpenCV -转换OpenCV c++代码到Android,以检测QR码对齐方块