C++gdal 读取图像后转为opencv类型的完整代码
时间: 2023-10-25 07:08:10 浏览: 148
下面是一个示例代码,演示如何使用 C++ 和 GDAL 库读取图像并将其转换为 OpenCV 类型:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
#include "gdal_priv.h"
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
GDALAllRegister();
// 打开图像文件
GDALDataset* poDataset = (GDALDataset*) GDALOpen(argv[1], GA_ReadOnly);
// 获取图像宽度和高度
int width = poDataset->GetRasterXSize();
int height = poDataset->GetRasterYSize();
// 获取波段数量
int bandCount = poDataset->GetRasterCount();
// 创建一个 Mat 对象以容纳图像数据
Mat image(height, width, CV_8UC3);
// 读取图像数据并将其存储在 Mat 对象中
for (int i = 1; i <= bandCount; ++i)
{
GDALRasterBand* poBand = poDataset->GetRasterBand(i);
// 读取波段数据
Mat band(height, width, CV_8UC1);
poBand->RasterIO(GF_Read, 0, 0, width, height, band.data, width, height, GDT_Byte, 0, 0);
// 将波段数据复制到图像的相应通道中
switch (i)
{
case 1:
cv::extractChannel(band, image, 0);
break;
case 2:
cv::extractChannel(band, image, 1);
break;
case 3:
cv::extractChannel(band, image, 2);
break;
default:
break;
}
}
// 显示图像
imshow("image", image);
waitKey(0);
// 释放 GDAL 数据集
GDALClose(poDataset);
return 0;
}
```
在这个示例中,我们首先使用 `GDALAllRegister()` 函数注册所有支持的驱动程序。然后,我们使用 `GDALOpen()` 函数打开图像文件,并获取其宽度、高度和波段数量。接下来,我们创建一个 OpenCV 的 Mat 对象,并使用 `GDALRasterBand` 类的 `RasterIO()` 函数从每个波段中读取数据,并将其复制到 Mat 对象的相应通道中。最后,我们使用 `imshow()` 函数显示图像,并使用 `waitKey()` 函数等待用户按下键盘上的任意键。最后,我们使用 `GDALClose()` 函数释放 GDAL 数据集。
请注意,在本示例中,我们将每个波段的数据存储在单独的 Mat 对象中,然后将其复制到最终图像的相应通道中。这是因为 GDAL 库读取的数据默认情况下存储为灰度图像,而 OpenCV 中的图像数据是以 BGR 顺序存储的。因此,我们需要使用 `extractChannel()` 函数将每个波段的数据复制到正确的通道中。
阅读全文