前言
是之前“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; <a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>Close(poDataset); return 0; }
结果:
存在一个问题就是颜色不完全匹配。
参考文章
http://www.tuicool.com/articles/ARJ3uab