38#include <visp3/core/vpConfig.h>
40#if defined(VISP_HAVE_CATCH2) && (VISP_HAVE_DATASET_VERSION >= 0x030500) && defined(VISP_HAVE_THREADS)
42#include <catch_amalgamated.hpp>
45#include <visp3/core/vpIoTools.h>
46#include <visp3/io/vpImageIo.h>
48#ifdef ENABLE_VISP_NAMESPACE
53VP_ATTRIBUTE_NO_DESTROY
static const std::string path = ipath +
"/Solvay/Solvay_conference_1927_Version2_640x440";
55static const double ccThreshPNG = 1.0;
56static const double ccThreshJPG = 0.99;
58VP_ATTRIBUTE_NO_DESTROY
static const std::vector<vpImageIo::vpImageIoBackendType> backends
60#if defined(VISP_HAVE_JPEG) && defined(VISP_HAVE_PNG)
63#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGCODECS)
66#if defined VISP_HAVE_SIMDLIB
69#if defined VISP_HAVE_STBIMAGE
74VP_ATTRIBUTE_NO_DESTROY
static const std::vector<std::string> backendNamesJpeg
76#if defined(VISP_HAVE_JPEG)
79#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGCODECS)
85VP_ATTRIBUTE_NO_DESTROY
static std::vector<std::string> backendNamesPng
87#if defined(VISP_HAVE_PNG)
90#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGCODECS)
96VP_ATTRIBUTE_NO_DESTROY
static const std::vector<vpImageIo::vpImageIoBackendType> backendsInMemory
98#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGCODECS)
101#if defined VISP_HAVE_STBIMAGE
106VP_ATTRIBUTE_NO_DESTROY
static std::vector<std::string> backendNamesPngInMemory
108#if defined(VISP_HAVE_OPENCV) && defined(HAVE_OPENCV_IMGCODECS)
111#if defined VISP_HAVE_STBIMAGE
116static const unsigned int imgWidth = 640;
117static const unsigned int imgHeight = 440;
126 double num = 0, den1 = 0, den2 = 0;
127 for (
unsigned int i = 0;
i < I1.
getSize();
i++) {
130 double x1_m = x1 - m1;
131 double x2_m = x2 - m2;
137 return num / (std::sqrt(den1) * std::sqrt(den2));
145 double num = 0, den1 = 0, den2 = 0;
146 for (
unsigned int i = 0;
i < I1.
getSize();
i++) {
149 double x1_m = x1 - m1;
150 double x2_m = x2 - m2;
156 return num / (std::sqrt(den1) * std::sqrt(den2));
160TEST_CASE(
"Test grayscale JPEG image loading",
"[image_I/O]")
165 for (
size_t j = 0;
j < backends.size();
j++) {
168 SECTION(backendNamesJpeg[j] +
" backend")
171 double cc = computePearsonCC(I_ref, I);
172 std::cout << backendNamesJpeg[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
173 CHECK(cc >= Catch::Approx(ccThreshJPG));
174 CHECK(I.getWidth() == imgWidth);
175 CHECK(I.getHeight() == imgHeight);
180TEST_CASE(
"Test RGBA JPEG image loading",
"[image_I/O]")
185 for (
size_t j = 0;
j < backends.size();
j++) {
188 SECTION(backendNamesJpeg[j] +
" backend")
191 double cc = computePearsonCC(I_ref, I);
192 std::cout << backendNamesJpeg[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
193 CHECK(cc >= Catch::Approx(ccThreshJPG));
194 CHECK(I.getWidth() == imgWidth);
195 CHECK(I.getHeight() == imgHeight);
200TEST_CASE(
"Test grayscale PNG image loading",
"[image_I/O]")
205 for (
size_t j = 0;
j < backends.size();
j++) {
208 SECTION(backendNamesPng[j] +
" backend")
211 double cc = computePearsonCC(I_ref, I);
212 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
213 CHECK(cc == Catch::Approx(ccThreshPNG));
214 CHECK(I.getWidth() == imgWidth);
215 CHECK(I.getHeight() == imgHeight);
220TEST_CASE(
"Test RGBA PNG image loading",
"[image_I/O]")
225 for (
size_t j = 0;
j < backends.size();
j++) {
228 SECTION(backendNamesPng[j] +
" backend")
231 double cc = computePearsonCC(I_ref, I);
232 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
233 CHECK(cc == Catch::Approx(ccThreshPNG));
234 CHECK(I.getWidth() == imgWidth);
235 CHECK(I.getHeight() == imgHeight);
240TEST_CASE(
"Test grayscale JPEG image saving",
"[image_I/O]")
243 std::string directory_filename_tmp =
251 for (
size_t j = 0;
j < backends.size();
j++) {
252 SECTION(backendNamesJpeg[j] +
" backend")
254 CHECK_NOTHROW(
vpImageIo::write(I, directory_filename_tmp +
"/ViSP_tmp_perf_write.jpg", backends[j]));
256 vpImageIo::read(I_read, directory_filename_tmp +
"/ViSP_tmp_perf_write.jpg");
257 double cc = computePearsonCC(I_read, I);
258 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
259 CHECK(cc >= Catch::Approx(ccThreshJPG));
266TEST_CASE(
"Test RGBA JPEG image saving",
"[image_I/O]")
269 std::string directory_filename_tmp =
277 for (
size_t j = 0;
j < backends.size();
j++) {
278 SECTION(backendNamesJpeg[j] +
" backend")
280 CHECK_NOTHROW(
vpImageIo::write(I, directory_filename_tmp +
"/ViSP_tmp_perf_write.jpg", backends[j]));
282 vpImageIo::read(I_read, directory_filename_tmp +
"/ViSP_tmp_perf_write.jpg");
283 double cc = computePearsonCC(I_read, I);
284 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
285 CHECK(cc >= Catch::Approx(ccThreshJPG));
292TEST_CASE(
"Test grayscale PNG image saving",
"[image_I/O]")
295 std::string directory_filename_tmp =
303 for (
size_t j = 0;
j < backends.size();
j++) {
304 SECTION(backendNamesPng[j] +
" backend")
306 CHECK_NOTHROW(
vpImageIo::write(I, directory_filename_tmp +
"/ViSP_tmp_perf_write.png", backends[j]));
308 vpImageIo::read(I_read, directory_filename_tmp +
"/ViSP_tmp_perf_write.png");
309 double cc = computePearsonCC(I_read, I);
310 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
311 CHECK(cc == Catch::Approx(ccThreshPNG));
318TEST_CASE(
"Test RGBA PNG image saving",
"[image_I/O]")
321 std::string directory_filename_tmp =
329 for (
size_t j = 0;
j < backends.size();
j++) {
330 SECTION(backendNamesPng[j] +
" backend")
332 CHECK_NOTHROW(
vpImageIo::write(I, directory_filename_tmp +
"/ViSP_tmp_perf_write.png", backends[j]));
334 vpImageIo::read(I_read, directory_filename_tmp +
"/ViSP_tmp_perf_write.png");
335 double cc = computePearsonCC(I_read, I);
336 std::cout << backendNamesPng[
j] <<
" backend Pearson correlation coefficient: " << cc << std::endl;
337 CHECK(cc == Catch::Approx(ccThreshPNG));
344TEST_CASE(
"Test grayscale in-memory PNG image encoding/decoding",
"[image_I/O]")
350 for (
size_t i = 0;
i < backendsInMemory.size();
i++) {
351 SECTION(backendNamesPngInMemory[i] +
" backend")
353 std::vector<unsigned char> buffer;
355 REQUIRE(!buffer.empty());
357 for (
size_t j = 0;
j < backendsInMemory.size();
j++) {
358 SECTION(backendNamesPngInMemory[i] +
" backend")
369TEST_CASE(
"Test color in-memory PNG image encoding/decoding",
"[image_I/O]")
375 for (
size_t i = 0;
i < backendsInMemory.size();
i++) {
376 SECTION(backendNamesPngInMemory[i] +
" backend")
379 std::vector<unsigned char> buffer;
380 const bool saveAlpha =
false;
382 REQUIRE(!buffer.empty());
384 for (
size_t j = 0;
j < backendsInMemory.size();
j++) {
385 SECTION(backendNamesPngInMemory[i] +
" backend")
394 std::vector<unsigned char> buffer;
395 const bool saveAlpha =
true;
397 REQUIRE(!buffer.empty());
399 for (
size_t j = 0;
j < backendsInMemory.size();
j++) {
400 SECTION(backendNamesPngInMemory[i] +
" backend")
412int main(
int argc,
char *argv[])
414 Catch::Session session;
415 session.applyCommandLine(argc, argv);
417 int numFailed = session.run();
424int main() {
return EXIT_SUCCESS; }
@ IO_STB_IMAGE_BACKEND
Use embedded stb_image library.
@ IO_SIMDLIB_BACKEND
Use embedded simd library.
@ IO_SYSTEM_LIB_BACKEND
Use system libraries like libpng or libjpeg-turbo.
@ IO_OPENCV_BACKEND
Use OpenCV imgcodecs module.
static void read(vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
static void readPNGfromMem(const std::vector< unsigned char > &buffer, vpImage< unsigned char > &I, int backend=IO_DEFAULT_BACKEND)
static void writePNGtoMem(const vpImage< unsigned char > &I, std::vector< unsigned char > &buffer, int backend=IO_DEFAULT_BACKEND)
static void write(const vpImage< unsigned char > &I, const std::string &filename, int backend=IO_DEFAULT_BACKEND)
Definition of the vpImage class member functions.
double getSum(const vpImage< bool > *p_mask=nullptr, unsigned int *nbValidPoints=nullptr) const
Compute the sum of image intensities.
unsigned int getSize() const
Type * bitmap
points toward the bitmap
VISP_EXPORT std::string getDateTime(const std::string &format="%Y/%m/%d %H:%M:%S")