Opencv读取多光谱(高光谱)数据(1)

高维的数据无法用opencv直接处理,用imread函数发现也只读取了3维里写一下经验。
其一是读取img或tif等格式的高光谱数据。需要使用GDAL库,我所用的编译器是visual studio2010.可以在下面的链接下载编译好的GDAL库:http://download.csdn.net/download/banach_i/9481657
把下载的三个文件放在所建项目的目录文件夹内(也就是包含*.vcxproj文件的那个文件夹),然后在视图-属性页-配置属性-链接器-输入-附加依赖项中填入gdal_i.lib;%(AdditionalDependencies);
如图:
(https://img-blog.csdn.net/20160405153452789)。接着引用头文件

#include "gdal_include/gdal_priv.h"
include "gdal_include/gdal.h"

代码:`#include “gdal_include/gdal_priv.h”

cv::Mat GDAL2Mat(const char* fileName)
{
GDALAllRegister();
GDALDataset poDataset = (GDALDataset )GDALOpen(fileName,GA_ReadOnly); // GDAL数据集
int Cols = poDataset->GetRasterXSize(); // 列
int Rows = poDataset->GetRasterYSize(); // 行
int BandSize = poDataset->GetRasterCount();//波段数
double *adfGeoTransform = new double[6];
poDataset->GetGeoTransform(adfGeoTransform);

 std::vector  imgMat;  // 定义元素为Mat的vecoter向量,向量的每一个元素存储一个波段的数据
 float *pafScan;   // 存储数据

 for(int i = 0;i< BandSize;i++)
 {
     GDALRasterBand *pBand = poDataset->GetRasterBand(i+1);//读取第i+1个波段的数据
     pafScan = new float[Cols*Rows];
     pBand->RasterIO(GF_Read,0,0,Cols,Rows,pafScan,
                     Cols,Rows,GDT_Float32,0,0);//将第i+1个波段的数据存入pafScan
     cv::Mat A = cv::Mat(Rows,Cols,CV_32FC1,pafScan);//将第i+1个波段的数据存存入A中
     imgMat.push_back(A.clone());
     delete []pBand;
     A.release();
 }
 delete []pafScan;
 cv::Mat img;
 img.create(Rows,Cols,CV_32FC(BandSize));
 merge(imgMat,img);
// GDALClose((GDALDatasetH)poDataset);
imgMat.clear(); 
return img;

}

int main()
{
Mat img;
vector band;
img=GDAL2Mat(“can_tmr1.tif”);//img中含有所有波段的数据
split(img,band);//将img拆分成单个波段存储在band中
cvNamedWindow(“window1”,CV_WINDOW_AUTOSIZE);
imshow(“window1”,band[0]/100);
cvWaitKey(0);
band.clear();
cvDestroyWindow(“window1”);
img.release();
return 0;
}
`
通过上述代码便可以在img中对所有波段进行处理,或通过band[i]对第i个波段进行处理。

你可能感兴趣的:(opencv,visual,studio,opencv,高光谱,多光谱)