написать 16-битное изображение RGB с помощью GDAL и OpenCV

Мне нужно написать изображение RGB с компонентами R, G, B (Mat Type of OpenCV). У меня есть код, который работает с GDT_Byte, но если я перейду на GDT_UInt16, он больше не будет работать.

metadata_info=(GDALDataset*)GDALOpen(fname.c_str(),GA_ReadOnly);
metadata_info->GetGeoTransform(adfGeoTransform);

target = poDriver->Create(fname_t.c_str(),sX,sY,3,GDT_UInt16,NULL);
target->SetGeoTransform(GT);
target->SetProjection( metadata_info->GetProjectionRef() );

band = target->GetRasterBand(1);
band->RasterIO(GF_Write,0,0,sX,sY,(void *)R.data,sX,sY,GDT_UInt16,0,0);

band = target->GetRasterBand(2);
band->RasterIO(GF_Write,0,0,sX,sY,(void *)G.data,sX,sY,GDT_UInt16,0,0);

band = target->GetRasterBand(3);
band->RasterIO(GF_Write,0,0,sX,sY,(void *)B.data,sX,sY,GDT_UInt16,0,0);

Если я работаю с изображениями с 8 битами и меняю GDT_UInt16 на GDT_Byte и GUInt16 на GByte, у меня нет проблем.

* Примечание. Проблема не в загрузке изображений (я думаю), поскольку я априори пишу с помощью opencv изображение RGB. Я читаю компоненты изображений с помощью: (я работаю в архитектуре x64)

img=imread(fname_B.c_str(),CV_LOAD_IMAGE_UNCHANGED|CV_LOAD_IMAGE_ANYDEPTH);
B = Mat(img);

Я также пробовал этот код для чтения R, G и B:

poDataset=(GDALDataset*) GDALOpen(fname.c_str(),GA_ReadOnly);
poBand=poDataset->GetRasterBand(1);
sX=poBand->GetXSize(); sY= poBand->GetYSize();
B=Mat(nYSize, nXSize, CV_16UC1);
poBand->RasterIO(GF_Read,0,0,sX,sY,(void*)B.data,sX,sY,GDT_UInt16,0,0);

Кроме того, результат GDALINFO:

Driver: GTiff/GeoTIFF
Files: test_gdal.tif
Size is 7611, 7761
...
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
...
Band 1 Block=7611x1 Type=UInt16, ColorInterp=Gray
Band 2 Block=7611x1 Type=UInt16, ColorInterp=Undefined
Band 3 Block=7611x1 Type=UInt16, ColorInterp=Undefined

Я заметил, что проблема заключается только в интерпретации, потому что, когда я открываю созданный файл RGB, я могу разделить полосы.


person Pavel Angel Mendoza Villafane    schedule 10.07.2014    source источник
comment
Я заметил, что проблема заключается только в интерпретации, потому что, когда я открываю созданный файл RGB, я могу разделить полосы.   -  person Pavel Angel Mendoza Villafane    schedule 10.07.2014
comment
try: img = imread(fname_B.c_str(),CV_LOAD_IMAGE_UNCHANGED|CV_LOAD_IMAGE_ANYDEPTH); // также избегайте устаревших функций c-api   -  person berak    schedule 10.07.2014
comment
Спасибо, но проблема все же у меня.   -  person Pavel Angel Mendoza Villafane    schedule 11.07.2014
comment
Я отредактировал код и попытался внести некоторые изменения (если вы можете взглянуть на них .. спасибо)   -  person Pavel Angel Mendoza Villafane    schedule 11.07.2014


Ответы (1)


Одно замечание: бета-версия OpenCV 3.0 поддерживает загрузку изображений напрямую с помощью imread с использованием привязок GDAL.

https://github.com/Itseez/opencv/blob/master/samples/cpp/tutorial_code/HighGUI/GDAL_IO/gdal-image.cpp

/// Load generic image as 8-bit color
cv::Mat image = cv::imread(argv[1], cv::IMREAD_LOAD_GDAL | cv::IMREAD_COLOR ); 

/// load a 16-bit image grayscale
cv::Mat dem = cv::imread(argv[2], cv::IMREAD_LOAD_GDAL | cv::IMREAD_ANYDEPTH ); 
person msmith81886    schedule 17.12.2014