1 /**************************************************************************** 2 * 3 * ViSP, open source Visual Servoing Platform software. 4 * Copyright (C) 2005 - 2019 by Inria. All rights reserved. 5 * 6 * This software is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * See the file LICENSE.txt at the root directory of this source 11 * distribution for additional information about the GNU GPL. 12 * 13 * For using ViSP with software that can not be combined with the GNU 14 * GPL, please contact Inria about acquiring a ViSP Professional 15 * Edition License. 16 * 17 * See http://visp.inria.fr for more information. 18 * 19 * This software was developed at: 20 * Inria Rennes - Bretagne Atlantique 21 * Campus Universitaire de Beaulieu 22 * 35042 Rennes Cedex 23 * France 24 * 25 * If you have questions regarding the use of this file, please contact 26 * Inria at visp@inria.fr 27 * 28 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 29 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 30 * 31 * Description: 32 * Convert image types. 33 * 34 * Authors: 35 * Eric Marchand 36 * Fabien Spindler 37 * Anthony Saunier 38 * 39 *****************************************************************************/ 40 41 /*! 42 \file vpImageConvert.h 43 \brief Convert image types 44 */ 45 46 #ifndef vpIMAGECONVERT_H 47 #define vpIMAGECONVERT_H 48 49 #include <stdint.h> 50 51 // image 52 #include <visp3/core/vpConfig.h> 53 #include <visp3/core/vpDebug.h> 54 #include <visp3/core/vpImage.h> 55 // color 56 #include <visp3/core/vpRGBa.h> 57 58 #ifdef VISP_HAVE_OPENCV 59 #if (VISP_HAVE_OPENCV_VERSION >= 0x040000) // Require opencv >= 4.0.0 60 # include <opencv2/imgproc/types_c.h> 61 # include <opencv2/imgproc.hpp> 62 # include <opencv2/highgui.hpp> 63 #elif (VISP_HAVE_OPENCV_VERSION >= 0x030000) // Require opencv >= 3.0.0 64 # include <opencv2/core/core.hpp> 65 # include <opencv2/highgui/highgui.hpp> 66 # include <opencv2/imgproc/imgproc.hpp> 67 #elif (VISP_HAVE_OPENCV_VERSION >= 0x020408) // Require opencv >= 2.4.8 68 # include <opencv2/core/core.hpp> 69 # include <opencv2/highgui/highgui.hpp> 70 # include <opencv2/imgproc/imgproc.hpp> 71 #elif (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1 72 # include <opencv2/core/core.hpp> 73 # include <opencv2/highgui/highgui.hpp> 74 # include <opencv2/highgui/highgui_c.h> 75 # include <opencv2/legacy/legacy.hpp> 76 #else 77 # include <highgui.h> 78 #endif 79 #endif 80 81 #ifdef VISP_HAVE_YARP 82 #include <yarp/sig/Image.h> 83 #endif 84 85 #if defined(_WIN32) 86 // Include WinSock2.h before windows.h to ensure that winsock.h is not 87 // included by windows.h since winsock.h and winsock2.h are incompatible 88 #include <WinSock2.h> 89 #include <windows.h> 90 #endif 91 92 /*! 93 \class vpImageConvert 94 95 \ingroup group_core_image 96 97 Convert image types. 98 99 The following example available in tutorial-image-converter.cpp shows how to 100 convert an OpenCV cv::Mat image into a vpImage: 101 102 \include tutorial-image-converter.cpp 103 104 */ 105 class VISP_EXPORT vpImageConvert 106 { 107 108 public: 109 static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<vpRGBa> &dest_rgba); 110 static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<unsigned char> &dest_depth); 111 112 static void convert(const vpImage<unsigned char> &src, vpImage<vpRGBa> &dest); 113 static void convert(const vpImage<vpRGBa> &src, vpImage<unsigned char> &dest, unsigned int nThreads=0); 114 115 static void convert(const vpImage<float> &src, vpImage<unsigned char> &dest); 116 static void convert(const vpImage<unsigned char> &src, vpImage<float> &dest); 117 118 static void convert(const vpImage<double> &src, vpImage<unsigned char> &dest); 119 static void convert(const vpImage<unsigned char> &src, vpImage<double> &dest); 120 121 static void convert(const vpImage<uint16_t> &src, vpImage<unsigned char> &dest); 122 static void convert(const vpImage<unsigned char> &src, vpImage<uint16_t> &dest); 123 124 /*! 125 Make a copy of an image. 126 \param src : source image. 127 \param dest : destination image. 128 */ convert(const vpImage<Type> & src,vpImage<Type> & dest)129 template <typename Type> static void convert(const vpImage<Type> &src, vpImage<Type> &dest) { dest = src; } 130 131 #ifdef VISP_HAVE_OPENCV 132 // Deprecated: will be removed with OpenCV transcient from C to C++ api 133 static void convert(const IplImage *src, vpImage<vpRGBa> &dest, bool flip = false); 134 static void convert(const IplImage *src, vpImage<unsigned char> &dest, bool flip = false); 135 static void convert(const vpImage<vpRGBa> &src, IplImage *&dest); 136 static void convert(const vpImage<unsigned char> &src, IplImage *&dest); 137 #if VISP_HAVE_OPENCV_VERSION >= 0x020100 138 static void convert(const cv::Mat &src, vpImage<vpRGBa> &dest, bool flip = false); 139 static void convert(const cv::Mat &src, vpImage<unsigned char> &dest, bool flip = false, 140 unsigned int nThreads=0); 141 static void convert(const vpImage<vpRGBa> &src, cv::Mat &dest); 142 static void convert(const vpImage<unsigned char> &src, cv::Mat &dest, bool copyData = true); 143 #endif 144 #endif 145 146 #ifdef VISP_HAVE_YARP 147 static void convert(const vpImage<unsigned char> &src, yarp::sig::ImageOf<yarp::sig::PixelMono> *dest, 148 bool copyData = true); 149 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelMono> *src, vpImage<unsigned char> &dest, 150 bool copyData = true); 151 152 static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgba> *dest, 153 bool copyData = true); 154 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgba> *src, vpImage<vpRGBa> &dest, 155 bool copyData = true); 156 157 static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgb> *dest); 158 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgb> *src, vpImage<vpRGBa> &dest); 159 #endif 160 161 static void split(const vpImage<vpRGBa> &src, vpImage<unsigned char> *pR, vpImage<unsigned char> *pG, 162 vpImage<unsigned char> *pB, vpImage<unsigned char> *pa = NULL); 163 164 static void merge(const vpImage<unsigned char> *R, const vpImage<unsigned char> *G, const vpImage<unsigned char> *B, 165 const vpImage<unsigned char> *a, vpImage<vpRGBa> &RGBa); 166 167 /*! 168 Converts a yuv pixel value in rgb format. 169 170 \param y Y component of a pixel. 171 \param u U component of a pixel. 172 \param v V component of a pixel. 173 \param r Red component from the YUV coding format. This value is computed 174 using: 175 \f[ r = 0.9999695*y - 0.0009508*(u-128) + 1.1359061*(v-128) \f] 176 \param g Green component from the YUV coding format. This value is 177 computed using: \f[g = 0.9999695*y - 0.3959609*(u-128) - 0.5782955*(v-128) 178 \f] \param b Blue component from the YUV coding format. This value is 179 computed using: \f[b = 0.9999695*y + 2.04112*(u-128) - 0.0016314*(v-128) 180 \f] 181 */ YUVToRGB(unsigned char y,unsigned char u,unsigned char v,unsigned char & r,unsigned char & g,unsigned char & b)182 static inline void YUVToRGB(unsigned char y, unsigned char u, unsigned char v, unsigned char &r, unsigned char &g, 183 unsigned char &b) 184 { 185 double dr, dg, db; 186 dr = floor(0.9999695 * y - 0.0009508 * (u - 128) + 1.1359061 * (v - 128)); 187 dg = floor(0.9999695 * y - 0.3959609 * (u - 128) - 0.5782955 * (v - 128)); 188 db = floor(0.9999695 * y + 2.04112 * (u - 128) - 0.0016314 * (v - 128)); 189 190 dr = dr < 0. ? 0. : dr; 191 dg = dg < 0. ? 0. : dg; 192 db = db < 0. ? 0. : db; 193 dr = dr > 255. ? 255. : dr; 194 dg = dg > 255. ? 255. : dg; 195 db = db > 255. ? 255. : db; 196 197 r = (unsigned char)dr; 198 g = (unsigned char)dg; 199 b = (unsigned char)db; 200 } 201 static void YUYVToRGBa(unsigned char *yuyv, unsigned char *rgba, unsigned int width, unsigned int height); 202 static void YUYVToRGB(unsigned char *yuyv, unsigned char *rgb, unsigned int width, unsigned int height); 203 static void YUYVToGrey(unsigned char *yuyv, unsigned char *grey, unsigned int size); 204 static void YUV411ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size); 205 static void YUV411ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size); 206 static void YUV411ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size); 207 static void YUV422ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size); 208 static void YUV422ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size); 209 static void YUV422ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size); 210 static void YUV420ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height); 211 static void YUV420ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height); 212 static void YUV420ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size); 213 214 static void YUV444ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size); 215 static void YUV444ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size); 216 static void YUV444ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size); 217 218 static void YV12ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height); 219 static void YV12ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height); 220 static void YVU9ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height); 221 static void YVU9ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height); 222 static void RGBToRGBa(unsigned char *rgb, unsigned char *rgba, unsigned int size); 223 static void RGBaToRGB(unsigned char *rgba, unsigned char *rgb, unsigned int size); 224 225 static void RGBToGrey(unsigned char *rgb, unsigned char *grey, unsigned int width, unsigned int height, 226 bool flip = false); 227 static void RGBToGrey(unsigned char *rgb, unsigned char *grey, unsigned int size); 228 static void RGBaToGrey(unsigned char *rgba, unsigned char *grey, unsigned int width, unsigned int height, 229 unsigned int nThreads=0); 230 static void RGBaToGrey(unsigned char *rgba, unsigned char *grey, unsigned int size); 231 232 static void RGBToRGBa(unsigned char *rgb, unsigned char *rgba, unsigned int width, unsigned int height, 233 bool flip = false); 234 235 static void GreyToRGBa(unsigned char *grey, unsigned char *rgba, unsigned int width, unsigned int height); 236 static void GreyToRGBa(unsigned char *grey, unsigned char *rgba, unsigned int size); 237 static void GreyToRGB(unsigned char *grey, unsigned char *rgb, unsigned int size); 238 239 static void BGRToRGBa(unsigned char *bgr, unsigned char *rgba, unsigned int width, unsigned int height, 240 bool flip = false); 241 242 static void BGRToGrey(unsigned char *bgr, unsigned char *grey, unsigned int width, unsigned int height, 243 bool flip = false, unsigned int nThreads=0); 244 245 static void BGRaToGrey(unsigned char *bgra, unsigned char *grey, unsigned int width, unsigned int height, 246 bool flip = false, unsigned int nThreads=0); 247 static void BGRaToRGBa(unsigned char *bgra, unsigned char *rgba, unsigned int width, unsigned int height, 248 bool flip = false); 249 250 static void YCbCrToRGB(unsigned char *ycbcr, unsigned char *rgb, unsigned int size); 251 static void YCbCrToRGBa(unsigned char *ycbcr, unsigned char *rgb, unsigned int size); 252 static void YCrCbToRGB(unsigned char *ycbcr, unsigned char *rgb, unsigned int size); 253 static void YCrCbToRGBa(unsigned char *ycbcr, unsigned char *rgb, unsigned int size); 254 static void YCbCrToGrey(unsigned char *ycbcr, unsigned char *grey, unsigned int size); 255 static void MONO16ToGrey(unsigned char *grey16, unsigned char *grey, unsigned int size); 256 static void MONO16ToRGBa(unsigned char *grey16, unsigned char *rgba, unsigned int size); 257 258 static void HSVToRGBa(const double *hue, const double *saturation, const double *value, unsigned char *rgba, 259 unsigned int size); 260 static void HSVToRGBa(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value, 261 unsigned char *rgba, unsigned int size); 262 static void RGBaToHSV(const unsigned char *rgba, double *hue, double *saturation, double *value, 263 unsigned int size); 264 static void RGBaToHSV(const unsigned char *rgba, unsigned char *hue, unsigned char *saturation, unsigned char *value, 265 unsigned int size); 266 267 static void HSVToRGB(const double *hue, const double *saturation, const double *value, unsigned char *rgb, 268 unsigned int size); 269 static void HSVToRGB(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value, 270 unsigned char *rgb, unsigned int size); 271 static void RGBToHSV(const unsigned char *rgb, double *hue, double *saturation, double *value, 272 unsigned int size); 273 static void RGBToHSV(const unsigned char *rgb, unsigned char *hue, unsigned char *saturation, unsigned char *value, 274 unsigned int size); 275 276 private: 277 static void computeYCbCrLUT(); 278 279 static void HSV2RGB(const double *hue, const double *saturation, const double *value, unsigned char *rgba, 280 unsigned int size, unsigned int step); 281 static void RGB2HSV(const unsigned char *rgb, double *hue, double *saturation, double *value, unsigned int size, 282 unsigned int step); 283 284 private: 285 static bool YCbCrLUTcomputed; 286 static int vpCrr[256]; 287 static int vpCgb[256]; 288 static int vpCgr[256]; 289 static int vpCbb[256]; 290 }; 291 292 #endif 293