2014-11-10 4 views
3

Я работаю с kinect, и мне нужно сохранить изображение глубины RAW. Это означает, что я не должен сохранять его с преобразованием в 8 бит (это то, что делает imwrite!), Но сохранить его как 16 бит, без уменьшения глубины. Я надеюсь, что этот вопрос не будет слишком тривиальным, но я новичок в программировании OpenCV. Я пробовал следующее, но это не работает:OpenCV (C++): как сохранить 16-битное изображение?

[...] 

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; 

Заранее спасибо.

+2

[? Вы читали документацию] (http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#imwrite) " Функция imwrite сохраняет изображение в указанном файле. ** Формат изображения выбирается на основе расширения имени файла ** (см. Список изменений для имени файла imread()). Только 8-битный (или 16-разрядный без знака (CV_16U) в случае ** PNG, JPEG 2000 и TIFF **) одноканальные или 3-канальные (с порядком канала BGR) могут быть сохранены с помощью этой функции. " – Cornstalks

+1

попробуйте сохранить как png или tiff – berak

+0

Действительно, я прочитал документацию, на самом деле я положил CV_16UC1, и я сохранил изображение как PNG. Но изображение все еще 8 бит! EDIT: не могли бы вы рассказать мне, что не так в этом коде, если предположить, что fileDepth имеет .png как расширение? Большое спасибо –

ответ

4

Проблема была не в том, как было сохранено изображение, все было в порядке (если у кого-то будет такая же проблема, обязательно сохраните в формате PNG/TIFF и укажите CV_16UC1 при чтении). Он не был сохранен как 16 бит из-за VideoCapture; на самом деле я сделал следующее:

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

Но правильный способ сделать это:

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

Так это была глупая проблема.
Спасибо всем, кто пытался мне помочь.

1

Мой imwrite в opencv, похоже, не поддерживает 16-битное хранилище изображений. Итак, я использовал класс FileStorage OpenCV.

Следующий соответствующий фрагмент кода. ЗАПИСЬ:

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; 
+0

Это очень полезная функция OpenCV, но я все еще не совсем уверен, почему они не позволяют, например, сохранять подписанные PNG? Кажется, это поддерживается libpng. –

Смежные вопросы