博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用GDAL构造OpenCV的图像格式
阅读量:6292 次
发布时间:2019-06-22

本文共 2313 字,大约阅读时间需要 7 分钟。

        OpenCV提供了大量的函数,但是OpenCV支持的图像数据格式太少,同时,对于GDAL可以支持很多的图像格式,但是GDAL又不没有像OpenCV那么多的算法函数。这两者真的是鱼和熊掌不能兼得,为了结束这种纠结的状态,既想支持多种图像格式,又想 用OpenCV丰富的函数,那么请往下看:基本原理就是,使用GDAL打开图像,然后读取图像数据,将图像数据重新构建一个OpenCV的IplImage类型,然后就可以使用了。

//将GDAL读取出来的数据转换为OpenCV的存储格式void CImageTemplateMatch::CopyDataFromGDALToOpenCV(void* pImage, DT_8U* pData, int iBandCount){	CvMat* image = (CvMat*) pImage;		int index = 0;	for(int i = 0; i < image->rows; i++ )	{		DT_8U* rrow = (DT_8U*)(image->data.ptr + i*image->step);		for(int j = 0; j < image->cols*iBandCount; j+=iBandCount)		{			for(int k=0; k
cols*iBandCount+k] = 205; }}//注意,只能适用于小图像,大图像肯定不行,而且波段数只能是1个或者3个,对于超过三个的请自己修改代码void CovertGDAL2OpenCV(const char* pszFile, IplImage** ppSrcImage){ GDALDataset* poSrc = (GDALDataset*) GDALOpen(pszFile, GA_ReadOnly); int iWidth = poSrc->GetRasterXSize(); int iHeight = poSrc->GetRasterYSize(); int iBandCount = poSrc->GetRasterCount(); GDALDataType iDataType = poSrc->GetRasterBand(1)->GetDataType(); int idepth = GDALGetDataTypeSize((GDALDataType)iDataType); //将原始转换为OpenCV的图像格式 CvSize sourceSize = cvSize(iWidth, iHeight); *ppSrcImage = cvCreateImage(sourceSize, idepth, iBandCount ); CvMat stub, *image = (CvMat*)pSrcImage; image = cvGetMat( image, &stub ); DT_8U *pSrcData = new DT_8U[iWidth*iHeight*iBandCount]; if(iBandCount == 3) { int panBandMap [3] = {3,2,1}; //按照BGR BGR BGR ... 来读取数据组织 poSrc->RasterIO(GF_Read, iStartCol, iStartRow, iWidth, iHeight, pSrcData, iWidth, iHeight,\ (GDALDataType) iDataType, iBandCount, panBandMap, iDataType*iBandCount, iDataType*iWidth*iBandCount, iDataType); //全部读取进来 } else if(iBandCount == 1) { int panBandMap [1] = {1}; poSrc->RasterIO(GF_Read, iStartCol, iStartRow, iWidth, iHeight, pSrcData, iWidth, iHeight,\ (GDALDataType) iDataType, iBandCount, panBandMap, iDataType*iBandCount, iDataType*iWidth*iBandCount, iDataType); //全部读取进来 } else { RELEASE(pSrcData); GDALClose((GDALDatasetH)poSrc); *ppSrcImage = NULL; return; } CopyDataFromGDALToOpenCV(image, pSrcData, iBandCount); RELEASE(pSrcData); GDALClose((GDALDatasetH)poSrc);}
         
对于代码中的几点注意事项和说明,第一,由于OpenCV是将整幅图像全部存在内存中的,所以该函数不能处理大图像,此外,由于OpenCV一般只能处理三波段和单波段图像,所以该函数也只能处理成三波段和单波段,对于超过三个波段的图像,你可以修改程序,挑选三个波段来进行读取。对于OpenCV中数据的组织格式,自己可以参考OpenCV的相关文档。

转载于:https://www.cnblogs.com/xiaowangba/archive/2012/04/06/6314022.html

你可能感兴趣的文章
php--------获取当前时间、时间戳
查看>>
Spring MVC中文文档翻译发布
查看>>
docker centos环境部署tomcat
查看>>
JavaScript 基础(九): 条件 语句
查看>>
Linux系统固定IP配置
查看>>
配置Quartz
查看>>
Linux 线程实现机制分析
查看>>
继承自ActionBarActivity的activity的activity theme问题
查看>>
设计模式01:简单工厂模式
查看>>
项目经理笔记一
查看>>
Hibernate一对一外键双向关联
查看>>
mac pro 入手,php环境配置总结
查看>>
MyBatis-Plus | 最简单的查询操作教程(Lambda)
查看>>
rpmfusion 的国内大学 NEU 源配置
查看>>
spring jpa 配置详解
查看>>
IOE,为什么去IOE?
查看>>
Storm中的Worker
查看>>
dangdang.ddframe.job中页面修改表达式后进行检查
查看>>
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>