Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
vpImageConvert.h
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2023 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * Convert image types.
32 */
33
39#ifndef _vpImageConvert_h_
40#define _vpImageConvert_h_
41
42#include <stdint.h>
43
44// image
45#include <visp3/core/vpConfig.h>
46#include <visp3/core/vpDebug.h>
47#include <visp3/core/vpImage.h>
48// color
49#include <visp3/core/vpRGBa.h>
50
51#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC)
52#include <opencv2/imgproc.hpp>
53#include <opencv2/imgproc/types_c.h>
54#endif
55
56#ifdef VISP_HAVE_YARP
57#include <yarp/sig/Image.h>
58#endif
59
60#if defined(_WIN32)
61// Include WinSock2.h before windows.h to ensure that winsock.h is not
62// included by windows.h since winsock.h and winsock2.h are incompatible
63#include <WinSock2.h>
64#include <windows.h>
65#endif
66
80class VISP_EXPORT vpImageConvert
81{
82
83public:
84 static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<vpRGBa> &dest_rgba);
85 static void createDepthHistogram(const vpImage<uint16_t> &src_depth, vpImage<unsigned char> &dest_depth);
86
87 static void createDepthHistogram(const vpImage<float> &src_depth, vpImage<vpRGBa> &dest_depth);
88 static void createDepthHistogram(const vpImage<float> &src_depth, vpImage<unsigned char> &dest_depth);
89
90 static void convert(const vpImage<unsigned char> &src, vpImage<vpRGBa> &dest);
91 static void convert(const vpImage<vpRGBa> &src, vpImage<unsigned char> &dest, unsigned int nThreads = 0);
92
93 static void convert(const vpImage<float> &src, vpImage<unsigned char> &dest);
94 static void convert(const vpImage<vpRGBf> &src, vpImage<vpRGBa> &dest);
95 static void convert(const vpImage<unsigned char> &src, vpImage<float> &dest);
96
97 static void convert(const vpImage<double> &src, vpImage<unsigned char> &dest);
98 static void convert(const vpImage<unsigned char> &src, vpImage<double> &dest);
99
100 static void convert(const vpImage<uint16_t> &src, vpImage<unsigned char> &dest, unsigned char bitshift = 8);
101 static void convert(const vpImage<unsigned char> &src, vpImage<uint16_t> &dest, unsigned char bitshift = 8);
102
108 template <typename Type> static void convert(const vpImage<Type> &src, vpImage<Type> &dest) { dest = src; }
109
110#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGPROC)
111 static void convert(const cv::Mat &src, vpImage<vpRGBa> &dest, bool flip = false);
112 static void convert(const cv::Mat &src, vpImage<unsigned char> &dest, bool flip = false, unsigned int nThreads = 0);
113 static void convert(const cv::Mat &src, vpImage<float> &dest, bool flip = false);
114 static void convert(const cv::Mat &src, vpImage<vpRGBf> &dest, bool flip = false);
115 static void convert(const cv::Mat &src, vpImage<uint16_t> &dest, bool flip = false);
116 static void convert(const vpImage<vpRGBa> &src, cv::Mat &dest);
117 static void convert(const vpImage<unsigned char> &src, cv::Mat &dest, bool copyData = true);
118 static void convert(const vpImage<float> &src, cv::Mat &dest, bool copyData = true);
119 static void convert(const vpImage<vpRGBf> &src, cv::Mat &dest);
120#endif
121
122#ifdef VISP_HAVE_YARP
123 static void convert(const vpImage<unsigned char> &src, yarp::sig::ImageOf<yarp::sig::PixelMono> *dest,
124 bool copyData = true);
125 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelMono> *src, vpImage<unsigned char> &dest,
126 bool copyData = true);
127
128 static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgba> *dest, bool copyData = true);
129 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgba> *src, vpImage<vpRGBa> &dest, bool copyData = true);
130
131 static void convert(const vpImage<vpRGBa> &src, yarp::sig::ImageOf<yarp::sig::PixelRgb> *dest);
132 static void convert(const yarp::sig::ImageOf<yarp::sig::PixelRgb> *src, vpImage<vpRGBa> &dest);
133#endif
134
135 static void split(const vpImage<vpRGBa> &src, vpImage<unsigned char> *pR, vpImage<unsigned char> *pG,
137
138 static void merge(const vpImage<unsigned char> *R, const vpImage<unsigned char> *G, const vpImage<unsigned char> *B,
140
155 static inline void YUVToRGB(unsigned char y, unsigned char u, unsigned char v, unsigned char &r, unsigned char &g,
156 unsigned char &b)
157 {
158 double dr, dg, db;
159 dr = floor(0.9999695 * y - 0.0009508 * (u - 128) + 1.1359061 * (v - 128));
160 dg = floor(0.9999695 * y - 0.3959609 * (u - 128) - 0.5782955 * (v - 128));
161 db = floor(0.9999695 * y + 2.04112 * (u - 128) - 0.0016314 * (v - 128));
162
163 dr = dr < 0. ? 0. : dr;
164 dg = dg < 0. ? 0. : dg;
165 db = db < 0. ? 0. : db;
166 dr = dr > 255. ? 255. : dr;
167 dg = dg > 255. ? 255. : dg;
168 db = db > 255. ? 255. : db;
169
170 r = (unsigned char)dr;
171 g = (unsigned char)dg;
172 b = (unsigned char)db;
173 }
174 static void YUYVToRGBa(unsigned char *yuyv, unsigned char *rgba, unsigned int width, unsigned int height);
175 static void YUYVToRGB(unsigned char *yuyv, unsigned char *rgb, unsigned int width, unsigned int height);
176 static void YUYVToGrey(unsigned char *yuyv, unsigned char *grey, unsigned int size);
177 static void YUV411ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size);
178 static void YUV411ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size);
179 static void YUV411ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size);
180 static void YUV422ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size);
181 static void YUV422ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size);
182 static void YUV422ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size);
183 static void YUV420ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height);
184 static void YUV420ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height);
185 static void YUV420ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size);
186
187 static void YUV444ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int size);
188 static void YUV444ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int size);
189 static void YUV444ToGrey(unsigned char *yuv, unsigned char *grey, unsigned int size);
190
191 static void YV12ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height);
192 static void YV12ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height);
193 static void YVU9ToRGBa(unsigned char *yuv, unsigned char *rgba, unsigned int width, unsigned int height);
194 static void YVU9ToRGB(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height);
195 static void RGBToRGBa(unsigned char *rgb, unsigned char *rgba, unsigned int size);
196 static void RGBaToRGB(unsigned char *rgba, unsigned char *rgb, unsigned int size);
197
198 static void RGBToGrey(unsigned char *rgb, unsigned char *grey, unsigned int width, unsigned int height,
199 bool flip = false);
200 static void RGBToGrey(unsigned char *rgb, unsigned char *grey, unsigned int size);
201 static void RGBaToGrey(unsigned char *rgba, unsigned char *grey, unsigned int width, unsigned int height,
202 unsigned int nThreads = 0);
203 static void RGBaToGrey(unsigned char *rgba, unsigned char *grey, unsigned int size);
204
205 static void RGBToRGBa(unsigned char *rgb, unsigned char *rgba, unsigned int width, unsigned int height,
206 bool flip = false);
207
208 static void GreyToRGBa(unsigned char *grey, unsigned char *rgba, unsigned int width, unsigned int height);
209 static void GreyToRGBa(unsigned char *grey, unsigned char *rgba, unsigned int size);
210 static void GreyToRGB(unsigned char *grey, unsigned char *rgb, unsigned int size);
211
212 static void BGRToRGBa(unsigned char *bgr, unsigned char *rgba, unsigned int width, unsigned int height,
213 bool flip = false);
214
215 static void BGRToGrey(unsigned char *bgr, unsigned char *grey, unsigned int width, unsigned int height,
216 bool flip = false, unsigned int nThreads = 0);
217
218 static void BGRaToGrey(unsigned char *bgra, unsigned char *grey, unsigned int width, unsigned int height,
219 bool flip = false, unsigned int nThreads = 0);
220 static void BGRaToRGBa(unsigned char *bgra, unsigned char *rgba, unsigned int width, unsigned int height,
221 bool flip = false);
222
223 static void YCbCrToRGB(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
224 static void YCbCrToRGBa(unsigned char *ycbcr, unsigned char *rgb, unsigned int size);
225 static void YCbCrToGrey(unsigned char *ycbcr, unsigned char *grey, unsigned int size);
226 static void YCrCbToRGB(unsigned char *ycrcb, unsigned char *rgb, unsigned int size);
227 static void YCrCbToRGBa(unsigned char *ycrcb, unsigned char *rgb, unsigned int size);
228 static void MONO16ToGrey(unsigned char *grey16, unsigned char *grey, unsigned int size);
229 static void MONO16ToRGBa(unsigned char *grey16, unsigned char *rgba, unsigned int size);
230
231 static void HSVToRGBa(const double *hue, const double *saturation, const double *value, unsigned char *rgba,
232 unsigned int size);
233 static void HSVToRGBa(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
234 unsigned char *rgba, unsigned int size);
235 static void RGBaToHSV(const unsigned char *rgba, double *hue, double *saturation, double *value, unsigned int size);
236 static void RGBaToHSV(const unsigned char *rgba, unsigned char *hue, unsigned char *saturation, unsigned char *value,
237 unsigned int size);
238
239 static void HSVToRGB(const double *hue, const double *saturation, const double *value, unsigned char *rgb,
240 unsigned int size);
241 static void HSVToRGB(const unsigned char *hue, const unsigned char *saturation, const unsigned char *value,
242 unsigned char *rgb, unsigned int size);
243 static void RGBToHSV(const unsigned char *rgb, double *hue, double *saturation, double *value, unsigned int size);
244 static void RGBToHSV(const unsigned char *rgb, unsigned char *hue, unsigned char *saturation, unsigned char *value,
245 unsigned int size);
246
247 static void demosaicBGGRToRGBaBilinear(const uint8_t *bggr, uint8_t *rgba, unsigned int width, unsigned int height,
248 unsigned int nThreads = 0);
249 static void demosaicBGGRToRGBaBilinear(const uint16_t *bggr, uint16_t *rgba, unsigned int width, unsigned int height,
250 unsigned int nThreads = 0);
251
252 static void demosaicGBRGToRGBaBilinear(const uint8_t *gbrg, uint8_t *rgba, unsigned int width, unsigned int height,
253 unsigned int nThreads = 0);
254 static void demosaicGBRGToRGBaBilinear(const uint16_t *gbrg, uint16_t *rgba, unsigned int width, unsigned int height,
255 unsigned int nThreads = 0);
256
257 static void demosaicGRBGToRGBaBilinear(const uint8_t *grbg, uint8_t *rgba, unsigned int width, unsigned int height,
258 unsigned int nThreads = 0);
259 static void demosaicGRBGToRGBaBilinear(const uint16_t *grbg, uint16_t *rgba, unsigned int width, unsigned int height,
260 unsigned int nThreads = 0);
261
262 static void demosaicRGGBToRGBaBilinear(const uint8_t *rggb, uint8_t *rgba, unsigned int width, unsigned int height,
263 unsigned int nThreads = 0);
264 static void demosaicRGGBToRGBaBilinear(const uint16_t *rggb, uint16_t *rgba, unsigned int width, unsigned int height,
265 unsigned int nThreads = 0);
266
267 static void demosaicBGGRToRGBaMalvar(const uint8_t *bggr, uint8_t *rgba, unsigned int width, unsigned int height,
268 unsigned int nThreads = 0);
269 static void demosaicBGGRToRGBaMalvar(const uint16_t *bggr, uint16_t *rgba, unsigned int width, unsigned int height,
270 unsigned int nThreads = 0);
271
272 static void demosaicGBRGToRGBaMalvar(const uint8_t *gbrg, uint8_t *rgba, unsigned int width, unsigned int height,
273 unsigned int nThreads = 0);
274 static void demosaicGBRGToRGBaMalvar(const uint16_t *gbrg, uint16_t *rgba, unsigned int width, unsigned int height,
275 unsigned int nThreads = 0);
276
277 static void demosaicGRBGToRGBaMalvar(const uint8_t *grbg, uint8_t *rgba, unsigned int width, unsigned int height,
278 unsigned int nThreads = 0);
279 static void demosaicGRBGToRGBaMalvar(const uint16_t *grbg, uint16_t *rgba, unsigned int width, unsigned int height,
280 unsigned int nThreads = 0);
281
282 static void demosaicRGGBToRGBaMalvar(const uint8_t *rggb, uint8_t *rgba, unsigned int width, unsigned int height,
283 unsigned int nThreads = 0);
284 static void demosaicRGGBToRGBaMalvar(const uint16_t *rggb, uint16_t *rgba, unsigned int width, unsigned int height,
285 unsigned int nThreads = 0);
286
287private:
288 static void computeYCbCrLUT();
289
290 static void HSV2RGB(const double *hue, const double *saturation, const double *value, unsigned char *rgba,
291 unsigned int size, unsigned int step);
292 static void RGB2HSV(const unsigned char *rgb, double *hue, double *saturation, double *value, unsigned int size,
293 unsigned int step);
294
295private:
296 static bool YCbCrLUTcomputed;
297 static int vpCrr[256];
298 static int vpCgb[256];
299 static int vpCgr[256];
300 static int vpCbb[256];
301};
302
303#endif
static void convert(const vpImage< Type > &src, vpImage< Type > &dest)
static void YUVToRGB(unsigned char y, unsigned char u, unsigned char v, unsigned char &r, unsigned char &g, unsigned char &b)
Definition of the vpImage class member functions.
Definition vpImage.h:135