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

Opencv的Mat格式用GDAL函数保存文件

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

前言

是之前“GDAL转Mat格式”的逆过程。

代码

//作者:山科_xxin
//时间:2017-04-05 21:53:44
//功能:<a href="https://www.ixxin.cn/tag/opencv2gdal/" title="查看更多关于Opencv2GDAL的文章" target="_blank">Opencv2GDAL</a>
//类别:<a href="https://www.ixxin.cn/tag/opencv/" title="查看更多关于Opencv的文章" target="_blank">Opencv</a>,<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>
int opencv2gdal(cv::Mat img, const char* fileName)
{
    if(img.empty())    //    判断是否为空
        return 0;

    const int nBandCount=img.channels();
    const int nImgSizeX=img.cols;
    const int nImgSizeY=img.rows;
	//cout<<nBandCount<<endl;
    GDALAllRegister();
    GDALDataset *poDataset;   //GDAL数据集
    GDALDriver *poDriver;      //驱动,用于创建新的文件
    poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");

    if(poDriver == NULL)
        return 0;
    poDataset=poDriver->Create(fileName,nImgSizeX,nImgSizeY,nBandCount,
                                GDT_Byte,NULL);
    //  循环写入文件
    <a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>RasterBand *pBand = NULL;
    //uchar *ppafScan = new uchar[nImgSizeX*nImgSizeY];

    int nl = nImgSizeY;
    int nc = nImgSizeX;
	vector<Mat> channels;
	split(img,channels);
	Mat tmpMat;
	for(int n = 1;n<=nBandCount;n++)
	{
		pBand = poDataset->GetRasterBand(n);
		uchar *ppafScan = new uchar[nImgSizeX*nImgSizeY];
		tmpMat = channels.at(n-1).clone();
		if(tmpMat.isContinuous())
		{
			//cout<<"0"<<endl;
			nc = nc*nl;
			for(int i = 0;i<nc;i++)
			{
				ppafScan = tmpMat.ptr<uchar>(0);
				//ppafScan[i] = tmpMat.ptr<uchar>(0)[i];
			}
		}

	/*
    if(img.isContinuous())
    {
		nc = nl*nc;
        n1 = 1;
    }
    for(int r = 0;r<n1;r++)
    {
		int tmpI = r*nImgSizeX;
        float *p = img.ptr<float>(r);
        for(int c = 0;c<nc;c++)
			{
                ppafScan[tmpI+c] = p[c];
            }
     }
	 */
		pBand->RasterIO(GF_Write,0,0,nImgSizeX,nImgSizeY,
			ppafScan,nImgSizeX,nImgSizeY,GDT_Byte,0,0);
		tmpMat.release();
		//ppafScan = NULL;
	}
    //delete []ppafScan;
    //ppafScan = NULL;
    GDALClose(poDataset);
    return 0;
}

结果:
结果
存在一个问题就是颜色不完全匹配。

参考文章

http://www.tuicool.com/articles/ARJ3uab


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

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址