0

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

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

这是我拥有的代码片段。

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,我是否正在阅读和正确上传数据以进行去马赛克,为去马赛克提供什么颜色代码,以及如何下载结果以显示并保存到文件(最好是编写 png 或类似文件的高级例程)。

有谁知道我是否在正确的轨道上?

谢谢!詹姆士

4

1 回答 1

0

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

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 位中,这使得处理起来容易得多。

于 2020-09-09T22:53:01.827 回答