【发布时间】:2012-05-11 08:13:17
【问题描述】:
我正在尝试使用 OpenCV 2.3.1 将 12 位拜耳图像转换为 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);
【问题讨论】:
-
原来我是遗漏了一些东西。我的同事指出我正在混合 C 和 C++ 调用。将最后一行更改为 cv::cvtColor(srcMat, destMat, CV_RGB2BGR);让一切都像魅力一样运作。我仍在研究将 16 位拜耳数据转换为 8 位 RGB 数据的原始问题,所以如果我找到答案,我会发布更新。
-
cvCvtColor属于旧的 C OpenCV API,但cv::Mat是来自 C++ API 的一个类。混合它们不是一个好主意,您最好只使用一个版本的 API。cv::cvtColor(srcMat, dstMat, COLOR_RGB2BGR)应该适合你。 -
“绿色过滤器外观”可能意味着您指定了错误的拜耳模式。全部尝试。