【问题标题】:OpenCV (C++): how to save a 16bit image?OpenCV(C++):如何保存 16 位图像?
【发布时间】:2014-11-10 16:43:37
【问题描述】:

我正在使用 kinect,我需要保存 RAW 深度图像。这意味着我不应该通过转换为 8 位来保存它(这就是 imwrite 正在做的事情!),而是将其保存为 16 位,而不会减少任何位深度。我希望这个问题不会太琐碎,但我是 OpenCV 编程的新手。我尝试了以下方法,但它不起作用:

[...]

Mat imageDepth ( 480, 640, CV_16UC1 );
Mat imageRGB;

// Video stream settings
VideoCapture capture;
capture.open( CAP_OPENNI );

if ( !capture.isOpened() ) {
  cerr << "Cannot get video stream!" << endl;
  exit ( EXIT_WITH_ERROR );
}

if ( !capture.grab() ) {
  cerr << "Cannot grab images!" << endl;
  exit ( EXIT_WITH_ERROR );
}

// Getting frames
if ( capture.retrieve( imageDepth, CAP_OPENNI_DISPARITY_MAP ) ) {
  imwrite( fileDepth, imageDepth );
}
if( capture.retrieve( imageRGB, CAP_OPENNI_BGR_IMAGE ) ) {
  imwrite( fileRGB, imageRGB );
}

return EXIT_WITH_SUCCESS;

提前致谢。

【问题讨论】:

  • Have you read the documentation? "函数imwrite将图像保存到指定文件。图像格式根据文件扩展名选择(扩展名列表见imread() ). 只有 8 位(或在 PNG、JPEG 2000 和 TIFF 的情况下为 16 位无符号 (CV_16U))单通道或 3 通道(具有“BGR”通道顺序)图像可以使用此功能保存。”
  • 尝试另存为 png 或 tiff
  • 确实,我阅读了文档,实际上我已经放入了 CV_16UC1 并将图像保存为 PNG。但是图像仍然是8bit!编辑:你能告诉我这段代码有什么问题吗,假设 fileDepth 有 .png 作为扩展名?非常感谢
  • 有没有办法用 Emgu CV 做到这一点???我想将我的图像保存为 16 位深度的 tiff。有什么帮助???

标签: c++ opencv kinect


【解决方案1】:

问题不在于图片的保存方式,没关系(如果有人遇到同样的问题,请务必保存为PNG/TIFF格式并在读取时指定CV_16UC1)。 由于VideoCapture,它没有保存为16bit;事实上我做了以下事情:

if ( capture.retrieve( imageDepth, CAP_OPENNI_DISPARITY_MAP ) ) {
   imwrite( fileDepth, imageDepth );
}

但正确的做法是:

if ( capture.retrieve( imageDepth, CAP_OPENNI_DEPTH_MAP ) ) {
  imwrite( fileDepth, imageDepth );
}

所以这是一个愚蠢的问题。
感谢所有试图帮助我的人。

【讨论】:

    【解决方案2】:

    我在 opencv 中的 imwrite 似乎不支持 16 位图像存储。所以,我使用了 OpenCV FileStorage 类。

    接下来是相关代码sn-p。 写作:

    cv::FileStorage fp("depth_file.xml", cv::FileStorage::WRITE);
    fp << "dframe" << dframe;
    fp.release();
    

    阅读:

    cv::FileStorage fs(dframeName, cv::FileStorage::READ);
    if( fs.isOpened() == false)
    {
        cerr<< "No More....Quitting...!";
        return 0;
    }
    fs["dframe"] >> dframe;
    

    【讨论】:

    • 这是 OpenCV 的一个非常有用的功能,但我仍然不太清楚他们为什么不允许,例如,保存签名的 PNG? libpng似乎支持它。
    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2014-10-18
    • 2011-01-18
    • 2012-06-13
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多