gpt4 book ai didi

image - 使用 OpenCV 将 12 位 Bayer 图像转换为 8 位 RGB

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:51 26 4
gpt4 key购买 nike

我正在尝试使用 OpenCV 2.3.1 将 12 位 Bayer 图像转换为 8 位 RGB 图像。这看起来应该使用 cvCvtColor 函数相当简单,但是当我使用以下代码调用它时该函数会抛出异常:

int cvType = CV_MAKETYPE(CV_16U, 1);
cv::Mat bayerSource(height, width, cvType, sourceBuffer);
cv::Mat rgbDest(height, width, CV_8UC3);
cvCvtColor(&bayerSource, &rgbDest, CV_BayerBG2RGB);

我以为我跑过了 sourceBuffer 的末尾,因为输入数据是 12 位的,我不得不传入 16 位类型,因为 OpenCV 没有 12 位类型。所以我将宽度和高度除以 2,但 cvCvtColor 仍然抛出一个异常,其中没有任何有用的信息(错误消息是“未知异常”)。

有一个similar question几个月前发布的问题从未得到解答,但由于我的问题更具体地涉及 12 位拜耳数据,我认为它足够独特,值得提出一个新问题。

提前致谢。

编辑:我一定遗漏了什么,因为我什至无法让 cvCvtColor 函数处理 8 位数据:

cv::Mat srcMat(100, 100, CV_8UC3);
const cv::Scalar val(255,0,0);
srcMat.setTo(val);
cv::Mat destMat(100, 100, CV_8UC3);
cvCvtColor(&srcMat, &destMat, CV_RGB2BGR);

最佳答案

我能够使用以下代码将我的数据转换为 8 位 RGB:

// Copy the data into an OpenCV Mat structure
cv::Mat bayer16BitMat(height, width, CV_16UC1, inputBuffer);

// Convert the Bayer data from 16-bit to to 8-bit
cv::Mat bayer8BitMat = bayer16BitMat.clone();
// The 3rd parameter here scales the data by 1/16 so that it fits in 8 bits.
// Without it, convertTo() just seems to chop off the high order bits.
bayer8BitMat.convertTo(bayer8BitMat, CV_8UC1, 0.0625);

// Convert the Bayer data to 8-bit RGB
cv::Mat rgb8BitMat(height, width, CV_8UC3);
cv::cvtColor(bayer8Bit, rgb8BitMat, CV_BayerGR2RGB);

我曾错误地认为我从相机获取的 12 位数据是紧密打包的,因此两个 12 位值包含在 3 个字节中。事实证明,每个值都包含在 2 个字节中,因此我无需进行任何解包操作即可将我的数据放入 OpenCV 支持的 16 位数组中。

编辑:请参阅@petr 的改进答案,在转换为 8 位之前先转换为 RGB,以避免在转换过程中丢失任何颜色信息。

关于image - 使用 OpenCV 将 12 位 Bayer 图像转换为 8 位 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10403841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com