OPENCV例子gdal_image.cpp的代码分析之——main函数

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqq9668

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值