用GDAL和OpenCV编写RGB 16位图像
write a RGB 16 bits image with GDAL and OpenCV
我需要用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文件时,我可以分离频带。
值得注意的是,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 );
相关文章:
- 将浮动的heightmap数组导出为16位原始值
- 宽度为奇数的16位纹理为片状
- OpenGL 16 位模板缓冲区?
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 16 位到 10 位转换代码说明
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- C++将 16 位值转换为 32 位值
- 24 位地址和 24 位算术与 24 位地址与 16 位地址算术之间的区别?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- AVX2 SIMD Instrinsics 16 位到 8 位,反之亦然
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- OpenCV 实感 16 位深度图像
- 24位图图像和16位图图像中的RGB颜色
- 将 RGB 存储在无符号的 16 位整数中
- 用GDAL和OpenCV编写RGB 16位图像
- NDK-在C++中创建16位rgb结构