前言
解决这个问题耗费了一点时间,故记录之。
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();
<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>RasterBand *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);
<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>Close((GDALDatasetH)poDataset);
imagesT.clear();
srcimg = imread(pszFilename);
imshow("OPencv",srcimg);
imshow("GDAL",Timg);
cv::waitKey(0);
std::system("pause");
return 0;
}
结果:

后语
以前的文章都有参考文章,我的每篇文章都有参考文章,我也想写参考,但是有时参考太多了,并且打开后,过后就关了,没有记下来,所以就没有记下来,但是还是网络资源促我写成了代码,所谓“网络资源是无限的”。



