42#include <visp3/core/vpImage.h>
43#include <visp3/core/vpImageConvert.h>
44#include <visp3/core/vpRGBa.h>
45#include <visp3/core/vpHSV.h>
49#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
51#ifdef ENABLE_VISP_NAMESPACE
55#ifndef DOXYGEN_SHOULD_SKIP_THIS
67template<
typename Type,
bool useFullScale >
68bool test_rgb(
const vpRGBa &rgb_computed,
const vpRGBa &rgb_truth,
72 if ((rgb_computed.
R != rgb_truth.
R) ||
73 (rgb_computed.
G != rgb_truth.
G) ||
74 (rgb_computed.
B != rgb_truth.
B)) {
76 std::cout << static_cast<int>(hsv_truth.
H) <<
","
77 <<
static_cast<int>(hsv_truth.
S) <<
","
78 <<
static_cast<int>(hsv_truth.
V) <<
"): Expected RGB value: ("
79 <<
static_cast<int>(rgb_truth.
R) <<
","
80 <<
static_cast<int>(rgb_truth.
G) <<
","
81 <<
static_cast<int>(rgb_truth.
B) <<
") converted value: ("
82 <<
static_cast<int>(rgb_computed.
R) <<
","
83 <<
static_cast<int>(rgb_computed.
G) <<
","
84 <<
static_cast<int>(rgb_computed.
B) <<
")" << std::endl;
94 bool isSuccess =
true;
96 std::vector< vpColVector> rgb_truth;
115 size_t size = rgb_truth.size();
117 for (
size_t test = 0; test < 2; ++test) {
128 std::vector< vpColVector > hsv_truth;
129 hsv_truth.emplace_back(std::vector<double>({ 0., 0., 0. }));
130 hsv_truth.emplace_back(std::vector<double>({ 0., 0., 255. }));
131 hsv_truth.emplace_back(std::vector<double>({ 0., 255., 255. }));
132 hsv_truth.emplace_back(std::vector<double>({ h_max * 120. / 360., 255., 255. }));
133 hsv_truth.emplace_back(std::vector<double>({ h_max * 240. / 360., 255., 255. }));
134 hsv_truth.emplace_back(std::vector<double>({ h_max * 60. / 360., 255., 255. }));
135 hsv_truth.emplace_back(std::vector<double>({ h_max * 180. / 360., 255., 255. }));
136 hsv_truth.emplace_back(std::vector<double>({ h_max * 300. / 360., 255., 255. }));
137 hsv_truth.emplace_back(std::vector<double>({ 0., 0., 128. }));
138 hsv_truth.emplace_back(std::vector<double>({ h_max * 60. / 360., 255., 128. }));
139 hsv_truth.emplace_back(std::vector<double>({ 0., 255., 128. }));
140 hsv_truth.emplace_back(std::vector<double>({ h_max * 120. / 360., 255., 128. }));
141 hsv_truth.emplace_back(std::vector<double>({ h_max * 180. / 360., 255., 128. }));
142 hsv_truth.emplace_back(std::vector<double>({ h_max * 240. / 360., 255., 128. }));
143 hsv_truth.emplace_back(std::vector<double>({ h_max * 300. / 360., 255., 128. }));
146 std::cout << std::endl <<
"----- Test hsv (unsigned char) -> rgba conversion with h full scale: " << (h_full ?
"yes" :
"no") <<
" -----" << std::endl;
147 for (
unsigned int id = 0;
id < size; ++id) {
148 vpRGBa rgba_truth(rgb_truth[
id]);
151 std::cout <<
"Running the test for H = " << hsv_truth[id][0] <<
" ..." << std::endl;
152 vpHSV<unsigned char, true> hsv(
static_cast<unsigned char>(hsv_truth[
id][0]),
static_cast<unsigned char>(hsv_truth[
id][1]),
static_cast<unsigned char>(hsv_truth[
id][2]));
154 isSuccess = isSuccess && test_rgb(rgba, rgba_truth, hsv);
159 std::cout <<
"Running the test for H = " << hsv_truth[id][0] <<
" ..." << std::endl;
160 vpHSV<unsigned char, false> hsv(
static_cast<unsigned char>(hsv_truth[
id][0]),
static_cast<unsigned char>(hsv_truth[
id][1]),
static_cast<unsigned char>(hsv_truth[
id][2]));
162 isSuccess = isSuccess && test_rgb(rgba, rgba_truth, hsv);
170 std::cout << std::endl <<
"----- Test hsv (double) -> rgba conversion -----" << std::endl;
171 for (
unsigned int id = 0;
id < size; ++id) {
172 vpRGBa rgba_truth(rgb_truth[
id]);
174 std::cout <<
"Running the test for HSV = " << hsv_truth[id][0] <<
" ; " << hsv_truth[id][1] <<
"; " << hsv_truth[id][2] <<
" ..." << std::endl;
175 for (
unsigned char c = 0; c < vpHSV<double>::nbChannels; ++c) {
176 hsv_vec[c] = hsv_vec[c] / 255.;
180 isSuccess = isSuccess && test_rgb(rgba, rgba_truth, hsv);
185 std::cout << std::endl <<
"----- Testing vpImageConvert::convert(vpImage<vpHSV>, vpImage<vpRGBa>) conversions -----" << std::endl;
192 bool localSuccess = vpHSVTests::areAlmostEqual(Irgb,
"Irgb", Irgb_truth,
"Irgb_truth");
194 std::cerr <<
"vpImageConvert(hsv<uchar, false>, rgba) failed!" << std::endl;
196 isSuccess = isSuccess && localSuccess;
199 localSuccess = vpHSVTests::areAlmostEqual(Irgb,
"Irgb", Irgb_truth,
"Irgb_truth");
201 std::cerr <<
"vpImageConvert(hsv<uchar, true>, rgba) failed!" << std::endl;
203 isSuccess = isSuccess && localSuccess;
206 localSuccess = vpHSVTests::areAlmostEqual(Irgb,
"Irgb", Irgb_truth,
"Irgb_truth");
208 std::cerr <<
"vpImageConvert(hsv<double>, rgba) failed!" << std::endl;
210 isSuccess = isSuccess && localSuccess;
213 std::cout <<
"All tests were successful !" << std::endl;
216 std::cerr <<
"ERROR: Something went wrong !" << std::endl;
223 std::cout <<
"vpHSV class is not available, please use CXX 11 standard" << std::endl;
Implementation of column vector and the associated operations.
Class implementing the HSV pixel format.
static constexpr unsigned char maxHueUsingLimitedRange
Maximum value of the Hue channel when using unsigned char and the limited range.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
Definition of the vpImage class member functions.
static int round(double x)
unsigned char B
Blue component.
unsigned char R
Red component.
unsigned char G
Green component.