【问题标题】:Demosaicing with opencv用opencv去马赛克
【发布时间】:2020-12-26 10:30:13
【问题描述】:

我一直在试图弄清楚如何使用 opencv 去马赛克功能。我安装了 OpenCV 4.4.0 并编译了 CUDA 支持,到目前为止,我认为我需要做的是:

  1. 读入原始图像数据
  2. 将原始图像数据加载到 Mat 对象中
  3. 将 Mat 数据上传到 GpuMat(主机到设备上传)
  4. 马赛克
  5. 将 GpuMat 数据(设备到主机下载)下载到 Mat 对象
  6. 显示或写出结果

这是我拥有的代码的 sn-p。

ifstream ifs("image.raw", ios_base::binary);
ifs.read(buffer, length);
// snip ...buffer contains the entire file...

Mat src_host(6464, 4860, CV_16UC1, buffer);
GpuMat dst, src;
src.upload(src_host);

// Debayer here
cv::cuda::demosaicing(src, dst, COLOR_BayerRG2BGR);

// have a look
Mat result_host;
dst.download(result_host);

namedWindow("Debayered Image", WINDOW_KEEPRATIO);
resizeWindow("Debayered Image", 6464/5, 4860/5);
imshow("Debayered Image", result_host);
waitKey(0);

我有来自每像素 12 位、RGGB、尺寸 6464 x 4860 的相机的原始帧。我不确定如何在宽度和高度方面为 OpenCV 指定这个,给它什么 CV_TYPE,不管我是正确读取和上传数据以进行去马赛克,为去马赛克提供什么 COLOR_code,以及如何下载结果以显示并保存到文件(最好是编写 png 或类似文件的高级例程)。

有人知道我是否走在正确的轨道上吗?

谢谢!詹姆斯

【问题讨论】:

  • 为什么你不直接定义 Mat src_host; 而不是创建类型不正确的 1 通道 Mat ?另外,如果它引发错误,请分享它
  • 我不知道我在做什么。我必须访问十几个网站才能走到这一步。没有抛出错误,结果只是一个黑色的图像。

标签: c++ opencv demosaicing


【解决方案1】:

是的,我在正确的轨道上。行和列被意外交换了,所以更正的代码是:

ifstream ifs("image.raw", ios_base::binary);
ifs.read(buffer, length);
// snip ...buffer contains the entire file...

Mat src_host(4860, 6464, CV_16UC1, buffer);
GpuMat dst, src;
src.upload(src_host);

// Debayer here
cv::cuda::demosaicing(src, dst, COLOR_BayerRG2BGR);

// have a look
Mat result_host;
dst.download(result_host);

namedWindow("Debayered Image", WINDOW_KEEPRATIO);
resizeWindow("Debayered Image", 4860/2, 6464/2);
imshow("Debayered Image", result_host);
waitKey(0);

虽然传感器数据是 12 位的,但每个 12 位都位于 16 位中,这使得处理起来容易得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 2018-08-05
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多