Merge pull request #3616 from marvins:gdal-fixes

This commit is contained in:
Vadim Pisarevsky
2015-01-20 12:31:14 +00:00
5 changed files with 55 additions and 37 deletions

View File

@@ -1,13 +1,13 @@
/**
/*
* gdal_image.cpp -- Load GIS data into OpenCV Containers using the Geospatial Data Abstraction Library
*/
/// OpenCV Headers
// OpenCV Headers
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
/// C++ Standard Libraries
// C++ Standard Libraries
#include <cmath>
#include <iostream>
#include <stdexcept>
@@ -15,22 +15,22 @@
using namespace std;
/// define the corner points
/// Note that GDAL can natively determine this
// define the corner points
// Note that GDAL library can natively determine this
cv::Point2d tl( -122.441017, 37.815664 );
cv::Point2d tr( -122.370919, 37.815311 );
cv::Point2d bl( -122.441533, 37.747167 );
cv::Point2d br( -122.3715, 37.746814 );
/// determine dem corners
// determine dem corners
cv::Point2d dem_bl( -122.0, 38);
cv::Point2d dem_tr( -123.0, 37);
/// range of the heat map colors
// range of the heat map colors
std::vector<std::pair<cv::Vec3b,double> > color_range;
/// List of all function prototypes
// List of all function prototypes
cv::Point2d lerp( const cv::Point2d&, const cv::Point2d&, const double& );
cv::Vec3b get_dem_color( const double& );
@@ -43,7 +43,7 @@ void add_color( cv::Vec3b& pix, const uchar& b, const uchar& g, const uchar& r )
/**
/*
* Linear Interpolation
* p1 - Point 1
* p2 - Point 2
@@ -54,7 +54,7 @@ cv::Point2d lerp( cv::Point2d const& p1, cv::Point2d const& p2, const double& t
((1-t)*p1.y) + (t*p2.y));
}
/**
/*
* Interpolate Colors
*/
template <typename DATATYPE, int N>
@@ -69,7 +69,7 @@ cv::Vec<DATATYPE,N> lerp( cv::Vec<DATATYPE,N> const& minColor,
return output;
}
/**
/*
* Compute the dem color
*/
cv::Vec3b get_dem_color( const double& elevation ){
@@ -103,7 +103,7 @@ cv::Vec3b get_dem_color( const double& elevation ){
return lerp( color_range[idx].first, color_range[idx+1].first, t);
}
/**
/*
* Given a pixel coordinate and the size of the input image, compute the pixel location
* on the DEM image.
*/
@@ -122,7 +122,7 @@ cv::Point2d world2dem( cv::Point2d const& coordinate, const cv::Size& dem_size
return output;
}
/**
/*
* Convert a pixel coordinate to world coordinates
*/
cv::Point2d pixel2world( const int& x, const int& y, const cv::Size& size ){
@@ -139,7 +139,7 @@ cv::Point2d pixel2world( const int& x, const int& y, const cv::Size& size ){
return lerp( leftSide, rightSide, rx );
}
/**
/*
* Add color to a specific pixel color value
*/
void add_color( cv::Vec3b& pix, const uchar& b, const uchar& g, const uchar& r ){
@@ -150,12 +150,12 @@ void add_color( cv::Vec3b& pix, const uchar& b, const uchar& g, const uchar& r )
}
/**
/*
* Main Function
*/
int main( int argc, char* argv[] ){
/**
/*
* Check input arguments
*/
if( argc < 3 ){
@@ -163,22 +163,22 @@ int main( int argc, char* argv[] ){
return 1;
}
/// load the image (note that we don't have the projection information. You will
/// need to load that yourself or use the full GDAL driver. The values are pre-defined
/// at the top of this file
// load the image (note that we don't have the projection information. You will
// need to load that yourself or use the full GDAL driver. The values are pre-defined
// at the top of this file
cv::Mat image = cv::imread(argv[1], cv::IMREAD_LOAD_GDAL | cv::IMREAD_COLOR );
/// load the dem model
// load the dem model
cv::Mat dem = cv::imread(argv[2], cv::IMREAD_LOAD_GDAL | cv::IMREAD_ANYDEPTH );
/// create our output products
// create our output products
cv::Mat output_dem( image.size(), CV_8UC3 );
cv::Mat output_dem_flood( image.size(), CV_8UC3 );
/// for sanity sake, make sure GDAL Loads it as a signed short
// for sanity sake, make sure GDAL Loads it as a signed short
if( dem.type() != CV_16SC1 ){ throw std::runtime_error("DEM image type must be CV_16SC1"); }
/// define the color range to create our output DEM heat map
// define the color range to create our output DEM heat map
// Pair format ( Color, elevation ); Push from low to high
// Note: This would be perfect for a configuration file, but is here for a working demo.
color_range.push_back( std::pair<cv::Vec3b,double>(cv::Vec3b( 188, 154, 46), -1));