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
环境搭建
- 在附加包含库目录中添加下载好的opencv以及gdal头文件路径;
- 在附加库目录中添加opencv以及gdal的链接库路径
- 写一个头文件用于包含头文件以及链接库文件
下面开始使用添加好的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);
}
到此影像就可以显示出来了。