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);
}

到此影像就可以顯示出來了。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章