您的位置:首页 > 编程语言 > Java开发

Java实现GDAL读取TIF并转换为OpenCV(Mat格式)

2017-07-18 14:13 911 查看
Java实现GDAL读取本地图像

Java实现GDAL读取内存中图像

Java实现GDAL读取图像转OpenCV支持格式Mat

前言

GDAL可以支持多种影像格式,而OpenCV则可以对影像进行多种操作处理,所以将GDAL与OpenCV结合可以增强影像处理。虽然OpenCV可以读取tif等多种格式,但是在Java中涉及到读取hadoop的value值,读取内存中的影像数据GDAL仍然具有优势。所以本文给出Java操作GDAL读取本地图像、内存中图像的代码。作者本身利用以下代码在hadoop的map中读取value(存储的三波段遥感影像),转换成Mat格式,并使用OpenCV-2.4.9进行meanshift分割。

1.读取内存中影像

//使用OpenCV for Java
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

//使用GDAL读取value中的遥感影像
byte[] bytes=value.getBytes();
gdal.AllRegister();
String memFileName="/vsimem/inmenfile";
gdal.FileFromMemBuffer(memFileName, bytes);
Dataset ds=gdal.Open(memFileName, gdalconstConstants.GA_ReadOnly);

//判断是否非空
if(ds==null||ds.GetRasterCount()==0){
return;
}

int xSize=ds.getRasterXSize();
int ySize=ds.getRasterYSize();

byte[] dataArrayR = new  byte[xSize*ySize];
byte[] dataArrayG = new  byte[xSize*ySize];
byte[] dataArrayB = new  byte[xSize*ySize];

int[] bandR=new int[]{1};
int[] bandG=new int[]{2};
int[] bandB=new int[]{3};

int dataType = ds.GetRasterBand(1).GetRasterDataType();

ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayR, bandR, 0);
ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayG, bandG, 0);
ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayB, bandB, 0);

//GDAL to Mat
Mat originalImage=new Mat(ySize, xSize, CvType.CV_8UC3);

for(int j=0;j<ySize;j++){
for(int k=0;k<xSize;k++){
originalImage.put(j, k, new byte[]{dataArrayB[j*xSize+k],dataArrayG[j*xSize+k],dataArrayR[j*xSize+k]});
}
}


读取本地影像

如果要读取本地文件则更为简单,读取使用以下代码:

String INPUT_PATH="/home/hadoop/Desktop/testTIF";
//使用OpenCV for Java
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//注册GDAL
gdal.AllRegister();
//支持中文路径
gdal.SetConfigOption("gdal_FILENAME_IS_UTF8", "YES");
//只读方式读取数据
Dataset ds=gdal.Open(INPUT_PATH,gdalconstConstants.GA_ReadOnly);
//判断是否非空
if(ds==null||ds.GetRasterCount()==0){
return;
}

int xSize=ds.getRasterXSize();
int ySize=ds.getRasterYSize();

byte[] dataArrayR = new  byte[xSize*ySize];
byte[] dataArrayG = new  byte[xSize*ySize];
byte[] dataArrayB = new  byte[xSize*ySize];

int[] bandR=new int[]{1};

a3a8
int[] bandG=new int[]{2};
int[] bandB=new int[]{3};

int dataType = ds.GetRasterBand(1).GetRasterDataType();

ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayR, bandR, 0);
ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayG, bandG, 0);
ds.ReadRaster(0, 0, xSize, ySize, xSize, ySize, dataType, dataArrayB, bandB, 0);

//GDAL to Mat
Mat originalImage=new Mat(ySize, xSize, CvType.CV_8UC3);

for(int j=0;j<ySize;j++){
for(int k=0;k<xSize;k++){
originalImage.put(j, k, new byte[]{dataArrayB[j*xSize+k],dataArrayG[j*xSize+k],dataArrayR[j*xSize+k]});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: