Point Cloud Library (PCL)  1.7.0
/tmp/buildd/pcl-1.7-1.7.0/visualization/include/pcl/visualization/common/float_image_utils.h
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2010, Willow Garage, Inc.
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions
00009  *  are met:
00010  *
00011  *   * Redistributions of source code must retain the above copyright
00012  *     notice, this list of conditions and the following disclaimer.
00013  *   * Redistributions in binary form must reproduce the above
00014  *     copyright notice, this list of conditions and the following
00015  *     disclaimer in the documentation and/or other materials provided
00016  *     with the distribution.
00017  *   * Neither the name of Willow Garage, Inc. nor the names of its
00018  *     contributors may be used to endorse or promote products derived
00019  *     from this software without specific prior written permission.
00020  *
00021  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00024  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00025  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00026  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00027  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00028  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00029  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00030  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00031  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00032  *  POSSIBILITY OF SUCH DAMAGE.
00033  */
00034 
00035 #include <pcl/pcl_config.h>
00036 
00037 #ifndef PCL_VISUALIZATION_FLOAT_IMAGE_UTILS_H_
00038 #define PCL_VISUALIZATION_FLOAT_IMAGE_UTILS_H_
00039 
00040 #include <pcl/pcl_macros.h>
00041 
00042 #include <iostream>
00043 #include <cmath>
00044 #include <limits>
00045 
00046 namespace pcl
00047 {
00048   namespace visualization
00049   {
00050     /** @b Provide some gerneral functionalities regarding 2d float arrays, e.g., for visualization purposes
00051       * \author Bastian Steder
00052       * \ingroup visualization
00053       */
00054     class PCL_EXPORTS FloatImageUtils
00055     {
00056       public:
00057         // =====STATIC METHODS=====
00058         /** Get RGB color values for a given float in [0, 1] or special cases like -INFINITY(light green), INFINITY(light blue), NAN(light red) */
00059         static void 
00060         getColorForFloat (float value, unsigned char& r, unsigned char& g, unsigned char& b);
00061         
00062         /** Get RGB color values for a given float in [-PI, PI] or special cases like -INFINITY(light green), INFINITY(light blue), NAN(light red)
00063           * The colors are black(-PI) -> blue(-PI/2) -> white(0) -> green(PI/2) -> black(PI) with accordant values in between */
00064         static void 
00065         getColorForAngle (float value, unsigned char& r, unsigned char& g, unsigned char& b);
00066         
00067         /** Get RGB color values for a given float in [0, PI] or special cases like -INFINITY(light green), INFINITY(light blue), NAN(light red)
00068           * The colors are black(-PI/2) -> blue(-PI/4) -> white(0) -> green(PI/4) -> black(PI/2) with accordant values in between */
00069         static void 
00070         getColorForHalfAngle (float value, unsigned char& r, unsigned char& g, unsigned char& b);
00071         
00072         /** Use getColorForFloat for all elements of the given arrays, whereas the values are first normalized to [0,1],
00073          * either using the given min/max values or based on the actual minimal and maximal values existing in the array.
00074          * The output is a byte array of size 3*width*height containing the colors in RGB order.
00075          * If gray_scale is true, the outcome will still be an RGB image, but all colors apart for the special colors of
00076          * non-finite numbers, will be gray values */
00077         static unsigned char* 
00078         getVisualImage (const float* float_image, int width, int height, float min_value=-std::numeric_limits<float>::infinity (), float max_value=std::numeric_limits<float>::infinity (), bool gray_scale=false);
00079         
00080         /** Use getColorForFloat for all elements of the given arrays, whereas the values are normalized to [0,1]
00081          *  with the given min/max values.
00082          *  The output is a byte array of size 3*width*height containing the colors in RGB order.
00083          *  If gray_scale is true, the outcome will still be an RGB image, but all colors will be gray values. */
00084         static unsigned char* 
00085         getVisualImage (const unsigned short* float_image, int width, int height,
00086                         unsigned short min_value=0,
00087                         unsigned short max_value=std::numeric_limits<unsigned short>::max (),
00088                         bool gray_scale=false);
00089         
00090         /** Use getColorForAngle for all elements of the given arrays. */
00091         static unsigned char* 
00092         getVisualAngleImage (const float* angle_image, int width, int height);
00093 
00094         /** Use getColorForHalfAngle for all elements of the given arrays. */
00095         static unsigned char* 
00096         getVisualHalfAngleImage (const float* angle_image, int width, int height);
00097     };
00098 
00099   }  // namespace end
00100 }
00101 
00102 #endif  //#ifndef PCL_VISUALIZATION_FLOAT_IMAGE_UTILS_H_
00103