VS2013+OPENCV+GDAL處理多光譜數據
阿新 • • 發佈:2018-01-09
stream bsp clear can 研究 gda 元素 ims let
目前在研究高光譜圖像處理。與普通圖像不同,高光譜圖像是多波段的圖像,而OPENCV只能直接處理至多3維的圖像,所以要依賴GDAL庫來處理高光譜圖像。思路就是:根據文件名獲得其GDALDataset數據集,然後分波段(波段相當於通道)存儲在格式為Vector<cv::Mat>的容器內,最後利用MAT的Merge函數,對通道數據進行組合。以上方法適合任意波段數據,對多光譜和高光譜數據比較實用。
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include<gdal.h> #include <gdal_priv.h> #include <gdal_alg.h> #include <highgui.h> #include <vector> using namespace cv; using namespace std; 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 <cv::Mat>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<Mat> band; img=GDAL2Mat("E:/raw.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; }
VS2013+OPENCV+GDAL處理多光譜數據