Visual Servoing Platform  version 3.2.0 under development (2019-01-22)
vpImageConvert.h
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 
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/imgcodecs.hpp>
63 # include <opencv2/highgui.hpp>
64 #elif (VISP_HAVE_OPENCV_VERSION >= 0x030000) // Require opencv >= 3.0.0
65 # include <opencv2/core/core.hpp>
66 # include <opencv2/highgui/highgui.hpp>
67 # include <opencv2/imgproc/imgproc.hpp>
68 #elif (VISP_HAVE_OPENCV_VERSION >= 0x020408) // Require opencv >= 2.4.8
69 # include <opencv2/core/core.hpp>
70 # include <opencv2/highgui/highgui.hpp>
71 # include <opencv2/imgproc/imgproc.hpp>
72 #elif (VISP_HAVE_OPENCV_VERSION >= 0x020101) // Require opencv >= 2.1.1
73 # include <opencv2/core/core.hpp>
74 # include <opencv2/highgui/highgui.hpp>
75 # include <opencv2/highgui/highgui_c.h>
76 # include <opencv2/legacy/legacy.hpp>
77 #else
78 # include <highgui.h>
79 #endif
80 #endif
81 
82 #ifdef VISP_HAVE_YARP
83 #include <yarp/sig/Image.h>
84 #endif
85 
86 #if defined(_WIN32)
87 // Include WinSock2.h before windows.h to ensure that winsock.h is not
88 // included by windows.h since winsock.h and winsock2.h are incompatible
89 #include <WinSock2.h>
90 #include <windows.h>
91 #endif
92 
106 class VISP_EXPORT vpImageConvert
107 {
108 
109 public:
110  static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<vpRGBa> &dest_rgba);
111  static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<unsigned char> &dest_depth);
112  static void convert(const vpImage<unsigned char> &src, vpImage<vpRGBa> &dest);
113  static void convert(const vpImage<vpRGBa> &src, vpImage<unsigned char> &dest);
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 
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, const bool flip = false);
139  static void convert(const cv::Mat &src, vpImage<unsigned char> &dest, const bool flip = false);
140  static void convert(const vpImage<vpRGBa> &src, cv::Mat &dest);
141  static void convert(const vpImage<unsigned char> &src, cv::Mat &dest, const bool copyData = true);
142 #endif
143 #endif
144 
145 #ifdef VISP_HAVE_YARP
146  static void convert(const vpImage<unsigned char> &src, yarp::sig::ImageOf<yarp::sig::PixelMono> *dest,
147  const bool copyData = true);
148  static void convert(const yarp::sig::ImageOf<yarp::sig::PixelMono> *src, vpImage<unsigned char> &dest,
149  const bool copyData = true);
150 
151  static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgba> *dest,
152  const bool copyData = true);
153  static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgba> *src, vpImage<vpRGBa> &dest,
154  const bool copyData = true);
155 
156  static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgb> *dest);
157  static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgb> *src, vpImage<vpRGBa> &dest);
158 #endif
159 
160  static void split(const vpImage<vpRGBa> &src, vpImage<unsigned char> *pR, vpImage<unsigned char> *pG,
162 
163  static void merge(const vpImage<unsigned char> *R, const vpImage<unsigned char> *G, const vpImage<unsigned char> *B,
164  const vpImage<unsigned char> *a, vpImage<vpRGBa> &RGBa);
165 
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 size);
226  static void RGBaToGrey(unsigned char *rgba, unsigned char *grey, unsigned int size);
227 
228  static void RGBToRGBa(unsigned char *rgb, unsigned char *rgba, unsigned int width, unsigned int height,
229  bool flip = false);
230  static void RGBToGrey(unsigned char *rgb, unsigned char *grey, unsigned int width, unsigned int height,
231  bool flip = false);
232 
233  static void GreyToRGBa(unsigned char *grey, unsigned char *rgba, unsigned int size);
234  static void GreyToRGB(unsigned char *grey, unsigned char *rgb, unsigned int size);
235 
236  static void BGRToRGBa(unsigned char *bgr, unsigned char *rgba, unsigned int width, unsigned int height,
237  bool flip = false);
238 
239  static void BGRToGrey(unsigned char *bgr, unsigned char *grey, unsigned int width, unsigned int height,
240  bool flip = false);
241 
242  static void YCbCrToRGB(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
243  static void YCbCrToRGBa(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
244  static void YCrCbToRGB(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
245  static void YCrCbToRGBa(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
246  static void YCbCrToGrey(unsigned char *ycbcr, unsigned char *grey, unsigned int size);
247  static void MONO16ToGrey(unsigned char *grey16, unsigned char *grey, unsigned int size);
248  static void MONO16ToRGBa(unsigned char *grey16, unsigned char *rgba, unsigned int size);
249 
250  static void HSVToRGBa(const double *hue, const double *saturation, const double *value, unsigned char *rgba,
251  const unsigned int size);
252  static void HSVToRGBa(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
253  unsigned char *rgba, const unsigned int size);
254  static void RGBaToHSV(const unsigned char *rgba, double *hue, double *saturation, double *value,
255  const unsigned int size);
256  static void RGBaToHSV(const unsigned char *rgba, unsigned char *hue, unsigned char *saturation, unsigned char *value,
257  const unsigned int size);
258 
259  static void HSVToRGB(const double *hue, const double *saturation, const double *value, unsigned char *rgb,
260  const unsigned int size);
261  static void HSVToRGB(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
262  unsigned char *rgb, const unsigned int size);
263  static void RGBToHSV(const unsigned char *rgb, double *hue, double *saturation, double *value,
264  const unsigned int size);
265  static void RGBToHSV(const unsigned char *rgb, unsigned char *hue, unsigned char *saturation, unsigned char *value,
266  const unsigned int size);
267 
268 private:
269  static void computeYCbCrLUT();
270 
271  static void HSV2RGB(const double *hue, const double *saturation, const double *value, unsigned char *rgba,
272  const unsigned int size, const unsigned int step);
273  static void RGB2HSV(const unsigned char *rgb, double *hue, double *saturation, double *value, const unsigned int size,
274  const unsigned int step);
275 
276 private:
277  static bool YCbCrLUTcomputed;
278  static int vpCrr[256];
279  static int vpCgb[256];
280  static int vpCgr[256];
281  static int vpCbb[256];
282 };
283 
284 #endif
285 
286 /*
287  * Local variables:
288  * c-basic-offset: 2
289  * End:
290  */
static void YUVToRGB(unsigned char y, unsigned char u, unsigned char v, unsigned char &r, unsigned char &g, unsigned char &b)
static void convert(const vpImage< Type > &src, vpImage< Type > &dest)
Definition of the vpImage class member functions.
Definition: vpImage.h:116