【问题标题】:write a RGB 16 bits image with GDAL and OpenCV使用 GDAL 和 OpenCV 编写 RGB 16 位图像
【发布时间】:2014-07-10 03:20:20
【问题描述】:

我需要用 R、G、B 组件(OpenCV 的 Mat 类型)编写一个 RGB 图像。我有一个可以与 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 文件时,我可以分离波段。

【问题讨论】:

  • 我注意到问题只是解释,因为当我打开创建的 RGB 文件时,我可以分离波段。
  • try: img = imread(fname_B.c_str(),CV_LOAD_IMAGE_UNCHANGED|CV_LOAD_IMAGE_ANYDEPTH); // 也请避免使用过时的 c-api 函数
  • 谢谢,但我还是有问题。
  • 我编辑了代码并尝试了一些更改(如果您可以查看它们..谢谢)

标签: c++ opencv visual-c++ gdal


【解决方案1】:

需要注意的是,OpenCV 3.0 beta 支持使用 GDAL 绑定直接通过 imread 加载图像。

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 ); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多