前言
解决这个问题耗费了一点时间,故记录之。
GDAL几乎支持所有的图片,栅格,遥感影像格式,但算法相对Opencv较少,并且支持“空间参考”,而Opencv恰恰相反,所以如果把二者结合,岂不美哉?百度上主要有两个版本,一个是李民录老师的基于Opencv1写的构建Iplimg,可以支持一个波段跟3个波段,还有一个版本是基于opencv2版本写的,通过构建CVMat类型,然后再拷贝到Mat格式,本程序直接初始化Mat,并且支持多个波段(通道)。最后提一点,在Opencv3中集成了GDAL,大势所趋,哈哈。
代码
//作者:山科_xxin; //时间:2017年3月22日22:35:14; //功能:<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>到Opencv转换; //类别:<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>、OPencv; #include<opencv2\highgui\highgui.hpp> #include<stdlib.h> #include<gdal_priv.h> #include<cpl_conv.h> #include<iostream> using namespace cv; using namespace std; int main() { Mat srcimg; GDALDataset *poDataset; const char *pszFilename= "G:\\opencv\\test.jpg"; GDALAllRegister(); poDataset = (GDALDataset*)GDALOpen(pszFilename,GA_ReadOnly); int width = poDataset->GetRasterXSize(); int height = poDataset->GetRasterYSize(); int nband = poDataset->GetRasterCount(); GDALRasterBand *bandData; float *p = new float[width*height]; vector<Mat> imagesT; for(int i = nband;i>0;i--) { bandData = poDataset->GetRasterBand(i); GDALDataType DataType = bandData->GetRasterDataType(); bandData->RasterIO(GF_Read,0,0,width,height,p,width,height,DataType ,0,0); Mat HT(height,width,CV_8UC1,p); imagesT.push_back(HT.clone()); } Mat Timg; Timg.create(width,height,CV_32FC3); merge(imagesT,Timg); GDALClose((GDALDatasetH)poDataset); imagesT.clear(); srcimg = imread(pszFilename); imshow("OPencv",srcimg); imshow("GDAL",Timg); cv::waitKey(0); std::system("pause"); return 0; }
结果:
后语
以前的文章都有参考文章,我的每篇文章都有参考文章,我也想写参考,但是有时参考太多了,并且打开后,过后就关了,没有记下来,所以就没有记下来,但是还是网络资源促我写成了代码,所谓“网络资源是无限的”。