注册 登录
  • 注册时,本站名称为:RGB空格3S博客,注意中间的空格。
  • 2018.8.14本站全面接入google广告
  • 2017.2.14今天收到45条恶意评论(全是外文),故评论时请填写必要信息,匿名评论全部拉黑,迫不得已而为之
  • 2017.1.27,2017年春节及至,我谨代表本人祝大家新春快乐,本人年终总结文章请访问:2016年终总结
  • 为防止恶意转载,本站全面禁止复制,并添加图片水印:RGB 3S博客www.ixxin.cn。
  • 本站正式更名为RGB 3S博客,本站将撤消所有非3S内容,其将转移到新博客江湖时代

转换GDAL数据格式为Opencv Mat

C/C++ admin 11725次浏览 已收录 2个评论
[隐藏]

前言

解决这个问题耗费了一点时间,故记录之。
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;
}

结果:
结果

后语

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


xxin blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明转换GDAL数据格式为Opencv Mat
喜欢 (11)
支付宝[853060844@qq.com]
分享 (0)
admin
关于作者:
坐标山科大遥感系小鲜肉一枚。
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 我想用c#改写,应该怎么写
    匿名2017-06-02 11:10 回复 Windows 10 | Chrome 51.0.2704.79
  2. 请问OpenCV3集成了是怎么个意思,该怎么用呢
    匿名2017-09-26 13:41 回复 未知操作系统 | Safari 604.1.38