Visual Servoing Platform  version 3.5.0 under development (2022-02-15)
vpImageConvert.h
1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2021 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/highgui.hpp>
61 #include <opencv2/imgproc.hpp>
62 #include <opencv2/imgproc/types_c.h>
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 
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 createDepthHistogram( const vpImage< float > &src_depth, vpImage< vpRGBa > &dest_depth );
113  static void createDepthHistogram( const vpImage< float > &src_depth, vpImage< unsigned char > &dest_depth );
114 
115  static void convert( const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest );
116  static void convert( const vpImage< vpRGBa > &src, vpImage< unsigned char > &dest, unsigned int nThreads = 0 );
117 
118  static void convert( const vpImage< float > &src, vpImage< unsigned char > &dest );
119  static void convert( const vpImage< unsigned char > &src, vpImage< float > &dest );
120 
121  static void convert( const vpImage< double > &src, vpImage< unsigned char > &dest );
122  static void convert( const vpImage< unsigned char > &src, vpImage< double > &dest );
123 
124  static void convert( const vpImage< uint16_t > &src, vpImage< unsigned char > &dest, unsigned char bitshift = 8 );
125  static void convert( const vpImage< unsigned char > &src, vpImage< uint16_t > &dest, unsigned char bitshift = 8 );
126 
132  template < typename Type > static void convert( const vpImage< Type > &src, vpImage< Type > &dest ) { dest = src; }
133 
134 #ifdef VISP_HAVE_OPENCV
135  // Deprecated: will be removed with OpenCV transcient from C to C++ api
136  static void convert( const IplImage *src, vpImage< vpRGBa > &dest, bool flip = false );
137  static void convert( const IplImage *src, vpImage< unsigned char > &dest, bool flip = false );
138  static void convert( const vpImage< vpRGBa > &src, IplImage *&dest );
139  static void convert( const vpImage< unsigned char > &src, IplImage *&dest );
140 #if VISP_HAVE_OPENCV_VERSION >= 0x020100
141  static void convert( const cv::Mat &src, vpImage< vpRGBa > &dest, bool flip = false );
142  static void convert( const cv::Mat &src, vpImage< unsigned char > &dest, bool flip = false,
143  unsigned int nThreads = 0 );
144  static void convert( const vpImage< vpRGBa > &src, cv::Mat &dest );
145  static void convert( const vpImage< unsigned char > &src, cv::Mat &dest, bool copyData = true );
146 #endif
147 #endif
148 
149 #ifdef VISP_HAVE_YARP
150  static void convert( const vpImage< unsigned char > &src, yarp::sig::ImageOf< yarp::sig::PixelMono > *dest,
151  bool copyData = true );
152  static void convert( const yarp::sig::ImageOf< yarp::sig::PixelMono > *src, vpImage< unsigned char > &dest,
153  bool copyData = true );
154 
155  static void convert( const vpImage< vpRGBa > &src, yarp::sig::ImageOf< yarp::sig::PixelRgba > *dest,
156  bool copyData = true );
157  static void convert( const yarp::sig::ImageOf< yarp::sig::PixelRgba > *src, vpImage< vpRGBa > &dest,
158  bool copyData = true );
159 
160  static void convert( const vpImage< vpRGBa > &src, yarp::sig::ImageOf< yarp::sig::PixelRgb > *dest );
161  static void convert( const yarp::sig::ImageOf< yarp::sig::PixelRgb > *src, vpImage< vpRGBa > &dest );
162 #endif
163 
164  static void split( const vpImage< vpRGBa > &src, vpImage< unsigned char > *pR, vpImage< unsigned char > *pG,
166 
167  static void merge( const vpImage< unsigned char > *R, const vpImage< unsigned char > *G,
169 
185  static inline void YUVToRGB( unsigned char y, unsigned char u, unsigned char v, unsigned char &r, unsigned char &g,
186  unsigned char &b )
187  {
188  double dr, dg, db;
189  dr = floor( 0.9999695 * y - 0.0009508 * ( u - 128 ) + 1.1359061 * ( v - 128 ) );
190  dg = floor( 0.9999695 * y - 0.3959609 * ( u - 128 ) - 0.5782955 * ( v - 128 ) );
191  db = floor( 0.9999695 * y + 2.04112 * ( u - 128 ) - 0.0016314 * ( v - 128 ) );
192 
193  dr = dr < 0. ? 0. : dr;
194  dg = dg < 0. ? 0. : dg;
195  db = db < 0. ? 0. : db;
196  dr = dr > 255. ? 255. : dr;
197  dg = dg > 255. ? 255. : dg;
198  db = db > 255. ? 255. : db;
199 
200  r = (unsigned char)dr;
201  g = (unsigned char)dg;
202  b = (unsigned char)db;
203  }
204  static void YUYVToRGBa( unsigned char *yuyv, unsigned char *rgba, unsigned int width, unsigned int height );
205  static void YUYVToRGB( unsigned char *yuyv, unsigned char *rgb, unsigned int width, unsigned int height );
206  static void YUYVToGrey( unsigned char *yuyv, unsigned char *grey, unsigned int size );
207  static void YUV411ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int size );
208  static void YUV411ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int size );
209  static void YUV411ToGrey( unsigned char *yuv, unsigned char *grey, unsigned int size );
210  static void YUV422ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int size );
211  static void YUV422ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int size );
212  static void YUV422ToGrey( unsigned char *yuv, unsigned char *grey, unsigned int size );
213  static void YUV420ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height );
214  static void YUV420ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height );
215  static void YUV420ToGrey( unsigned char *yuv, unsigned char *grey, unsigned int size );
216 
217  static void YUV444ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int size );
218  static void YUV444ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int size );
219  static void YUV444ToGrey( unsigned char *yuv, unsigned char *grey, unsigned int size );
220 
221  static void YV12ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height );
222  static void YV12ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height );
223  static void YVU9ToRGBa( unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height );
224  static void YVU9ToRGB( unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height );
225  static void RGBToRGBa( unsigned char *rgb, unsigned char *rgba, unsigned int size );
226  static void RGBaToRGB( unsigned char *rgba, unsigned char *rgb, unsigned int size );
227 
228  static void RGBToGrey( unsigned char *rgb, unsigned char *grey, unsigned int width, unsigned int height,
229  bool flip = false );
230  static void RGBToGrey( unsigned char *rgb, unsigned char *grey, unsigned int size );
231  static void RGBaToGrey( unsigned char *rgba, unsigned char *grey, unsigned int width, unsigned int height,
232  unsigned int nThreads = 0 );
233  static void RGBaToGrey( unsigned char *rgba, unsigned char *grey, unsigned int size );
234 
235  static void RGBToRGBa( unsigned char *rgb, unsigned char *rgba, unsigned int width, unsigned int height,
236  bool flip = false );
237 
238  static void GreyToRGBa( unsigned char *grey, unsigned char *rgba, unsigned int width, unsigned int height );
239  static void GreyToRGBa( unsigned char *grey, unsigned char *rgba, unsigned int size );
240  static void GreyToRGB( unsigned char *grey, unsigned char *rgb, unsigned int size );
241 
242  static void BGRToRGBa( unsigned char *bgr, unsigned char *rgba, unsigned int width, unsigned int height,
243  bool flip = false );
244 
245  static void BGRToGrey( unsigned char *bgr, unsigned char *grey, unsigned int width, unsigned int height,
246  bool flip = false, unsigned int nThreads = 0 );
247 
248  static void BGRaToGrey( unsigned char *bgra, unsigned char *grey, unsigned int width, unsigned int height,
249  bool flip = false, unsigned int nThreads = 0 );
250  static void BGRaToRGBa( unsigned char *bgra, unsigned char *rgba, unsigned int width, unsigned int height,
251  bool flip = false );
252 
253  static void YCbCrToRGB( unsigned char *ycbcr, unsigned char *rgb, unsigned int size );
254  static void YCbCrToRGBa( unsigned char *ycbcr, unsigned char *rgb, unsigned int size );
255  static void YCbCrToGrey( unsigned char *ycbcr, unsigned char *grey, unsigned int size );
256  static void YCrCbToRGB( unsigned char *ycrcb, unsigned char *rgb, unsigned int size );
257  static void YCrCbToRGBa( unsigned char *ycrcb, unsigned char *rgb, unsigned int size );
258  static void MONO16ToGrey( unsigned char *grey16, unsigned char *grey, unsigned int size );
259  static void MONO16ToRGBa( unsigned char *grey16, unsigned char *rgba, unsigned int size );
260 
261  static void HSVToRGBa( const double *hue, const double *saturation, const double *value, unsigned char *rgba,
262  unsigned int size );
263  static void HSVToRGBa( const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
264  unsigned char *rgba, unsigned int size );
265  static void RGBaToHSV( const unsigned char *rgba, double *hue, double *saturation, double *value, unsigned int size );
266  static void RGBaToHSV( const unsigned char *rgba, unsigned char *hue, unsigned char *saturation, unsigned char *value,
267  unsigned int size );
268 
269  static void HSVToRGB( const double *hue, const double *saturation, const double *value, unsigned char *rgb,
270  unsigned int size );
271  static void HSVToRGB( const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
272  unsigned char *rgb, unsigned int size );
273  static void RGBToHSV( const unsigned char *rgb, double *hue, double *saturation, double *value, unsigned int size );
274  static void RGBToHSV( const unsigned char *rgb, unsigned char *hue, unsigned char *saturation, unsigned char *value,
275  unsigned int size );
276 
277  static void demosaicBGGRToRGBaBilinear( const uint8_t *bggr, uint8_t *rgba, unsigned int width, unsigned int height,
278  unsigned int nThreads = 0 );
279  static void demosaicBGGRToRGBaBilinear( const uint16_t *bggr, uint16_t *rgba, unsigned int width, unsigned int height,
280  unsigned int nThreads = 0 );
281 
282  static void demosaicGBRGToRGBaBilinear( const uint8_t *gbrg, uint8_t *rgba, unsigned int width, unsigned int height,
283  unsigned int nThreads = 0 );
284  static void demosaicGBRGToRGBaBilinear( const uint16_t *gbrg, uint16_t *rgba, unsigned int width, unsigned int height,
285  unsigned int nThreads = 0 );
286 
287  static void demosaicGRBGToRGBaBilinear( const uint8_t *grbg, uint8_t *rgba, unsigned int width, unsigned int height,
288  unsigned int nThreads = 0 );
289  static void demosaicGRBGToRGBaBilinear( const uint16_t *grbg, uint16_t *rgba, unsigned int width, unsigned int height,
290  unsigned int nThreads = 0 );
291 
292  static void demosaicRGGBToRGBaBilinear( const uint8_t *rggb, uint8_t *rgba, unsigned int width, unsigned int height,
293  unsigned int nThreads = 0 );
294  static void demosaicRGGBToRGBaBilinear( const uint16_t *rggb, uint16_t *rgba, unsigned int width, unsigned int height,
295  unsigned int nThreads = 0 );
296 
297  static void demosaicBGGRToRGBaMalvar( const uint8_t *bggr, uint8_t *rgba, unsigned int width, unsigned int height,
298  unsigned int nThreads = 0 );
299  static void demosaicBGGRToRGBaMalvar( const uint16_t *bggr, uint16_t *rgba, unsigned int width, unsigned int height,
300  unsigned int nThreads = 0 );
301 
302  static void demosaicGBRGToRGBaMalvar( const uint8_t *gbrg, uint8_t *rgba, unsigned int width, unsigned int height,
303  unsigned int nThreads = 0 );
304  static void demosaicGBRGToRGBaMalvar( const uint16_t *gbrg, uint16_t *rgba, unsigned int width, unsigned int height,
305  unsigned int nThreads = 0 );
306 
307  static void demosaicGRBGToRGBaMalvar( const uint8_t *grbg, uint8_t *rgba, unsigned int width, unsigned int height,
308  unsigned int nThreads = 0 );
309  static void demosaicGRBGToRGBaMalvar( const uint16_t *grbg, uint16_t *rgba, unsigned int width, unsigned int height,
310  unsigned int nThreads = 0 );
311 
312  static void demosaicRGGBToRGBaMalvar( const uint8_t *rggb, uint8_t *rgba, unsigned int width, unsigned int height,
313  unsigned int nThreads = 0 );
314  static void demosaicRGGBToRGBaMalvar( const uint16_t *rggb, uint16_t *rgba, unsigned int width, unsigned int height,
315  unsigned int nThreads = 0 );
316 
317 private:
318  static void computeYCbCrLUT();
319 
320  static void HSV2RGB( const double *hue, const double *saturation, const double *value, unsigned char *rgba,
321  unsigned int size, unsigned int step );
322  static void RGB2HSV( const unsigned char *rgb, double *hue, double *saturation, double *value, unsigned int size,
323  unsigned int step );
324 
325 private:
326  static bool YCbCrLUTcomputed;
327  static int vpCrr[256];
328  static int vpCgb[256];
329  static int vpCgr[256];
330  static int vpCbb[256];
331 };
332 
333 #endif
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:126