gdal_image例子的作用是:使用地理空间数据抽象库将GIS数据加载到OpenCV容器中。
int main( int argc, char** argv )
函数调用关系图如下:
函数声明情况如下:
函数声明文件如下:
函数流程图如下:
函数逻辑顺序图如下:
函数原始代码如下:
*
* Main Function
*/
int main( int argc, char* argv[] ){
/*
*检查输入参数
*/
if( argc < 3 ){
cout << "usage: " << argv[0] << " <image_name> <dem_model_name>" << endl;
return -1;
}
//加载图像(请注意,我们没有投影信息)。您需要自己加载或使用完整的GDAL驱动程序。这些值在该文件的顶部预定义
//![load1]
cv::Mat image = cv::imread(argv[1], cv::IMREAD_LOAD_GDAL | cv::IMREAD_COLOR );
//![load1]
//![load2]
//加载dem模型
cv::Mat dem = cv::imread(argv[2], cv::IMREAD_LOAD_GDAL | cv::IMREAD_ANYDEPTH );
//![load2]
// create our output products
cv::Mat output_dem( image.size(), CV_8UC3 );
cv::Mat output_dem_flood( image.size(), CV_8UC3 );
//为了理智起见,请确保GDAL将其作为有符号的短字符加载
if( dem.type() != CV_16SC1 ){ throw std::runtime_error("DEM image type must be CV_16SC1"); }
//定义颜色范围以创建输出DEM热图
// 成对格式(颜色、标高);从低到高
// 注意:这对于配置文件来说是完美的,但这里是一个工作演示。
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 188, 154, 46), -1));
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 110, 220, 110), 0.25));
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 150, 250, 230), 20));
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 160, 220, 200), 75));
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 220, 190, 170), 100));
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 250, 180, 140), 200));
//定义最小高程
double minElevation = -10;
//迭代图像中的每个像素,计算dem点
for( int y=0; y<image.rows; y++ ){
for( int x=0; x<image.cols; x++ ){
//将像素坐标转换为lat/lon坐标
cv::Point2d coordinate = pixel2world( x, y, image.size() );
//从lat/lon计算dem图像像素坐标
cv::Point2d dem_coordinate = world2dem( coordinate, dem.size() );
//提取高程
double dz;
if( dem_coordinate.x >= 0 && dem_coordinate.y >= 0 &&
dem_coordinate.x < dem.cols && dem_coordinate.y < dem.rows ){
dz = dem.at<short>(dem_coordinate);
}else{
dz = minElevation;
}
//将像素值写入文件
output_dem_flood.at<cv::Vec3b>(y,x) = image.at<cv::Vec3b>(y,x);
//计算热图输出的颜色
cv::Vec3b actualColor = get_dem_color(dz);
output_dem.at<cv::Vec3b>(y,x) = actualColor;
//展示海平面上升10米的效果
if( dz < 10 ){
add_color( output_dem_flood.at<cv::Vec3b>(y,x), 90, 0, 0 );
}
//展示海平面上升50米的效果
else if( dz < 50 ){
add_color( output_dem_flood.at<cv::Vec3b>(y,x), 0, 90, 0 );
}
//显示海平面上升100米的效果
else if( dz < 100 ){
add_color( output_dem_flood.at<cv::Vec3b>(y,x), 0, 0, 90 );
}
}}
//打印我们的热图
cv::imwrite( "heat-map.jpg" , output_dem );
//打印泛洪效果图像
cv::imwrite( "flooded.jpg", output_dem_flood);
return 0;
}