欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2013下的GDAL库配置及使用

程序员文章站 2022-03-20 13:16:40
...

1.VS2013

       不知道为什么,硬盘里面的VS2013安装包突然不香了,先给大家安利一个安装包资源很多的公众号,火耳软件安装,我的大多数软件安装包都是在这个上面下载的,但是心win10系统下VS2013安装一直会出现下面这个错误(具体截图忘记截了)

win10安装vs2013失败  Minimum Runtime-12.0.21005主题中没有签名。

百度到这个问题是因为,不兼容导致的吧,即使系统更新到最新也是会同样出现这样的问题,最后发现下载vs 2013的Update5的安装包既可以解决。

2.GDAL

相关库文件我已经上传到CSDN上,有需要的童鞋可以自行下载,下面讲一下如何配置:

第一步:配置环境!首先打开 VS,新建一个工程,控制台的就成。然后在工程的属性对话框中, 找到【配置属性】-【C/C++】-【常规】,右侧的【附加包含目录】中,将 GDAL 的 include 文件夹路径填写到这里;

第二步、继续在属性对话框中,找到【配置属性】-【链接器】-【常规】, 右侧的【附加库目录】中,将 GDAL 的 lib 文件夹路径填写到这里;

第三步、在【配置属性】-【链接器】-【输入】,右侧的【附加依赖项】中, 将 gdal_i.lib 填写到此处。然后点击确定即可。

最后一步:将bin里面的gdal19.dll文件放入所建工程的Debug中,至此,使用 GDAL 的环境全部 搭建完成,剩下的就是在代码中使用 GDAL 了。

3.使用

GDAL库里面有很多函数,这里我只简要介绍我对其中三个重要函数的理解。

    poBand->RasterIO(GF_Read, 0, 0, nXSize, nYSize, pafScanliner, nXSize, nYSize, GDT_Float32, 0, 0);

这是GDAL的一个关键函数,用来对图像数据进行读写,第一个参数是指定读数据还是写入数据;第二个和第三个参数是者写入图像数据的起始坐标图像的左上角坐标;第四个和第五个参数表示读取或者写入图像数据的窗口大小;第六个参数是存数据的数组;第七个和第八个参数指定缓冲区的大小;第九个参数指存储数组的数据类型,这个参数非常重要,因为我前几次一直读不出来图像就在于这个参数写错了;第十个十一个参数一般默认成0,这里用不到它。

    GDALDataset*poDstDS=(GDALDataset*)GDALCreate(poDriver, "2.tif", nXSize, nYSize, 3, GDT_Float32, papszOptions);创建的文件路径,图像宽,图像高,创建的波段数目,创建的 数据类型,创建选项,返回值

这个函数是用来创建tiff图像的函数,生成的只是空的文件。

写入图像的数据:

    poBand1->RasterIO(GF_Write, 0, 0, nXSize, nYSize, pafScanliner, nXSize, nYSize, GDT_Float32, 0, 0);这个函数和刚刚那个函数是类似的,只是第一个参数变化了,成了写入函数。

#include <gdal.h>
#include <gdal_priv.h>

Mat gdal_cv(const char* path){

	GDALAllRegister();//注册驱动
	CPLSetConfigOption("GDAL_FILENAME_IS_UTTF8", "YES");//保证中文路径

	GDALDataset *pData = NULL;
	pData = (GDALDataset*)GDALOpen(path, GA_ReadOnly);

	int XSize = pData->GetRasterXSize();
	int YSize = pData->GetRasterYSize();

	int XBuff = XSize;
	int YBuff = YSize;

	int nBand = pData->GetRasterCount();

	int *pBUffer = new int[(XBuff)*(YBuff)*(nBand)]();

	pData->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, XSize, YSize, pBUffer, XSize, YSize, GDT_Int32, 0, 0);
	
	Mat src_mat(YSize, XSize, CV_32SC1, Scalar(0));
	for (int i = 0; i < YSize; i++){
		for (int j = 0; j < XSize; j++){
			src_mat.at<int>(i, j) = pBUffer[i*XSize + j];
			
		}
	}

	//释放资源
	delete[] pBUffer;
	pBUffer = NULL;

	return src_mat;

}

差不多就这么回事了,代码地方我省略了很多不必要的函数和变量,希望对大家有用。

相关标签: 环境配置