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