OpenCV4.2+GDAL3.0+Qt读取影像进行显示

11 篇文章 2 订阅
6 篇文章 1 订阅

OpenCV4.2+GDAL3.0+Qt读取影像进行显示

环境部署

下载OpenCV4.2以及GDAL3.0,然后进行编译,如果有需要的也可以直接点击下方链接进行下载:
OpenCV4.2:https://download.csdn.net/download/yangfahe1/12304844
GDAL3.0:https://download.csdn.net/download/yangfahe1/12304829

环境搭建

  1. 在附加包含库目录中添加下载好的opencv以及gdal头文件路径;
  2. 在附加库目录中添加opencv以及gdal的链接库路径
  3. 写一个头文件用于包含头文件以及链接库文件添加头文件路径
    添加链接库路径

下面开始使用添加好的OpenCV以及GDAL

1.利用gdal读取影像数据

bool createImageBuffer(void *&data, int xsize, int ysize, GDALDataType dtype)
{
if(xsize <= 0 || ysize <= 0 || dtype == dtUnKnow) return false;
int bandCount = 1;
switch(dtype)
{
case dtByte: data = new byte[xsize * ysize]; break;
case dtUShort: data = new ushort[xsize * ysize]; break;
case dtShort: data = new short[xsize * ysize]; break;
case dtUInt: data = new uint[xsize * ysize]; break;
case dtInt: data = new int[xsize * ysize]; break;
case dtFloat: data = new float[xsize * ysize]; break;
case dtDouble: data = new double[xsize * ysize]; break;
case dtCInt: data = new int2[xsize * ysize]; break;
case dtCShort: data = new short2[xsize * ysize]; break;
case dtCFloat: data = new float2[xsize * ysize]; break;
case dtCDouble: data = new double2[xsize * ysize]; break;
}
return true;
}

void readImage(vector &data, const int2 &pos, const int2 &range, const int2 &bufSize, const IntArr &bandMap, RasterInterleave leave)
{
int type = m_dataSet->GetRasterBand(1)->GetRasterDataType(); void *pData = NULL;
if(!createImageBuffer(pData, bufSize._x, bufSize._y, GDALDataType(type))) return false;
for(int idx = 0; idx < bandMap.length(); ++idx)
{
GDALRasterBand *pBand = m_dataSet->GetRasterBand(bandMap[idx] + 1);
CPLErr isok = pBand->RasterIO(GF_Read, pos._x, pos._y, range._x, range._y, pData, bufSize._x, bufSize._y, GDALDataType(type), 0, 0, 0);
data->push_back(bufSize._y, bufSize._x, GDALType2GCType(GDALDataType(type), 1), pData);
}
delete[] pData;
return true;
}

bool createPixmap(const vector &data, QPixmap &image)
{
Mat mat;
dataConvert(data, mat);
QImage img = cvMat_to_QImage(mat);
image = QPixmap::fromImage(img);
mat.release(); return true;
}

void dataConvert(const vector &data, cv::Mat &mat)
{
for(int idx = 0; idx < data.length(); ++idx)
{
Mat des; normalize(m_mat[idx], des, 0, 255, CV_MINMAX, CV_MAT_DEPTH(CV_8U));//这个地方归一化主要是因为有些影像不是8bit无法显示,所以在这里进行了转化,比如下图是unsigned short
mats.push_back(des);
}
merge(mats, mat);
}

void paintEvent(QPaintEvent *ev)
{
QPainter painter(this);
ainter.drawPixmap(0, 0, pixmap);
}

到此影像就可以显示出来了。在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值