From f1328c7395178f8b9bf39bde093866f49996239b Mon Sep 17 00:00:00 2001 From: catree Date: Sun, 19 Jun 2022 22:59:50 +0200 Subject: [PATCH 01/29] Add a small exercise to show the warping of the homography transformations step-by-step. --- doc/tutorials/features2d/homography/homography.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/tutorials/features2d/homography/homography.markdown b/doc/tutorials/features2d/homography/homography.markdown index e5009798c3..b8c17c0856 100644 --- a/doc/tutorials/features2d/homography/homography.markdown +++ b/doc/tutorials/features2d/homography/homography.markdown @@ -416,6 +416,12 @@ The homography matrices are similar. If we compare the image 1 warped using both Visually, it is hard to distinguish a difference between the result image from the homography computed from the camera displacement and the one estimated with @ref cv::findHomography function. +#### Exercise + +This demo shows you how to compute the homography transformation from two camera poses. Try to perform the same operations, but by computing N inter homography this time. Instead of computing one homography to directly warp the source image to the desired camera viewpoint, perform N warping operations to the see the different transformations operating. + +You should get something similar to this video: + ### Demo 4: Decompose the homography matrix {#tutorial_homography_Demo4} OpenCV 3 contains the function @ref cv::decomposeHomographyMat which allows to decompose the homography matrix to a set of rotations, translations and plane normals. From 79731cb0ff790481e48d4a6170b60f9683d76de6 Mon Sep 17 00:00:00 2001 From: "@lizhiyu3" Date: Tue, 5 Jul 2022 15:43:52 +0800 Subject: [PATCH 02/29] fix the bug when src*2 < dst --- modules/imgproc/src/pyramids.cpp | 22 ++++++++++++---- modules/imgproc/test/test_pyramid.cpp | 37 ++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/modules/imgproc/src/pyramids.cpp b/modules/imgproc/src/pyramids.cpp index 0261dd4de3..e8227b614c 100644 --- a/modules/imgproc/src/pyramids.cpp +++ b/modules/imgproc/src/pyramids.cpp @@ -983,13 +983,25 @@ pyrUp_( const Mat& _src, Mat& _dst, int) row0 = rows[0]; row1 = rows[1]; row2 = rows[2]; dsts[0] = dst0; dsts[1] = dst1; - x = PyrUpVecV(rows, dsts, dsize.width); - for( ; x < dsize.width; x++ ) + if (dst0 != dst1) { - T t1 = castOp((row1[x] + row2[x])*4); - T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); - dst1[x] = t1; dst0[x] = t0; + x = PyrUpVecV(rows, dsts, dsize.width); + for( ; x < dsize.width; x++ ) + { + T t1 = castOp((row1[x] + row2[x])*4); + T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); + dst1[x] = t1; dst0[x] = t0; + } } + else + { + for(x = 0; x < dsize.width; x++ ) + { + T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); + dst0[x] = t0; + } + } + } if (dsize.height > ssize.height*2) diff --git a/modules/imgproc/test/test_pyramid.cpp b/modules/imgproc/test/test_pyramid.cpp index 343d7a2321..cdf72b7850 100644 --- a/modules/imgproc/test/test_pyramid.cpp +++ b/modules/imgproc/test/test_pyramid.cpp @@ -8,12 +8,41 @@ namespace opencv_test { namespace { TEST(Imgproc_PyrUp, pyrUp_regression_22184) { - Mat src(100, 100, CV_16UC3, Scalar::all(255)); - Mat dst(100 * 2 + 1, 100 * 2 + 1, CV_16UC3, Scalar::all(0)); + Mat src(100,100,CV_16UC3,Scalar(255,255,255)); + Mat dst(100 * 2 + 1, 100 * 2 + 1, CV_16UC3, Scalar(0,0,0)); pyrUp(src, dst, Size(dst.cols, dst.rows)); - double min_val = 0; + double min_val; minMaxLoc(dst, &min_val); ASSERT_GT(cvRound(min_val), 0); } -}} // namespace +TEST(Imgproc_PyrUp, pyrUp_regression_22193) +{ + Mat src(13, 13,CV_16UC3,Scalar(0,0,0)); + { + int swidth = src.cols; + int sheight = src.rows; + int cn = src.channels(); + int count = 0; + for (int y = 0; y < sheight; y++) + { + ushort *src_c = src.ptr(y); + for (int x = 0; x < swidth * cn; x++) + { + src_c[x] = (count++) % 10; + } + } + } + Mat dst(src.cols * 2 - 1, src.rows * 2 - 1, CV_16UC3, Scalar(0,0,0)); + pyrUp(src, dst, Size(dst.cols, dst.rows)); + + { + ushort *dst_c = dst.ptr(dst.rows - 1); + ASSERT_EQ(dst_c[0], 6); + ASSERT_EQ(dst_c[1], 6); + ASSERT_EQ(dst_c[2], 1); + } +} + +} +} From c54ccaac31491ffa0f670e4e12e962dc5326e0b7 Mon Sep 17 00:00:00 2001 From: "@lizhiyu3" Date: Tue, 5 Jul 2022 15:50:33 +0800 Subject: [PATCH 03/29] change test number --- modules/imgproc/test/test_pyramid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/test/test_pyramid.cpp b/modules/imgproc/test/test_pyramid.cpp index cdf72b7850..e02e5e343d 100644 --- a/modules/imgproc/test/test_pyramid.cpp +++ b/modules/imgproc/test/test_pyramid.cpp @@ -16,7 +16,7 @@ TEST(Imgproc_PyrUp, pyrUp_regression_22184) ASSERT_GT(cvRound(min_val), 0); } -TEST(Imgproc_PyrUp, pyrUp_regression_22193) +TEST(Imgproc_PyrUp, pyrUp_regression_22194) { Mat src(13, 13,CV_16UC3,Scalar(0,0,0)); { From 01226cb8ac19a664f3752c3ec3bff246943bec44 Mon Sep 17 00:00:00 2001 From: "@lizhiyu3" Date: Tue, 5 Jul 2022 15:43:52 +0800 Subject: [PATCH 04/29] fix the bug when src*2 < dst --- modules/imgproc/src/pyramids.cpp | 140 ++++++++++++++++++++++++-- modules/imgproc/test/test_pyramid.cpp | 37 ++++++- 2 files changed, 167 insertions(+), 10 deletions(-) diff --git a/modules/imgproc/src/pyramids.cpp b/modules/imgproc/src/pyramids.cpp index 0261dd4de3..a5f8a71c2c 100644 --- a/modules/imgproc/src/pyramids.cpp +++ b/modules/imgproc/src/pyramids.cpp @@ -82,6 +82,8 @@ template int PyrDownVecV(T1**, T2*, int) { return 0; } template int PyrUpVecV(T1**, T2**, int) { return 0; } +template int PyrUpVecVOneRow(T1**, T2*, int) { return 0; } + #if CV_SIMD template<> int PyrDownVecH(const uchar* src, int* row, int width) @@ -717,6 +719,120 @@ template <> int PyrUpVecV(float** src, float** dst, int width) return x; } +template <> int PyrUpVecVOneRow(int** src, uchar* dst, int width) +{ + int x = 0; + const int *row0 = src[0], *row1 = src[1], *row2 = src[2]; + + for( ; x <= width - v_uint8::nlanes; x += v_uint8::nlanes) + { + v_int16 v_r00 = v_pack(vx_load(row0 + x), vx_load(row0 + x + v_int32::nlanes)), + v_r01 = v_pack(vx_load(row0 + x + 2 * v_int32::nlanes), vx_load(row0 + x + 3 * v_int32::nlanes)), + v_r10 = v_pack(vx_load(row1 + x), vx_load(row1 + x + v_int32::nlanes)), + v_r11 = v_pack(vx_load(row1 + x + 2 * v_int32::nlanes), vx_load(row1 + x + 3 * v_int32::nlanes)), + v_r20 = v_pack(vx_load(row2 + x), vx_load(row2 + x + v_int32::nlanes)), + v_r21 = v_pack(vx_load(row2 + x + 2 * v_int32::nlanes), vx_load(row2 + x + 3 * v_int32::nlanes)); + v_int16 v_2r10 = v_r10 + v_r10, v_2r11 = (v_r11 + v_r11); + v_store(dst + x, v_rshr_pack_u<6>(v_r00 + v_r20 + (v_2r10 + v_2r10 + v_2r10), v_r01 + v_r21 + (v_2r11 + v_2r11 + v_2r11))); + } + if(x <= width - v_uint16::nlanes) + { + v_int16 v_r00 = v_pack(vx_load(row0 + x), vx_load(row0 + x + v_int32::nlanes)), + v_r10 = v_pack(vx_load(row1 + x), vx_load(row1 + x + v_int32::nlanes)), + v_r20 = v_pack(vx_load(row2 + x), vx_load(row2 + x + v_int32::nlanes)); + v_int16 v_2r10 = v_r10 + v_r10; + v_rshr_pack_u_store<6>(dst + x, v_r00 + v_r20 + (v_2r10 + v_2r10 + v_2r10)); + x += v_uint16::nlanes; + } + typedef int CV_DECL_ALIGNED(1) unaligned_int; + for (; x <= width - v_int32x4::nlanes; x += v_int32x4::nlanes) + { + v_int32 v_r00 = vx_load(row0 + x), + v_r10 = vx_load(row1 + x), + v_r20 = vx_load(row2 + x); + v_int32 v_2r10 = v_r10 + v_r10; + v_int16 d = v_pack(v_r00 + v_r20 + (v_2r10 + v_2r10 + v_2r10), (v_r10 + v_r20) << 2); + *(unaligned_int*)(dst + x) = v_reinterpret_as_s32(v_rshr_pack_u<6>(d, vx_setzero_s16())).get0(); + } + vx_cleanup(); + + return x; +} + +template <> int PyrUpVecVOneRow(int** src, short* dst, int width) +{ + int x = 0; + const int *row0 = src[0], *row1 = src[1], *row2 = src[2]; + + for( ; x <= width - v_int16::nlanes; x += v_int16::nlanes) + { + v_int32 v_r00 = vx_load(row0 + x), + v_r01 = vx_load(row0 + x + v_int32::nlanes), + v_r10 = vx_load(row1 + x), + v_r11 = vx_load(row1 + x + v_int32::nlanes), + v_r20 = vx_load(row2 + x), + v_r21 = vx_load(row2 + x + v_int32::nlanes); + v_store(dst + x, v_rshr_pack<6>(v_r00 + v_r20 + ((v_r10 << 1) + (v_r10 << 2)), v_r01 + v_r21 + ((v_r11 << 1) + (v_r11 << 2)))); + } + if(x <= width - v_int32::nlanes) + { + v_int32 v_r00 = vx_load(row0 + x), + v_r10 = vx_load(row1 + x), + v_r20 = vx_load(row2 + x); + v_rshr_pack_store<6>(dst + x, v_r00 + v_r20 + ((v_r10 << 1) + (v_r10 << 2))); + x += v_int32::nlanes; + } + vx_cleanup(); + + return x; +} + +template <> int PyrUpVecVOneRow(int** src, ushort* dst, int width) +{ + int x = 0; + const int *row0 = src[0], *row1 = src[1], *row2 = src[2]; + + for( ; x <= width - v_uint16::nlanes; x += v_uint16::nlanes) + { + v_int32 v_r00 = vx_load(row0 + x), + v_r01 = vx_load(row0 + x + v_int32::nlanes), + v_r10 = vx_load(row1 + x), + v_r11 = vx_load(row1 + x + v_int32::nlanes), + v_r20 = vx_load(row2 + x), + v_r21 = vx_load(row2 + x + v_int32::nlanes); + v_store(dst + x, v_rshr_pack_u<6>(v_r00 + v_r20 + ((v_r10 << 1) + (v_r10 << 2)), v_r01 + v_r21 + ((v_r11 << 1) + (v_r11 << 2)))); + } + if(x <= width - v_int32::nlanes) + { + v_int32 v_r00 = vx_load(row0 + x), + v_r10 = vx_load(row1 + x), + v_r20 = vx_load(row2 + x); + v_rshr_pack_u_store<6>(dst + x, v_r00 + v_r20 + ((v_r10 << 1) + (v_r10 << 2))); + x += v_int32::nlanes; + } + vx_cleanup(); + + return x; +} + +template <> int PyrUpVecVOneRow(float** src, float* dst, int width) +{ + int x = 0; + const float *row0 = src[0], *row1 = src[1], *row2 = src[2]; + + v_float32 v_6 = vx_setall_f32(6.0f), v_scale = vx_setall_f32(1.f/64.f); + for( ; x <= width - v_float32::nlanes; x += v_float32::nlanes) + { + v_float32 v_r0 = vx_load(row0 + x), + v_r1 = vx_load(row1 + x), + v_r2 = vx_load(row2 + x); + v_store(dst + x, v_scale * (v_muladd(v_6, v_r1, v_r0) + v_r2)); + } + vx_cleanup(); + + return x; +} + #endif template @@ -963,7 +1079,7 @@ pyrUp_( const Mat& _src, Mat& _dst, int) if (dsize.width > ssize.width*2) { - row[(_dst.cols-1) * cn + x] = row[dx + cn]; + row[(_dst.cols-1) + x] = row[dx + cn]; } } @@ -983,12 +1099,24 @@ pyrUp_( const Mat& _src, Mat& _dst, int) row0 = rows[0]; row1 = rows[1]; row2 = rows[2]; dsts[0] = dst0; dsts[1] = dst1; - x = PyrUpVecV(rows, dsts, dsize.width); - for( ; x < dsize.width; x++ ) + if (dst0 != dst1) { - T t1 = castOp((row1[x] + row2[x])*4); - T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); - dst1[x] = t1; dst0[x] = t0; + x = PyrUpVecV(rows, dsts, dsize.width); + for( ; x < dsize.width; x++ ) + { + T t1 = castOp((row1[x] + row2[x])*4); + T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); + dst1[x] = t1; dst0[x] = t0; + } + } + else + { + x = PyrUpVecVOneRow(rows, dst0, dsize.width); + for( ; x < dsize.width; x++ ) + { + T t0 = castOp(row0[x] + row1[x]*6 + row2[x]); + dst0[x] = t0; + } } } diff --git a/modules/imgproc/test/test_pyramid.cpp b/modules/imgproc/test/test_pyramid.cpp index 343d7a2321..e02e5e343d 100644 --- a/modules/imgproc/test/test_pyramid.cpp +++ b/modules/imgproc/test/test_pyramid.cpp @@ -8,12 +8,41 @@ namespace opencv_test { namespace { TEST(Imgproc_PyrUp, pyrUp_regression_22184) { - Mat src(100, 100, CV_16UC3, Scalar::all(255)); - Mat dst(100 * 2 + 1, 100 * 2 + 1, CV_16UC3, Scalar::all(0)); + Mat src(100,100,CV_16UC3,Scalar(255,255,255)); + Mat dst(100 * 2 + 1, 100 * 2 + 1, CV_16UC3, Scalar(0,0,0)); pyrUp(src, dst, Size(dst.cols, dst.rows)); - double min_val = 0; + double min_val; minMaxLoc(dst, &min_val); ASSERT_GT(cvRound(min_val), 0); } -}} // namespace +TEST(Imgproc_PyrUp, pyrUp_regression_22194) +{ + Mat src(13, 13,CV_16UC3,Scalar(0,0,0)); + { + int swidth = src.cols; + int sheight = src.rows; + int cn = src.channels(); + int count = 0; + for (int y = 0; y < sheight; y++) + { + ushort *src_c = src.ptr(y); + for (int x = 0; x < swidth * cn; x++) + { + src_c[x] = (count++) % 10; + } + } + } + Mat dst(src.cols * 2 - 1, src.rows * 2 - 1, CV_16UC3, Scalar(0,0,0)); + pyrUp(src, dst, Size(dst.cols, dst.rows)); + + { + ushort *dst_c = dst.ptr(dst.rows - 1); + ASSERT_EQ(dst_c[0], 6); + ASSERT_EQ(dst_c[1], 6); + ASSERT_EQ(dst_c[2], 1); + } +} + +} +} From e59cff47d404cc41ce3a4c9cc7a407bdbf0bda90 Mon Sep 17 00:00:00 2001 From: "@lizhiyu3" Date: Wed, 20 Jul 2022 17:03:09 +0800 Subject: [PATCH 05/29] fix the right border --- modules/imgproc/src/pyramids.cpp | 2 +- modules/imgproc/test/test_pyramid.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/imgproc/src/pyramids.cpp b/modules/imgproc/src/pyramids.cpp index 5727e46255..9b4ad5d840 100644 --- a/modules/imgproc/src/pyramids.cpp +++ b/modules/imgproc/src/pyramids.cpp @@ -1079,7 +1079,7 @@ pyrUp_( const Mat& _src, Mat& _dst, int) if (dsize.width > ssize.width*2) { - row[(_dst.cols-1) + x] = row[dx + cn]; + row[(_dst.cols-1) * cn + x] = row[dx + cn]; } } diff --git a/modules/imgproc/test/test_pyramid.cpp b/modules/imgproc/test/test_pyramid.cpp index e02e5e343d..0556ce6fa6 100644 --- a/modules/imgproc/test/test_pyramid.cpp +++ b/modules/imgproc/test/test_pyramid.cpp @@ -11,7 +11,7 @@ TEST(Imgproc_PyrUp, pyrUp_regression_22184) Mat src(100,100,CV_16UC3,Scalar(255,255,255)); Mat dst(100 * 2 + 1, 100 * 2 + 1, CV_16UC3, Scalar(0,0,0)); pyrUp(src, dst, Size(dst.cols, dst.rows)); - double min_val; + double min_val = 0; minMaxLoc(dst, &min_val); ASSERT_GT(cvRound(min_val), 0); } From 99683e958a1255de2928fd7742c8b8a799dfb7c0 Mon Sep 17 00:00:00 2001 From: Kian Eliasi Date: Fri, 12 Aug 2022 19:26:59 +0430 Subject: [PATCH 06/29] Fix the example in py_calib3d/py_calibration --- .../py_calib3d/py_calibration/py_calibration.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/py_tutorials/py_calib3d/py_calibration/py_calibration.markdown b/doc/py_tutorials/py_calib3d/py_calibration/py_calibration.markdown index bba7b90b9f..182f1c845b 100644 --- a/doc/py_tutorials/py_calib3d/py_calibration/py_calibration.markdown +++ b/doc/py_tutorials/py_calib3d/py_calibration/py_calibration.markdown @@ -127,7 +127,7 @@ for fname in images: objpoints.append(objp) corners2 = cv.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria) - imgpoints.append(corners) + imgpoints.append(corners2) # Draw and display the corners cv.drawChessboardCorners(img, (7,6), corners2, ret) From 7ffb1037583ed7c4e21632a59b7f1aa653ae00e3 Mon Sep 17 00:00:00 2001 From: AleksandrPanov Date: Mon, 15 Aug 2022 10:15:12 +0300 Subject: [PATCH 07/29] QRcode, change INTER_LINEAR to INTER_LINEAR_EXACT fix python test_detect_and_decode_multi fix python test_detect_and_decode_multi, sort QR in multiDetect/multiDecode enable tests with "version_5_up.jpg", "version_5_top.jpg" remove lambda --- .../misc/python/test/test_qrcode_detect.py | 12 +++---- .../objdetect/perf/perf_qrcode_pipeline.cpp | 31 ++++++++++++++----- modules/objdetect/src/qrcode.cpp | 14 ++++----- modules/objdetect/test/test_qrcode.cpp | 2 +- 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/modules/objdetect/misc/python/test/test_qrcode_detect.py b/modules/objdetect/misc/python/test/test_qrcode_detect.py index 8a95c8bce5..0237900572 100644 --- a/modules/objdetect/misc/python/test/test_qrcode_detect.py +++ b/modules/objdetect/misc/python/test/test_qrcode_detect.py @@ -43,10 +43,10 @@ class qrcode_detector_test(NewOpenCVTests): retval, decoded_data, points, straight_qrcode = detector.detectAndDecodeMulti(img) self.assertTrue(retval) self.assertEqual(len(decoded_data), 6) - self.assertEqual(decoded_data[0], "TWO STEPS FORWARD") - self.assertEqual(decoded_data[1], "EXTRA") - self.assertEqual(decoded_data[2], "SKIP") - self.assertEqual(decoded_data[3], "STEP FORWARD") - self.assertEqual(decoded_data[4], "STEP BACK") - self.assertEqual(decoded_data[5], "QUESTION") + self.assertTrue("TWO STEPS FORWARD" in decoded_data) + self.assertTrue("EXTRA" in decoded_data) + self.assertTrue("SKIP" in decoded_data) + self.assertTrue("STEP FORWARD" in decoded_data) + self.assertTrue("STEP BACK" in decoded_data) + self.assertTrue("QUESTION" in decoded_data) self.assertEqual(points.shape, (6, 4, 2)) diff --git a/modules/objdetect/perf/perf_qrcode_pipeline.cpp b/modules/objdetect/perf/perf_qrcode_pipeline.cpp index 9e7960d819..efd7add204 100644 --- a/modules/objdetect/perf/perf_qrcode_pipeline.cpp +++ b/modules/objdetect/perf/perf_qrcode_pipeline.cpp @@ -55,6 +55,10 @@ PERF_TEST_P_(Perf_Objdetect_QRCode, decode) typedef ::perf::TestBaseWithParam< std::string > Perf_Objdetect_QRCode_Multi; +static inline bool compareCorners(const Point2f& corner1, const Point2f& corner2) { + return corner1.x == corner2.x ? corner1.y < corner2.y : corner1.x < corner2.x; +} + PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti) { const std::string name_current_image = GetParam(); @@ -66,9 +70,14 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, detectMulti) std::vector corners; QRCodeDetector qrcode; TEST_CYCLE() ASSERT_TRUE(qrcode.detectMulti(src, corners)); + sort(corners.begin(), corners.end(), compareCorners); SANITY_CHECK(corners); } +static inline bool compareQR(const pair& v1, const pair& v2) { + return v1.first < v2.first; +} + #ifdef HAVE_QUIRC PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti) { @@ -91,15 +100,21 @@ PERF_TEST_P_(Perf_Objdetect_QRCode_Multi, decodeMulti) ASSERT_FALSE(decoded_info[i].empty()); } } - std::vector < std::vector< uint8_t > > decoded_info_uint8_t; - for(size_t i = 0; i < decoded_info.size(); i++) - { - std::vector< uint8_t > tmp(decoded_info[i].begin(), decoded_info[i].end()); - decoded_info_uint8_t.push_back(tmp); + ASSERT_EQ(decoded_info.size(), straight_barcode.size()); + vector > result; + for (size_t i = 0ull; i < decoded_info.size(); i++) { + result.push_back(make_pair(decoded_info[i], straight_barcode[i])); } - SANITY_CHECK(decoded_info_uint8_t); - SANITY_CHECK(straight_barcode); - + sort(result.begin(), result.end(), compareQR); + vector > decoded_info_sort; + vector straight_barcode_sort; + for (size_t i = 0ull; i < result.size(); i++) { + vector tmp(result[i].first.begin(), result[i].first.end()); + decoded_info_sort.push_back(tmp); + straight_barcode_sort.push_back(result[i].second); + } + SANITY_CHECK(decoded_info_sort); + SANITY_CHECK(straight_barcode_sort); } #endif diff --git a/modules/objdetect/src/qrcode.cpp b/modules/objdetect/src/qrcode.cpp index d720f1b80b..0a4ac5a80c 100644 --- a/modules/objdetect/src/qrcode.cpp +++ b/modules/objdetect/src/qrcode.cpp @@ -136,7 +136,7 @@ void QRDetect::init(const Mat& src, double eps_vertical_, double eps_horizontal_ const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); } else if (min_side > 512.0) { @@ -524,7 +524,7 @@ bool QRDetect::localization() const int height = cvRound(bin_barcode.size().height * coeff_expansion); Size new_size(width, height); Mat intermediate; - resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); + resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT); bin_barcode = intermediate.clone(); for (size_t i = 0; i < localization_points.size(); i++) { @@ -537,7 +537,7 @@ bool QRDetect::localization() const int height = cvRound(bin_barcode.size().height / coeff_expansion); Size new_size(width, height); Mat intermediate; - resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); + resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT); bin_barcode = intermediate.clone(); for (size_t i = 0; i < localization_points.size(); i++) { @@ -2764,7 +2764,7 @@ void QRDetectMulti::init(const Mat& src, double eps_vertical_, double eps_horizo const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); } else if (min_side > 512.0) { @@ -3121,7 +3121,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio const int height = cvRound(bin_barcode.size().height * coeff_expansion); Size new_size(width, height); Mat intermediate; - resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); + resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT); bin_barcode = intermediate.clone(); } else if (purpose == ZOOMING) @@ -3130,7 +3130,7 @@ int QRDetectMulti::findNumberLocalizationPoints(vector& tmp_localizatio const int height = cvRound(bin_barcode.size().height / coeff_expansion); Size new_size(width, height); Mat intermediate; - resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR); + resize(bin_barcode, intermediate, new_size, 0, 0, INTER_LINEAR_EXACT); bin_barcode = intermediate.clone(); } else @@ -3148,7 +3148,7 @@ void QRDetectMulti::findQRCodeContours(vector& tmp_localization_points, const int width = cvRound(bin_barcode.size().width); const int height = cvRound(bin_barcode.size().height); Size new_size(width, height); - resize(bar, bar, new_size, 0, 0, INTER_LINEAR); + resize(bar, bar, new_size, 0, 0, INTER_LINEAR_EXACT); blur(bar, blur_image, Size(3, 3)); threshold(blur_image, threshold_output, 50, 255, THRESH_BINARY); diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index b5680387cb..0f50b77b36 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -11,7 +11,7 @@ std::string qrcode_images_name[] = { "version_2_down.jpg", "version_2_left.jpg", "version_2_right.jpg", "version_2_up.jpg", "version_2_top.jpg", "version_3_down.jpg", "version_3_left.jpg", "version_3_right.jpg", "version_3_up.jpg", "version_3_top.jpg", "version_4_down.jpg", "version_4_left.jpg", "version_4_right.jpg", "version_4_up.jpg", "version_4_top.jpg", - "version_5_down.jpg", "version_5_left.jpg"/*"version_5_right.jpg"*/, + "version_5_down.jpg", "version_5_left.jpg"/*"version_5_right.jpg"*/, "version_5_up.jpg", "version_5_top.jpg", "russian.jpg", "kanji.jpg", "link_github_ocv.jpg", "link_ocv.jpg", "link_wiki_cv.jpg" // version_5_right.jpg DISABLED after tile fix, PR #22025 }; From ef570e4e135e5c7259f194b2c4534ddc470db06a Mon Sep 17 00:00:00 2001 From: Andrey Senyaev Date: Mon, 22 Aug 2022 17:42:22 +0300 Subject: [PATCH 08/29] Suppress warnings in carotene on macOS ARM64 for 3.4 branch --- 3rdparty/carotene/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/3rdparty/carotene/CMakeLists.txt b/3rdparty/carotene/CMakeLists.txt index 3d49a2def6..091990d722 100644 --- a/3rdparty/carotene/CMakeLists.txt +++ b/3rdparty/carotene/CMakeLists.txt @@ -27,6 +27,10 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() endif() +if(APPLE AND CV_CLANG AND WITH_NEON) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-unused-function -Wno-c++11-extensions) +endif() + add_library(carotene_objs OBJECT EXCLUDE_FROM_ALL ${carotene_headers} ${carotene_sources} From 2dd3408caa7ad66781837107caeddd634189cc51 Mon Sep 17 00:00:00 2001 From: AleksandrPanov Date: Thu, 25 Aug 2022 14:27:18 +0300 Subject: [PATCH 09/29] change resize interpolation to enable tests in arm, disable close_5 --- modules/objdetect/test/test_qrcode.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/objdetect/test/test_qrcode.cpp b/modules/objdetect/test/test_qrcode.cpp index 0f50b77b36..62bec2fc68 100644 --- a/modules/objdetect/test/test_qrcode.cpp +++ b/modules/objdetect/test/test_qrcode.cpp @@ -3,6 +3,7 @@ // of this distribution and at http://opencv.org/license.html. #include "test_precomp.hpp" +#include "opencv2/imgproc.hpp" namespace opencv_test { namespace { @@ -16,8 +17,9 @@ std::string qrcode_images_name[] = { // version_5_right.jpg DISABLED after tile fix, PR #22025 }; +// Todo: fix corner align in big QRs to enable close_5.png std::string qrcode_images_close[] = { - "close_1.png", "close_2.png", "close_3.png", "close_4.png", "close_5.png" + "close_1.png", "close_2.png", "close_3.png", "close_4.png"//, "close_5.png" }; std::string qrcode_images_monitor[] = { "monitor_1.png", "monitor_2.png", "monitor_3.png", "monitor_4.png", "monitor_5.png" @@ -87,7 +89,7 @@ TEST(Objdetect_QRCode_Close, generate_test_data) const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); EXPECT_TRUE(detectQRCode(barcode, corners)); #ifdef HAVE_QUIRC EXPECT_TRUE(decodeQRCode(barcode, corners, decoded_info, straight_barcode)); @@ -125,7 +127,7 @@ TEST(Objdetect_QRCode_Monitor, generate_test_data) const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); EXPECT_TRUE(detectQRCode(barcode, corners)); #ifdef HAVE_QUIRC EXPECT_TRUE(decodeQRCode(barcode, corners, decoded_info, straight_barcode)); @@ -313,7 +315,7 @@ TEST_P(Objdetect_QRCode_Close, regression) const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); std::vector corners; std::string decoded_info; QRCodeDetector qrcode; @@ -380,7 +382,7 @@ TEST_P(Objdetect_QRCode_Monitor, regression) const int width = cvRound(src.size().width * coeff_expansion); const int height = cvRound(src.size().height * coeff_expansion); Size new_size(width, height); - resize(src, barcode, new_size, 0, 0, INTER_LINEAR); + resize(src, barcode, new_size, 0, 0, INTER_LINEAR_EXACT); std::vector corners; std::string decoded_info; QRCodeDetector qrcode; From e1305e8d05d2654d4c9edd3a0198c458b735088a Mon Sep 17 00:00:00 2001 From: Andrey Senyaev Date: Thu, 25 Aug 2022 18:17:03 +0300 Subject: [PATCH 10/29] Fixed a warning in case of typename on macOS ARM64 --- 3rdparty/carotene/CMakeLists.txt | 2 +- 3rdparty/carotene/src/add_weighted.cpp | 36 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/3rdparty/carotene/CMakeLists.txt b/3rdparty/carotene/CMakeLists.txt index 091990d722..ebcdf1a9f6 100644 --- a/3rdparty/carotene/CMakeLists.txt +++ b/3rdparty/carotene/CMakeLists.txt @@ -28,7 +28,7 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() if(APPLE AND CV_CLANG AND WITH_NEON) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-unused-function -Wno-c++11-extensions) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wno-unused-function) endif() add_library(carotene_objs OBJECT EXCLUDE_FROM_ALL diff --git a/3rdparty/carotene/src/add_weighted.cpp b/3rdparty/carotene/src/add_weighted.cpp index 1f89fb5372..6559b9fe53 100644 --- a/3rdparty/carotene/src/add_weighted.cpp +++ b/3rdparty/carotene/src/add_weighted.cpp @@ -109,9 +109,9 @@ template <> struct wAdd vgamma = vdupq_n_f32(_gamma + 0.5); } - void operator() (const typename VecTraits::vec128 & v_src0, - const typename VecTraits::vec128 & v_src1, - typename VecTraits::vec128 & v_dst) const + void operator() (const VecTraits::vec128 & v_src0, + const VecTraits::vec128 & v_src1, + VecTraits::vec128 & v_dst) const { float32x4_t vs1 = vcvtq_f32_s32(v_src0); float32x4_t vs2 = vcvtq_f32_s32(v_src1); @@ -121,9 +121,9 @@ template <> struct wAdd v_dst = vcvtq_s32_f32(vs1); } - void operator() (const typename VecTraits::vec64 & v_src0, - const typename VecTraits::vec64 & v_src1, - typename VecTraits::vec64 & v_dst) const + void operator() (const VecTraits::vec64 & v_src0, + const VecTraits::vec64 & v_src1, + VecTraits::vec64 & v_dst) const { float32x2_t vs1 = vcvt_f32_s32(v_src0); float32x2_t vs2 = vcvt_f32_s32(v_src1); @@ -153,9 +153,9 @@ template <> struct wAdd vgamma = vdupq_n_f32(_gamma + 0.5); } - void operator() (const typename VecTraits::vec128 & v_src0, - const typename VecTraits::vec128 & v_src1, - typename VecTraits::vec128 & v_dst) const + void operator() (const VecTraits::vec128 & v_src0, + const VecTraits::vec128 & v_src1, + VecTraits::vec128 & v_dst) const { float32x4_t vs1 = vcvtq_f32_u32(v_src0); float32x4_t vs2 = vcvtq_f32_u32(v_src1); @@ -165,9 +165,9 @@ template <> struct wAdd v_dst = vcvtq_u32_f32(vs1); } - void operator() (const typename VecTraits::vec64 & v_src0, - const typename VecTraits::vec64 & v_src1, - typename VecTraits::vec64 & v_dst) const + void operator() (const VecTraits::vec64 & v_src0, + const VecTraits::vec64 & v_src1, + VecTraits::vec64 & v_dst) const { float32x2_t vs1 = vcvt_f32_u32(v_src0); float32x2_t vs2 = vcvt_f32_u32(v_src1); @@ -197,17 +197,17 @@ template <> struct wAdd vgamma = vdupq_n_f32(_gamma + 0.5); } - void operator() (const typename VecTraits::vec128 & v_src0, - const typename VecTraits::vec128 & v_src1, - typename VecTraits::vec128 & v_dst) const + void operator() (const VecTraits::vec128 & v_src0, + const VecTraits::vec128 & v_src1, + VecTraits::vec128 & v_dst) const { float32x4_t vs1 = vmlaq_f32(vgamma, v_src0, valpha); v_dst = vmlaq_f32(vs1, v_src1, vbeta); } - void operator() (const typename VecTraits::vec64 & v_src0, - const typename VecTraits::vec64 & v_src1, - typename VecTraits::vec64 & v_dst) const + void operator() (const VecTraits::vec64 & v_src0, + const VecTraits::vec64 & v_src1, + VecTraits::vec64 & v_dst) const { float32x2_t vs1 = vmla_f32(vget_low(vgamma), v_src0, vget_low(valpha)); v_dst = vmla_f32(vs1, v_src1, vget_low(vbeta)); From 837e41f9a7acad9e300ba2693bfe8a3eda22c639 Mon Sep 17 00:00:00 2001 From: catree Date: Mon, 29 Aug 2022 23:55:00 +0200 Subject: [PATCH 11/29] Add -ws flag for cornerSubPix params (backported from 4.x). Add flags to set the camera intrinsic parameters as an initial guess (can allow converging to the correct camera intrinsic parameters). Add -imshow-scale flag to resize the image when displaying the results. Add -enable-k3 flag to enable or disable the estimation of the K3 distortion coefficient. --- samples/cpp/calibration.cpp | 86 +++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/samples/cpp/calibration.cpp b/samples/cpp/calibration.cpp index e827e4c26b..5d67600239 100644 --- a/samples/cpp/calibration.cpp +++ b/samples/cpp/calibration.cpp @@ -10,6 +10,7 @@ #include #include #include +#include using namespace cv; using namespace std; @@ -37,9 +38,6 @@ const char * usage = "\n" "\n"; - - - const char* liveCaptureHelp = "When the live video from camera is used as input, the following hot-keys may be used:\n" " , 'q' - quit the program\n" @@ -58,17 +56,24 @@ static void help(char** argv) " # of board views actually available)\n" " [-d=] # a minimum delay in ms between subsequent attempts to capture a next view\n" " # (used only for video capturing)\n" - " [-s=] # square size in some user-defined units (1 by default)\n" + " [-s=] # square size in some user-defined units (1 by default)\n" " [-o=] # the output filename for intrinsic [and extrinsic] parameters\n" " [-op] # write detected feature points\n" " [-oe] # write extrinsic parameters\n" " [-zt] # assume zero tangential distortion\n" - " [-a=] # fix aspect ratio (fx/fy)\n" + " [-a=] # fix aspect ratio (fx/fy)\n" " [-p] # fix the principal point at the center\n" " [-v] # flip the captured images around the horizontal axis\n" " [-V] # use a video file, and not an image list, uses\n" " # [input_data] string for the video file name\n" " [-su] # show undistorted images after calibration\n" + " [-ws=] # half of search window for cornerSubPix (11 by default)\n" + " [-fx=] # focal length in X-dir as an initial intrinsic guess (if this flag is used, fx, fy, cx, cy must be set)\n" + " [-fy=] # focal length in Y-dir as an initial intrinsic guess (if this flag is used, fx, fy, cx, cy must be set)\n" + " [-cx=] # camera center point in X-dir as an initial intrinsic guess (if this flag is used, fx, fy, cx, cy must be set)\n" + " [-cy=] # camera center point in Y-dir as an initial intrinsic guess (if this flag is used, fx, fy, cx, cy must be set)\n" + " [-imshow-scale # image resize scaling factor when displaying the results (must be >= 1)\n" + " [-enable-k3=<0/1> # to enable (1) or disable (0) K3 coefficient for the distortion model\n" " [input_data] # input data, one of the following:\n" " # - text file with a list of the images of the board\n" " # the text file can be generated with imagelist_creator\n" @@ -142,7 +147,6 @@ static bool runCalibration( vector > imagePoints, vector& reprojErrs, double& totalAvgErr) { - cameraMatrix = Mat::eye(3, 3, CV_64F); if( flags & CALIB_FIX_ASPECT_RATIO ) cameraMatrix.at(0,0) = aspectRatio; @@ -154,8 +158,7 @@ static bool runCalibration( vector > imagePoints, objectPoints.resize(imagePoints.size(),objectPoints[0]); double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, - distCoeffs, rvecs, tvecs, flags|CALIB_FIX_K4|CALIB_FIX_K5); - ///*|CALIB_FIX_K3*/|CALIB_FIX_K4|CALIB_FIX_K5); + distCoeffs, rvecs, tvecs, flags | CALIB_USE_LU); printf("RMS error reported by calibrateCamera: %g\n", rms); bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs); @@ -166,7 +169,6 @@ static bool runCalibration( vector > imagePoints, return ok; } - static void saveCameraParams( const string& filename, Size imageSize, Size boardSize, float squareSize, float aspectRatio, int flags, @@ -199,7 +201,7 @@ static void saveCameraParams( const string& filename, if( flags != 0 ) { - sprintf( buf, "flags: %s%s%s%s", + snprintf( buf, sizeof(buf), "flags: %s%s%s%s", flags & CALIB_USE_INTRINSIC_GUESS ? "+use_intrinsic_guess" : "", flags & CALIB_FIX_ASPECT_RATIO ? "+fix_aspectRatio" : "", flags & CALIB_FIX_PRINCIPAL_POINT ? "+fix_principal_point" : "", @@ -296,7 +298,7 @@ static bool runAndSave(const string& outputFilename, bool ok = runCalibration(imagePoints, imageSize, boardSize, patternType, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, rvecs, tvecs, reprojErrs, totalAvgErr); - printf("%s. avg reprojection error = %.2f\n", + printf("%s. avg reprojection error = %.7f\n", ok ? "Calibration succeeded" : "Calibration failed", totalAvgErr); @@ -312,11 +314,10 @@ static bool runAndSave(const string& outputFilename, return ok; } - int main( int argc, char** argv ) { Size boardSize, imageSize; - float squareSize, aspectRatio; + float squareSize, aspectRatio = 1; Mat cameraMatrix, distCoeffs; string outputFilename; string inputFilename = ""; @@ -339,7 +340,10 @@ int main( int argc, char** argv ) cv::CommandLineParser parser(argc, argv, "{help ||}{w||}{h||}{pt|chessboard|}{n|10|}{d|1000|}{s|1|}{o|out_camera_data.yml|}" - "{op||}{oe||}{zt||}{a|1|}{p||}{v||}{V||}{su||}" + "{op||}{oe||}{zt||}{a||}{p||}{v||}{V||}{su||}" + "{ws|11|}" + "{fx||}{fy||}{cx||}{cy||}" + "{imshow-scale|1|}{enable-k3|1|}" "{@input_data|0|}"); if (parser.has("help")) { @@ -362,12 +366,13 @@ int main( int argc, char** argv ) } squareSize = parser.get("s"); nframes = parser.get("n"); - aspectRatio = parser.get("a"); delay = parser.get("d"); writePoints = parser.has("op"); writeExtrinsics = parser.has("oe"); - if (parser.has("a")) + if (parser.has("a")) { flags |= CALIB_FIX_ASPECT_RATIO; + aspectRatio = parser.get("a"); + } if ( parser.has("zt") ) flags |= CALIB_ZERO_TANGENT_DIST; if ( parser.has("p") ) @@ -381,6 +386,24 @@ int main( int argc, char** argv ) cameraId = parser.get("@input_data"); else inputFilename = parser.get("@input_data"); + int winSize = parser.get("ws"); + cameraMatrix = Mat::eye(3, 3, CV_64F); + if (parser.has("fx") && parser.has("fy") && parser.has("cx") && parser.has("cy")) + { + cameraMatrix.at(0,0) = parser.get("fx"); + cameraMatrix.at(0,2) = parser.get("cx"); + cameraMatrix.at(1,1) = parser.get("fy"); + cameraMatrix.at(1,2) = parser.get("cy"); + flags |= CALIB_USE_INTRINSIC_GUESS; + std::cout << "Use the following camera matrix as an initial guess:\n" << cameraMatrix << std::endl; + } + int viewScaleFactor = parser.get("imshow-scale"); + bool useK3 = parser.get("enable-k3"); + std::cout << "Use K3 distortion coefficient? " << useK3 << std::endl; + if (!useK3) + { + flags |= CALIB_FIX_K3; + } if (!parser.check()) { help(argv); @@ -471,8 +494,8 @@ int main( int argc, char** argv ) } // improve the found corners' coordinate accuracy - if( pattern == CHESSBOARD && found) cornerSubPix( viewGray, pointbuf, Size(11,11), - Size(-1,-1), TermCriteria( TermCriteria::EPS+TermCriteria::COUNT, 30, 0.1 )); + if( pattern == CHESSBOARD && found) cornerSubPix( viewGray, pointbuf, Size(winSize,winSize), + Size(-1,-1), TermCriteria( TermCriteria::EPS+TermCriteria::COUNT, 30, 0.0001 )); if( mode == CAPTURING && found && (!capture.isOpened() || clock() - prevTimestamp > delay*1e-3*CLOCKS_PER_SEC) ) @@ -494,9 +517,9 @@ int main( int argc, char** argv ) if( mode == CAPTURING ) { if(undistortImage) - msg = format( "%d/%d Undist", (int)imagePoints.size(), nframes ); + msg = cv::format( "%d/%d Undist", (int)imagePoints.size(), nframes ); else - msg = format( "%d/%d", (int)imagePoints.size(), nframes ); + msg = cv::format( "%d/%d", (int)imagePoints.size(), nframes ); } putText( view, msg, textOrigin, 1, 1, @@ -510,8 +533,17 @@ int main( int argc, char** argv ) Mat temp = view.clone(); undistort(temp, view, cameraMatrix, distCoeffs); } + if (viewScaleFactor > 1) + { + Mat viewScale; + resize(view, viewScale, Size(), 1.0/viewScaleFactor, 1.0/viewScaleFactor, INTER_AREA); + imshow("Image View", viewScale); + } + else + { + imshow("Image View", view); + } - imshow("Image View", view); char key = (char)waitKey(capture.isOpened() ? 50 : 500); if( key == 27 ) @@ -552,9 +584,17 @@ int main( int argc, char** argv ) view = imread(imageList[i], 1); if(view.empty()) continue; - //undistort( view, rview, cameraMatrix, distCoeffs, cameraMatrix ); remap(view, rview, map1, map2, INTER_LINEAR); - imshow("Image View", rview); + if (viewScaleFactor > 1) + { + Mat rviewScale; + resize(rview, rviewScale, Size(), 1.0/viewScaleFactor, 1.0/viewScaleFactor, INTER_AREA); + imshow("Image View", rviewScale); + } + else + { + imshow("Image View", rview); + } char c = (char)waitKey(); if( c == 27 || c == 'q' || c == 'Q' ) break; From 1f0bfc8d8350dc41c09e1151437d0164e94f69b4 Mon Sep 17 00:00:00 2001 From: lamm45 <96844552+lamm45@users.noreply.github.com> Date: Sun, 26 Jun 2022 19:13:12 -0400 Subject: [PATCH 12/29] Fix angle discretization in Hough transforms In some situations the last value was missing from the discrete theta values. Now, the last value is chosen such that it is close to the user-provided maximum theta, while the distance to pi remains always at least theta_step/2. This should avoid duplicate detections. A better way would probably be to use max_theta as is and adjust the resolution (theta_step) instead, such that the discretization would always be uniform (in a circular sense) when full angle range is used. --- modules/imgproc/include/opencv2/imgproc.hpp | 24 +++++++++++---------- modules/imgproc/src/hough.cpp | 22 ++++++++++++++----- modules/imgproc/test/test_houghlines.cpp | 11 ++++++++++ 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index 4cb077f375..2250a09411 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -2024,23 +2024,24 @@ transform. @param image 8-bit, single-channel binary source image. The image may be modified by the function. @param lines Output vector of lines. Each line is represented by a 2 or 3 element vector -\f$(\rho, \theta)\f$ or \f$(\rho, \theta, \textrm{votes})\f$ . \f$\rho\f$ is the distance from the coordinate origin \f$(0,0)\f$ (top-left corner of -the image). \f$\theta\f$ is the line rotation angle in radians ( -\f$0 \sim \textrm{vertical line}, \pi/2 \sim \textrm{horizontal line}\f$ ). +\f$(\rho, \theta)\f$ or \f$(\rho, \theta, \textrm{votes})\f$, where \f$\rho\f$ is the distance from +the coordinate origin \f$(0,0)\f$ (top-left corner of the image), \f$\theta\f$ is the line rotation +angle in radians ( \f$0 \sim \textrm{vertical line}, \pi/2 \sim \textrm{horizontal line}\f$ ), and \f$\textrm{votes}\f$ is the value of accumulator. @param rho Distance resolution of the accumulator in pixels. @param theta Angle resolution of the accumulator in radians. -@param threshold Accumulator threshold parameter. Only those lines are returned that get enough +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough votes ( \f$>\texttt{threshold}\f$ ). -@param srn For the multi-scale Hough transform, it is a divisor for the distance resolution rho . +@param srn For the multi-scale Hough transform, it is a divisor for the distance resolution rho. The coarse accumulator distance resolution is rho and the accurate accumulator resolution is -rho/srn . If both srn=0 and stn=0 , the classical Hough transform is used. Otherwise, both these +rho/srn. If both srn=0 and stn=0, the classical Hough transform is used. Otherwise, both these parameters should be positive. @param stn For the multi-scale Hough transform, it is a divisor for the distance resolution theta. @param min_theta For standard and multi-scale Hough transform, minimum angle to check for lines. Must fall between 0 and max_theta. -@param max_theta For standard and multi-scale Hough transform, maximum angle to check for lines. -Must fall between min_theta and CV_PI. +@param max_theta For standard and multi-scale Hough transform, an upper bound for the angle. +Must fall between min_theta and CV_PI. The actual maximum angle in the accumulator may be slightly +less than max_theta, depending on the parameters min_theta and theta. */ CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines, double rho, double theta, int threshold, @@ -2068,7 +2069,7 @@ And this is the output of the above program in case of the probabilistic Hough t line segment. @param rho Distance resolution of the accumulator in pixels. @param theta Angle resolution of the accumulator in radians. -@param threshold Accumulator threshold parameter. Only those lines are returned that get enough +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough votes ( \f$>\texttt{threshold}\f$ ). @param minLineLength Minimum line length. Line segments shorter than that are rejected. @param maxLineGap Maximum allowed gap between points on the same line to link them. @@ -2087,13 +2088,14 @@ The function finds lines in a set of points using a modification of the Hough tr @param lines Output vector of found lines. Each vector is encoded as a vector \f$(votes, rho, theta)\f$. The larger the value of 'votes', the higher the reliability of the Hough line. @param lines_max Max count of Hough lines. -@param threshold Accumulator threshold parameter. Only those lines are returned that get enough +@param threshold %Accumulator threshold parameter. Only those lines are returned that get enough votes ( \f$>\texttt{threshold}\f$ ). @param min_rho Minimum value for \f$\rho\f$ for the accumulator (Note: \f$\rho\f$ can be negative. The absolute value \f$|\rho|\f$ is the distance of a line to the origin.). @param max_rho Maximum value for \f$\rho\f$ for the accumulator. @param rho_step Distance resolution of the accumulator. @param min_theta Minimum angle value of the accumulator in radians. -@param max_theta Maximum angle value of the accumulator in radians. +@param max_theta Upper bound for the angle value of the accumulator in radians. The actual maximum +angle may be slightly less than max_theta, depending on the parameters min_theta and theta_step. @param theta_step Angle resolution of the accumulator in radians. */ CV_EXPORTS_W void HoughLinesPointSet( InputArray point, OutputArray lines, int lines_max, int threshold, diff --git a/modules/imgproc/src/hough.cpp b/modules/imgproc/src/hough.cpp index 5fa24f4789..dda0307152 100644 --- a/modules/imgproc/src/hough.cpp +++ b/modules/imgproc/src/hough.cpp @@ -68,6 +68,18 @@ struct hough_cmp_gt const int* aux; }; +static inline int +computeNumangle( double min_theta, double max_theta, double theta_step ) +{ + int numangle = cvFloor((max_theta - min_theta) / theta_step) + 1; + // If the distance between the first angle and the last angle is + // approximately equal to pi, then the last angle will be removed + // in order to prevent a line to be detected twice. + if ( numangle > 1 && fabs(CV_PI - (numangle-1)*theta_step) < theta_step/2 ) + --numangle; + return numangle; +} + static void createTrigTable( int numangle, double min_theta, double theta_step, float irho, float *tabSin, float *tabCos ) @@ -130,7 +142,7 @@ HoughLinesStandard( InputArray src, OutputArray lines, int type, CV_CheckGE(max_theta, min_theta, "max_theta must be greater than min_theta"); - int numangle = cvRound((max_theta - min_theta) / theta); + int numangle = computeNumangle(min_theta, max_theta, theta); int numrho = cvRound(((max_rho - min_rho) + 1) / rho); #if defined HAVE_IPP && IPP_VERSION_X100 >= 810 && !IPP_DISABLE_HOUGH @@ -475,7 +487,7 @@ HoughLinesProbabilistic( Mat& image, int width = image.cols; int height = image.rows; - int numangle = cvRound(CV_PI / theta); + int numangle = computeNumangle(0.0, CV_PI, theta); int numrho = cvRound(((width + height) * 2 + 1) / rho); #if defined HAVE_IPP && IPP_VERSION_X100 >= 810 && !IPP_DISABLE_HOUGH @@ -792,7 +804,7 @@ static bool ocl_HoughLines(InputArray _src, OutputArray _lines, double rho, doub } UMat src = _src.getUMat(); - int numangle = cvRound((max_theta - min_theta) / theta); + int numangle = computeNumangle(min_theta, max_theta, theta); int numrho = cvRound(((src.cols + src.rows) * 2 + 1) / rho); UMat pointsList; @@ -846,7 +858,7 @@ static bool ocl_HoughLinesP(InputArray _src, OutputArray _lines, double rho, dou } UMat src = _src.getUMat(); - int numangle = cvRound(CV_PI / theta); + int numangle = computeNumangle(0.0, CV_PI, theta); int numrho = cvRound(((src.cols + src.rows) * 2 + 1) / rho); UMat pointsList; @@ -956,7 +968,7 @@ void HoughLinesPointSet( InputArray _point, OutputArray _lines, int lines_max, i int i; float irho = 1 / (float)rho_step; float irho_min = ((float)min_rho * irho); - int numangle = cvRound((max_theta - min_theta) / theta_step); + int numangle = computeNumangle(min_theta, max_theta, theta_step); int numrho = cvRound((max_rho - min_rho + 1) / rho_step); Mat _accum = Mat::zeros( (numangle+2), (numrho+2), CV_32SC1 ); diff --git a/modules/imgproc/test/test_houghlines.cpp b/modules/imgproc/test/test_houghlines.cpp index e90891274a..61b67d9873 100644 --- a/modules/imgproc/test/test_houghlines.cpp +++ b/modules/imgproc/test/test_houghlines.cpp @@ -329,6 +329,17 @@ TEST(HoughLinesPointSet, regression_21029) EXPECT_TRUE(lines.empty()); } +TEST(HoughLines, regression_21983) +{ + Mat img(200, 200, CV_8UC1, Scalar(0)); + line(img, Point(0, 100), Point(100, 100), Scalar(255)); + std::vector lines; + HoughLines(img, lines, 1, CV_PI/180, 90, 0, 0, 0.001, 1.58); + ASSERT_EQ(lines.size(), 1U); + EXPECT_EQ(lines[0][0], 100); + EXPECT_NEAR(lines[0][1], 1.57179642, 1e-4); +} + INSTANTIATE_TEST_CASE_P( ImgProc, StandartHoughLinesTest, testing::Combine(testing::Values( "shared/pic5.png", "../stitching/a1.png" ), testing::Values( 1, 10 ), testing::Values( 0.05, 0.1 ), From 9074b3e98075903e6aac8cd491e66741305e850a Mon Sep 17 00:00:00 2001 From: Yulv-git Date: Sat, 30 Apr 2022 13:37:15 +0800 Subject: [PATCH 13/29] Fix some typos in platforms/, samples/, 3rdparty/. --- platforms/android/android.toolchain.cmake | 4 ++-- samples/cpp/tutorial_code/video/meanshift/camshift.cpp | 2 +- samples/cpp/tutorial_code/video/meanshift/meanshift.cpp | 2 +- samples/java/tutorial_code/video/meanshift/CamshiftDemo.java | 2 +- samples/java/tutorial_code/video/meanshift/MeanshiftDemo.java | 2 +- samples/winrt/ImageManipulations/MainPage.xaml.cpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platforms/android/android.toolchain.cmake b/platforms/android/android.toolchain.cmake index 50b342c7a6..cc9ded5f62 100644 --- a/platforms/android/android.toolchain.cmake +++ b/platforms/android/android.toolchain.cmake @@ -399,7 +399,7 @@ if( NOT ANDROID_NDK ) __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN ) if( NOT ANDROID_STANDALONE_TOOLCHAIN ) - #try to find Android NDK in one of the the default locations + #try to find Android NDK in one of the default locations set( __ndkSearchPaths ) foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} ) foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} ) @@ -413,7 +413,7 @@ if( NOT ANDROID_NDK ) message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" ) message( STATUS " If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" ) else() - #try to find Android standalone toolchain in one of the the default locations + #try to find Android standalone toolchain in one of the default locations __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH ) if( ANDROID_STANDALONE_TOOLCHAIN ) diff --git a/samples/cpp/tutorial_code/video/meanshift/camshift.cpp b/samples/cpp/tutorial_code/video/meanshift/camshift.cpp index 13965e623f..4f5d796072 100644 --- a/samples/cpp/tutorial_code/video/meanshift/camshift.cpp +++ b/samples/cpp/tutorial_code/video/meanshift/camshift.cpp @@ -58,7 +58,7 @@ int main(int argc, char **argv) calcHist(&hsv_roi, 1, channels, mask, roi_hist, 1, histSize, range); normalize(roi_hist, roi_hist, 0, 255, NORM_MINMAX); - // Setup the termination criteria, either 10 iteration or move by atleast 1 pt + // Setup the termination criteria, either 10 iteration or move by at least 1 pt TermCriteria term_crit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); while(true){ diff --git a/samples/cpp/tutorial_code/video/meanshift/meanshift.cpp b/samples/cpp/tutorial_code/video/meanshift/meanshift.cpp index 0e16442c6d..e812cb5db4 100644 --- a/samples/cpp/tutorial_code/video/meanshift/meanshift.cpp +++ b/samples/cpp/tutorial_code/video/meanshift/meanshift.cpp @@ -58,7 +58,7 @@ int main(int argc, char **argv) calcHist(&hsv_roi, 1, channels, mask, roi_hist, 1, histSize, range); normalize(roi_hist, roi_hist, 0, 255, NORM_MINMAX); - // Setup the termination criteria, either 10 iteration or move by atleast 1 pt + // Setup the termination criteria, either 10 iteration or move by at least 1 pt TermCriteria term_crit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); while(true){ diff --git a/samples/java/tutorial_code/video/meanshift/CamshiftDemo.java b/samples/java/tutorial_code/video/meanshift/CamshiftDemo.java index 6717446a7f..701851aaa7 100644 --- a/samples/java/tutorial_code/video/meanshift/CamshiftDemo.java +++ b/samples/java/tutorial_code/video/meanshift/CamshiftDemo.java @@ -35,7 +35,7 @@ class Camshift { Imgproc.calcHist(Arrays.asList(hsv_roi), channels, mask, roi_hist, histSize, range); Core.normalize(roi_hist, roi_hist, 0, 255, Core.NORM_MINMAX); - // Setup the termination criteria, either 10 iteration or move by atleast 1 pt + // Setup the termination criteria, either 10 iteration or move by at least 1 pt TermCriteria term_crit = new TermCriteria(TermCriteria.EPS | TermCriteria.COUNT, 10, 1); while (true) { diff --git a/samples/java/tutorial_code/video/meanshift/MeanshiftDemo.java b/samples/java/tutorial_code/video/meanshift/MeanshiftDemo.java index 5fbdd0efff..f07adb5bcb 100644 --- a/samples/java/tutorial_code/video/meanshift/MeanshiftDemo.java +++ b/samples/java/tutorial_code/video/meanshift/MeanshiftDemo.java @@ -34,7 +34,7 @@ class Meanshift { Imgproc.calcHist(Arrays.asList(hsv_roi), channels, mask, roi_hist, histSize, range); Core.normalize(roi_hist, roi_hist, 0, 255, Core.NORM_MINMAX); - // Setup the termination criteria, either 10 iteration or move by atleast 1 pt + // Setup the termination criteria, either 10 iteration or move by at least 1 pt TermCriteria term_crit = new TermCriteria(TermCriteria.EPS | TermCriteria.COUNT, 10, 1); while (true) { diff --git a/samples/winrt/ImageManipulations/MainPage.xaml.cpp b/samples/winrt/ImageManipulations/MainPage.xaml.cpp index bd897fcc0b..73febc241c 100644 --- a/samples/winrt/ImageManipulations/MainPage.xaml.cpp +++ b/samples/winrt/ImageManipulations/MainPage.xaml.cpp @@ -91,7 +91,7 @@ void MainPage::InvalidateSize() // We have different widths to use depending on the view state if (ApplicationView::Value != ApplicationViewState::Snapped) { - // Make us as big as the the left over space, factoring in the ListBox width, the ListBox margins. + // Make us as big as the left over space, factoring in the ListBox width, the ListBox margins. // and the LayoutRoot's margins InputSection->Width = ((availableWidth) - (layoutRootMarginLeft + layoutRootMarginRight + listBoxMarginLeft + listBoxMarginRight)); From c3b83b8354fb3a34d9dc3731ecd984d5106b5f2f Mon Sep 17 00:00:00 2001 From: Markus Heck Date: Thu, 8 Sep 2022 03:04:19 +0200 Subject: [PATCH 14/29] Tutorial for Generalized Hough Ballard and Guil Transform --- .../generalized_hough_ballard_guil.markdown | 177 ++++++++++++++++++ .../images/generalized_hough_image.jpg | Bin 0 -> 80497 bytes ...eralized_hough_less_perfect_result_img.jpg | Bin 0 -> 36256 bytes .../images/generalized_hough_mini_image.jpg | Bin 0 -> 39664 bytes .../generalized_hough_mini_template.jpg | Bin 0 -> 31486 bytes .../images/generalized_hough_result_img.jpg | Bin 0 -> 21864 bytes .../images/generalized_hough_template.jpg | Bin 0 -> 42838 bytes .../table_of_content_objdetect.markdown | 10 + doc/tutorials/objdetect/traincascade.markdown | 2 + .../generalizedHoughTransform.cpp | 100 ++++++++++ 10 files changed, 289 insertions(+) create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_image.jpg create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg create mode 100644 doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_template.jpg create mode 100644 samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown new file mode 100644 index 0000000000..6507e0f4a1 --- /dev/null +++ b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown @@ -0,0 +1,177 @@ +Object detection with Generalized Ballard and Guil Hough Transform {#tutorial_generalized_hough_ballard_guil} +================================================================== + +@tableofcontents + +@prev_tutorial{tutorial_traincascade} + +Goal +---- + +In this tutorial you will lern how to: + +- Use @ref cv::GeneralizedHoughBallard and @ref cv::GeneralizedHoughGuil to detect an object + +Example +------- + +### What does this program do? + +1. Load the image and template + +![image](images/generalized_hough_mini_image.jpg) +![template](images/generalized_hough_mini_template.jpg) + +2. Instantiate @ref cv::GeneralizedHoughBallard with the help of `createGeneralizedHoughBallard()` +3. Instantiate @ref cv::GeneralizedHoughGuil with the help of `createGeneralizedHoughGuil()` +4. Set the required parameters for both GeneralizedHough variants +5. Detect and show found results + +Note: + +- Both variants can't be instantiated directly. Using the create methods is required. +- Guil Hough is very slow. Calculating the results for the "mini" files used in this tutorial + takes only a few seconds. With image and template in a higher resolution, as shown below, + my notebook requires about 5 minutes to calculate a result. + +![image](images/generalized_hough_image.jpg) +![template](images/generalized_hough_template.jpg) + +### Code + +The complete code for this tutorial is shown below. +@include generalizedHoughTransform.cpp + +Explanation +----------- + +### Load image, template and setup variables + +```c++ +// load source images +Mat image = imread("images/generalized_hough_mini_image.jpg"); +Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); + +// create grayscale image and template +Mat templ = Mat(imgTemplate.rows, imgTemplate.cols, CV_8UC1); +Mat grayImage; +cvtColor(imgTemplate, templ, COLOR_RGB2GRAY); +cvtColor(image, grayImage, COLOR_RGB2GRAY); + +// create variable for location, scale and rotation of detected templates +vector positionBallard, positionGuil; + +// template width and height +int w = templ.cols; +int h = templ.rows; +``` + +The position vectors will contain the matches the detectors will find. +Every entry contains four floating point values: +position vector + +- *[0]*: x coordinate of center point +- *[1]*: y coordinate of center point +- *[2]*: scale of detected object compared to template +- *[3]*: rotation of detected object in degree in relation to template + +An example could look as follows: `[200, 100, 0.9, 120]` + +### Setup parameters + +```c++ +// create ballard and set options +Ptr ballard = createGeneralizedHoughBallard(); +ballard->setMinDist(10); +ballard->setLevels(360); +ballard->setDp(2); +ballard->setMaxBufferSize(1000); +ballard->setVotesThreshold(40); + +ballard->setCannyLowThresh(30); +ballard->setCannyHighThresh(110); +ballard->setTemplate(templ); + + +// create guil and set options +Ptr guil = createGeneralizedHoughGuil(); +guil->setMinDist(10); +guil->setLevels(360); +guil->setDp(3); +guil->setMaxBufferSize(1000); + +guil->setMinAngle(0); +guil->setMaxAngle(360); +guil->setAngleStep(1); +guil->setAngleThresh(1500); + +guil->setMinScale(0.5); +guil->setMaxScale(2.0); +guil->setScaleStep(0.05); +guil->setScaleThresh(50); + +guil->setPosThresh(10); + +guil->setCannyLowThresh(30); +guil->setCannyHighThresh(110); + +guil->setTemplate(templ); +``` + +Finding the optimal values can end up in trial and error and depends on many factors, such as the image resolution. + +### Run detection + +```c++ +// execute ballard detection + ballard->detect(grayImage, positionBallard); +// execute guil detection + guil->detect(grayImage, positionGuil); +``` + +As mentioned above, this step will take some time, especially with larger images and when using Guil. + +### Draw results and show image + +```c++ +// draw ballard +for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { +RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), +Size2f(w * (*iter)[2], h * (*iter)[2]), +(*iter)[3]); +Point2f vertices[4]; +rRect.points(vertices); +for (int i = 0; i < 4; i++) +line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6); +} + +// draw guil +for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) { +RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), +Size2f(w * (*iter)[2], h * (*iter)[2]), +(*iter)[3]); +Point2f vertices[4]; +rRect.points(vertices); +for (int i = 0; i < 4; i++) +line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2); +} + +imshow("result_img", image); +waitKey(); +return EXIT_SUCCESS; +``` + +Result +------ + +![result image](images/generalized_hough_result_img.jpg) + +The blue rectangle shows the result of @ref cv::GeneralizedHoughBallard and the green rectangles the results of @ref +cv::GeneralizedHoughGuil. + +Getting perfect results like in this example is unlikely if the parameters are not perfectly adapted to the sample. +An example with less perfect parameters is shown below. +For the Ballard variant, only the center of the result is marked as a black dot on this image. The rectangle would be +the same as on the previous image. + +![less perfect result](images/generalized_hough_less_perfect_result_img.jpg) diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_image.jpg b/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..06f53823b2bbde793308cc03fd8dc406225b3061 GIT binary patch literal 80497 zcmZs?1B_)&*S~$*wr$(C&FN{|w(Xv_ZQIkfZQHgn)BnET=YI1(`SMj#Sy!#BTJ@`{ zvy;l+b-q@=b^(ae;!@%OpzlHpL<<0X?OF7Sxm%b508&!a07w7;00Te(0{$OL_--M7 zGyJ#B_^!x6AON6m3;tcPfx!NU%f1=sU#|OR%70^kznST~FWk3n{jSX4jQVYdzbgvx zfAaj3%OVW)fAXwlFLga6q|1vW)0Dw{Oe;R-aA^vAx|Lh4+(SP;*m%rTrkpE)PqJQ_|dt9)8{kY#T z;Qti^`Ckn6Ukv?U4ErztGwwfy$^`%r6h;7yezWm+{qJ7_GdCM6HxtMIuaAb2iJOrT z0Qmpf_wU62$mvk)9-aI`rd?ptfZ*2BJhndn~knLKJEE| z?9asrq@@Z{J1}Ldrr90|q4y)4pR^l23_S@(Ake}F-Kq4X?xXU06&SA{i>^%xW< zBCk&!)v0B5KHh&T$+s>B_X^b3F2eL{!P*5ziGzFMBxyI9Q-3HiSR%0ANG-H&!)4Z6 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

b7{Ol**)xz3)Q@v0fIRkr5qfvy5UJ2 zDz7SW6l4*IWO-xXQlBWWb2j3CZDq!f(E9L8*ZNFzBFtcnI}F@c>nvDB>}aB-vdd9V zGUOpV^bN!A+xnThIF;z(FztQ+!!uC8+SJ{u98JPc9uP>fM{eDkH*kljj=WTZ3FT5W z*3qB;B?X68_^o3M?*V!4v&#!j?ob2lUvr6Ln7}|bdw71= zFY*Kjiivj{SJ;8i0LyDWsbP)SI{_-%6MZr(&QvX!xRNmiddpG?}aP!%;1o_I$zubu16Q#R4bQd^qcFExcIm)XQs;&zjM$ zChWe>j2>xMqI!dgJ){|m%cE({)pzQDf(tSf8D45GXAC`xb`d$%$W$W_AX#_U_;8FNt+z;+KZWBS zm8c8yGIuN~%bchAb(d~KDvEPtO3_|PAmI=bRD)>wCJX135gkcmDdrpYV)n;MCtTw< zzpK`UGZ=pr{CNf#KBKV~wi?F>*d!TUg6-_{K8kvIH*EDcN49AxtgRlL*Q)J`VMdc^ z`0vyU@OG4O4>?pOrsMqzfX($5J4QuN<^9B1sN|;Q2|5ZCG`|_9d125?QT()mXfLWYKR&5{P9f1ZqO)p%J4_Zj?_9Q zr*LWjYPGkEy8}m-C+I^5F&Yhl;B{XyrzHvtWJgX>{FhTxGZCMk*0iWIfmvXdEi$jFLa4C6= zPouHjrh~B{Ss#^8LIhgB7TJsJSG*rtMJ}42=w7$85JyCFg+|q`iI>usMt{-9D@a&* z29y%FVW?xKEVX2>rC_C@L&agHylK&eNK(Kz@v70g{Kt&GY}AkA92d3zHJQnD8Voav zy`!#`Cwh`s_?zG3(xT%sfhV(7tt=iTRg;+JOS36= zhqgysHl@pg4Y@{zwmhMx4sc{sDn=~WsG1)U`Tin@;_ss++{(hlg2Tr^9cHpYDts=-_6(B>cdm~A$ zy+72j>y324A1X|1{9FmfViJ*|CvC9Y!? z1!RiPae)`IuXEyA+HRb1_p&h`g8e?jU42JYt{u-U6y9@{De!Dbtq}(^X5Izt6qLpm zj9v08-sH8t;&hc>HIy9PiDK=&63@s{b<|###yPOBz*!HO0*~)7if?9gE(tto_?xmv zQ}ViU%imW%a2e{&aum>O=5g|^(GH#a*T{VpE?D&FY>i3C9%^Dyyuj7$AU+nWEuSOE z1eejBz8+ofOb$*%JvbwgXy;5qR3lAX1$KTnl&Vvn(|oWD-rIJ@`h%*=SVLb=+*8qJ zY4Z!ibSijSX?h;+V&jIP@i91Gr=39r5xLQbSs1#XBB{dr)H1ICey{7RJ;gGMKcuqI zqGjs@Q54m=$sB1qWBS~!uwUo@X5nLncshL*znXZ^{T*|p3B`Wutxw2vmCR}4~cvJH=!vr0k=<&H$_ zv)=cwtK7wwUTcAx%wu{Kjue0|LMb8|`$uh)@I`_e( zYE+lQxwt2!pYvAlSLISmw&RPWZicArgPg=%zPv#?Gxcw@rC6GV@#TsHN4}i$qH@fo zm|q@i^Sgfk*sI?Vd^-6ZEL=7INrE<&R?OjxQJOKX{W8mdKkgG+%H4vz@+ag+nVtyS zHdSKYiM@EcP(6!wcF2h4wW5wAqu-pMRp5h*E?E>nf>ePck|J7Dch{L~AR$^tCc17!VnGcHqzHXpK{Yl`3+pmR zmP|Y3Xi}5*vnGTWGy79Ss3aGLoAD&tz0}ouvKkbT)jNB3e3O!Th{-a{=em5Slf77!QewG zST2awYY#6NZ4RUPeZ5})rQgG7d@Fkk80-sI2cy|MUH`>bH!v&Uy7nX<4+Qk)CKD@!dXzRc9o4>S+vp4M6{t16! zWpo=?U2RxQ2m6r$@_-_s3TOaSfFVF|m@{ha*Ov(}_ z0xMl8UQ>dKR@3W zKR-W~z!2*V0O)o7kGxwE00>^g_{sm_(G>y!Rs;aF4g7~^nFRpt?*M>k^|ghE#XtM` z3vR>P+5*5uB>-R;!dBy&fvp{7{4cw~(*C9crON=I1GAM13_8z-E&at{2P@m;f1x)F zbpMat{#y@JuBYBQKO`MpsvPc zsEVONL8JytVQWUtgb~KTV}n95n-n0)5hwsjx&i=#LjmA~uFOHHM7m7Q_!gF?AZ}R{ zKngpA8X$+`CXvDp$Bve(P}E39&;ZdZg#$1-Y;53Q2HPHoI1b+t9|-5erUM{M3NR5w zB`R!cDk)LHBiG9;k4&ouy2Wf#2%wbyL0SeTCxtd$hC-JriwZx{rnQF+0#O0D*l+-o z1`$mx&b!eChQ@Yww+39j9IuhO-1w>NiJ_)HH*X?~(mm4cdoi#<8fk?JVIV0cRD8m( zQbk}eJU~SyiA|yu0my<3)7ZK8p9+kQ0`fL$K1{`TcJM;q=llQk9TzEd$-)eYqpnH~ zQHY2GW13PiNDZ1}17Knh0D*)6RI*f^yhx}RSX~@Dgl_P8J=cV zOO}(%p8Mo~9H+KMH@{7rY|tiG_=(rDoAeW6Vl4O!r5Gr^aDW+m7FKp_PF1NAIJKBkv z4b7G05@ta$+t)5#kNV_-TW)EcrwJ`)zzc&s-)d+O#+mqMbqQ(Bst5#TYQS)~%m(}s z4B$X;6kvx3tB*hgRavz*b8hL-!}{#BsXzu_>p`OD`oYn|V<#nJrGCEq<{70`wS#-Q zs7*ug%foInmv=#85?OPlyi&N>5#WsgLP8d`jGqS-eZWauzt z;mL@bSee)qrnF0IK8NO4;e<#=jXu&TH7#Cn4DCa=wrLkh!|;nw||{K}*iIj{mG0)c)b04SmYX%!h} z5{Ag2pr9dThHQg0BY~n(+mHSy>cegPcX#hf}foQ_ulBIB@qyShE+p)~>OxgN;NeNDVH@kcNw|;*{%OI~x z6K#oxd|Yjt!(BCJhXv*f#-`F%_fOvhHRs3!3ks0XyaF*Q0EZ-m3K4-0hYGh`QUMnT zOQu0(*HzU{aQbsS=efmqa&atTRgj@9KiBVIY>%d7n>{Qh*XOwg)6K1Lws72bg;N0+ zomI#rfT>qkHySl81s)zk_mU)p8Vq1dfgrNn^9eg1o1Y8SEcm|kh-dlF(X4x8XOYgA z^ZGap8#!?m)XpEA_!fkZ9;NFfQ&R&|uP8!5232e%Ab1%7@Gwd*hSdQ$5I!O+>sXx= zB{`SS)smGF8n4;3xW3ATyKZKpT|V;^L9DsM$m$ohn3F{V_?oN{D~T9e%v0l8=j`-?ob$ZiaKih*t&-&N`^Tuy4Pv}v zcO!IUv#jCwJ|F<+6b#*|9CuTraq3@-ttW^^=IC@KHN{+rL|l@ zdCrSjnWL&TP;!TBA~a9|DjI-ImJIUG^$n}}nuyqqB#kT;A1~`1940G_^s2Q9tNmR+ z?K}nr3U814$+?&%Hu3npGXTMcPmYGfGJR-PK$In> z21Pp1R~YfwiEUq;9DM8Wq&Qy9Ix~|zP!#Cf{OdXX1NR6CnzCU4Hp3by8^s@ z+DmLxbTEk&pb?7=yJO-*04-HEDlij$q(@DK3u{uo{%{3_u>ZT#>AIWWquJXXS5qS5 z4{xn{C<>`fQ)3i4$i=B>0L!}T44{P(axCxL<;tj{m441{N=800@ z10;QIdLOrZcjm5!4w6i_Fh|+o5F;J94Ge20-kgyZ%IwT*=KFJe9*$ejZ#uj?v6!bw zIlhEe2-|tiW`b7Fk2DYzA$1{C*i=+tNHTgc;e+EBpS6%+Xj@AQ1p9}S|49@zi&Y^Yb z@y>!*pjk^<%V;zVnXnK5JXp#dDKzh~74DN)L#LasR}DYrofDV1xMfdUKFVzDwQOw%Jy#w-?|=V%V^$aM z3?wjtMyd5W+%LOajm=Emxf(gH{qK5SWz+YYww<2_6_5v~&Ga`6C-xc4ggQoqcM$-$74;6suj&AW@i-7 zz&o|L$>V5X0Xv&1&ZKoODSrpHI!eF^&zrPEzjNV>5w)I*x8a0$Rb^}E-*l*(T{3g# z-SCf{L_8)YN3$d{uRD&4w}iXNK3H@;-kEq^9@ucLHX5S4a@D7ih%t{lB?JoO_Hb-X z@8^3KAH|RQpl{VyEqMAS+&)cHsxFf^zFUGI6(J%iQR{i@v>X^bbZSq-{6bc3sC~M^ zd=S{dtaJWziWEN;uy;8>(rM}+SDoS6b#>P{EuWSD`~KnbT`joBuh@I_NKpe(vF_#6 zFpo(7oX?)M@1|?P!EjIhg#WwB%y(@<1rN|C@&HVuMW~;n%a$dS;=BVY&VJDUvzebw z0|IDLb1T*~yEoSv){z})v$Ss}5_bzVYbv(vlreB%C2neZSFyB{HE9{wZ6D~=+w$o! z8vx3L150dnZ@J1B8pM!C*PXk5UHZ6*Y!z~yT;A(X-?;j@MP9k@KAQNFUH{Zfx(@Pn z+rHk)Cx`=>WC;mz9jh9JhmFdkRC6&m8fppYc<$`+{ob09uXzT3dZDDn%f?wQwe-@e z-T?_y*FKBy48wAyvsYk4*zRg?{AlU!UUQyE{EV^mPq!Fj+U(FT|K*;+xz{JBn$^%A zk-FPNWU~4R=dd2ee+(V&y*clUZW&FTL;leQT4nmoq)wM9ropPR8;N zT7In05>LR)cs6`&Xs8H=U~5XI0;n}wV@=~yxWsR+lk&|kj`S(II8+WB+_Mbg2&-9@ zS;_62i8=LY1uXJ)U6D4P_S+lSGw=9vgg$y!`YkvSbx!$I=;kBceYXlIY<%+?dOq}tAg#`JHaW@g=qL!w_43e9Ol10S#Y%<19oGK^@Hvwe zi`dBM7~Zip1lIDynrPv{$sr@_h7iPP970qOqUEHD6VfZ3TX*86p0cGiT*G(ElQDJL zUFjX%-rNly-olt-0V>@hhNoSR-wden&6BlY<9`T-jQIkXR-)ki(rKzXGqOS_1+f^` zmV;1C+32(r!(XU<;rjKXtaEVI**Lb-qtu|blE0&6r0G$$K%nc#eD{)=^yIpLycTCK ztQ!jgsKD3}mLMcwv00Wut+JM}OgIQLzzk-hB2d-QOwb*#sF)_bxtO_npEDV-pF6O` zsODlte_c2oxJe$!a`g;|-vk;7%7IIgSJPpM$u0qR(GX@HDUUx=yTyE2W3uZVLMlJGbX0C_8+I4Qv!( zy??4QYJdw7C3o7f1YeUH!sGyELXm<4Mc^7;+Go8G9vV7I;BOv*3OU?+_Aas3{XB6` z@a_t5+gmvk${8}dOp&qp3PG2G^)Djez>rue>=n;BUJwvMK!d0o0tcc-97SZ!X<*8t z6doLlsnNwDMsP^6HEYhO&Z@I^eAQvzA3_J~XM;f0@XWA5F-qR zwNUApKB~0Z&Ma!0P!+Q+w6ZUJHtf;5&*gRh3P}!ygO`Nogmsgsz-9bI3&pA6SsO6W ztHIPJrBsH9C@GmC^^!9+6pX!c%fHx}S)LouWeyLC#l;S#25=N0fH@Eq#!=OzH|a}whNf7h=+3jOy7=Y+9j&8kjJ+qKxZ1DDkduPgpK|= zVcj!C5Dd8h!M?EBS+MZWL^5n@Nn9>ODm;7|PAMdA2mv824;{TUFANj_!@;HoBEnzI zEPn|`s;78=_3icvJ^ude;;g5CCie_M%Vz>3!0FuTAwLLnNYd!7?fQ)pelt|R^ynK> zWSIx^gSIn{(}QB$V+-HuXW|t4;~_)ZOR|h>3d4D5Kq+l`65^Xah@V5^Dg!%h_ARj zN$ag_wFf8pw{`Qqp==m(*{UdflkHl3>qzbbiYOm4LVgH~Y<9cDK&xd~t&!)EEZbu~ z3`MZ=w;EqXd% zI7*C>q63%j36$_knj%&FM+cX|kJ91x8!gxa^sGm3CyTMdh_#@EH#*iD_tln}*({** z_jkn-8YW+~IMptA>!NeKnX3(%YuYejw`p9S`h?q4&cMx~p<%tlB>1k8mE%NuMa=dK z?nxtT+%cVOZ;WLf-fI_;SH#TLLYRj1VFt=YON7nOfTm>O%Rsk)>ydA5bPCH2wosB5 z+j*N{qYECFg=gSLqThaU8E*?Yg0+oQB#1i-ydb2ILY0o>6@(HDL+&znRw+hS`~K&R$!>)Be!Xly-NiS}goo|hTh2l-#dXGjzsX78AHH3>RoYcTB7*p z=6I%UVeQwrvj22GKD8_JFx&l@OSzzJ4eFG|J8|K#Xb0v?0_t+R3aKoaOajTGdBtVmyp{Ca=mrmFDt@1@^ zRd~zR^<#a{c!=4sXNxTeOeR?dQTO(;_ioS8R_8XXv)Zq4F4l2X-B{X6TDnI8Nm_$Uek69x z)8;}ar5tO1zo5QSEwk~IOQwV#BQbU^sDjsDRIU@`-#e1`gr1Oq{)+a+Os=!*48Qr< z5Q`C`fp;tC9R*7^OB8OM=0dKkwrmCX`Ser3mV@$+3XTj>btNd$4e^) zKN1T3enkU*(t9@&n#dJmiT3+FH#T}%S0sMKh*I?2j$>ub;oMQ@xS3Khy}|)+JbLz) z^auBom7m^6A8XaDhiy>=wyNk>h}r2jdNB=(W^89BTbma1$A2*PR2|MreVh$gw!!x952 z4~tymVo~Mn1t*tP7!g(Q%IS(I(aeCcv`wyulJ;ebcyX0SM>_4uo$SJ=`9j<-#}_(| zwLbgk18Xudcy6RRj*7&W4pYuf6xko+!AJyl*h;RQ=`-Jr{BbDpDqi&)j5``;d~OfQ z3;LFS8|OI3`ifuFslcdS{;5)b)J&~v?o>IEE*-l}l_R;V#6`I@L@G1>n0e!AX$97n z^8P4Zs9K1X&6+%#8NA}P#`-cSO?Sf4damP8<5uO76OmmbPnpD(YaZ=GC4<1Zr)|$u z=N49LqLouieXV+-RF>aR=CF4cU?y+yBYWv3oVZ6S%R{x0lGAA8&t3F^SX+z>C5Ks+ zGyE<&A{Vs0)sJ7ZCS~z%ccPF?8ch^!R6f5p-K?^PJ?(PAKJH;)y7bs4lxRe5gQVO)l&HKCe zTi^LVCu^Pc?3sD?%-)maekJ1Yr|S!u!@+kw!h_fn>%y)yLLA!JgfyIKU~B-@@8*nO z?jOfidp=dR?9&^+0481=Yl*2lL>Xq?W4cr3HF4Aiw0hN?Ak`1mk4~0!(JNWi#!$Ki z%MI|l7!(d(>esdWOS5r=zZO}UjT>2%9BG}0y4@_VN5EWV=v3` zdV6LTTNRa*IBmjk$aS5^Q)|d%ExCFV>xEm;d&1|hzs_l8(-e(ht_hyCRWpnz6A~6knfOef zwXSt#vDGaz4g>SQ3F-?B*dtbHhSW*84g5;{BBd^4A*-)*8#1-Y+_3FvY3-4Bm-sUX z*VidS5YI=8(?v$z?#U+fo6poYUv`gllZV8Wn-b>bp(oFw6*Y;JPlfWLQ&N~?gh7gt zq=$40Ifp-R-Ftq-13jID`yu8vVTVgfnRmDjIz2 z2QB$MwJ%a^q^vo7n{6XYkPAc6$zVi*nJI0%kdk}`|4MZtEYT!HRVTh4HgnV=d` zV=nDsgssEHI?eM7-`jj~clcA(isR$As-}c{iTYl-loEwYPq*#OibY~js2lT?CVN8c zzF0CNclEFdb96Pm|C{^cJWMsFPP^Qd4zQ5$`dmBNTK!j8IVG15h?;6(*L{;p09|fE z{x6loNHOCm8bqIYMSWj&Ns3rm&#H;&Bejs52+_K_JOMkJ>-%GsTd!OATGg4Cis+!3 z$JHsNl@d-^ssI54bO?kR`U+Jp44G=Iz5c!2M5QeHPx0HG#-EK%WCG|$VWV>UVt5Sc zV&RO)ygJByGGF_?8c6yHr!~A9Po&uH+}T}NSS>~T92H2wKo~4VduZvr`FrIL@zV?7 z4SfwR`JL=PAz95Az;Bt^;GTu2kT=hNRvVf$9b+#31-}5gL(J+1zuLS2Qogr7S3Rjr zy7qp%_#0e~xGu6H+R6w)725ywN&j6I|GO>{5+Kx6C=6gZh&)1d1l9T9B@xkYmPL92 zWH_so>(r19^jl3<&aqHwvS#>j#d6}ns4b&uk!QEKzuT38{>S+t{Zxc@_gCt2vr zRGsh_o9M$nHZGC=_Fpa8vUSrS{4Xwniiz{Z&yW=X{9{88-N)F-L4F^Z4<3X*Q{%BW zH`#Q|)g8PQNnSyp4BnTW96!I)G3TwqI2~}<`*-RqCL8QbFB4-J=6$2HEGu5>8yvT@rcIn|J;km3^LEiceTU=Qh@Q|G>%fen{zkU|pGT78 zpuDwCOYJ-h9<#;Z+cxi4AE~hH+KhtrxV6NUvgu_mtRHb1M|a=+Vg%ZjnUH`3zJU$r9BF4%Lre=kPXduq26_Ahr*OP|1)Cjz4W1@uhhFTCFRs)_TgXAT z+36Y2*s(@ihB^%fJ~ELIj5&s6{y^!k$5jn2d&s4!GU>M&Sl?*>wTx1o*W~yF&X~Jz z_PyzQZFo*_)}g-(KM$F@NOC3U*;9x~_VnyJ_61O)F#bsRice?nXKvqFg)eRE=fW1A zY{sb-gwnz^;OA&o$p&=+;>jG(`5>-r%{pD-dj$LAh zEm?59;kvce;ZZbW*E$gu&+hLb9p60w1cX*(T_rQhd$ zP8thhixppVg)#?L9(!K^`7ZzjI5_?fnire@lCe{ZMAIg%npp%|E?o`=I`AufGMbruPTC#Su zJS{ve%A`fgP$4@fqJz~&)eUm{ktGeCM8g=>uO_NmW@nRx&}rcNRYfQNrXESP53s)-Qck^BYhH)i)-EAtK5W53qV2@y zEk_a{p~uCI!gReSn{(qNEFA~d`!`QNTDV&X(pZ9fdU+Dws2LBg_s}%8w_g8Yk|H`; zT~sE~F-k61vaRsU6o@U!*jyN6js3i8ZoRg_qA}<}DKyz@)MLFv{4BFwub^kP2b1tk z_{&1|r#-r*N@7OIoVnqHA41`1JY!*PoqBLlOi@Ib^JX4L$^7>#kMEA()6D%07&(di zq(@JCO|UFBggZaC&aIbCD`)$Xy>XD+U&~6e(F!qgj_u>y2wc4?kDlS~yTwvF%#=#O z#mx6=F9u#Jr8i}7Op#bbPfjPa>iqg7#P(&f_icGNj`MiUW2G|WF)hp5^XK17NBhD} zhZV#pV0wK}F>RxulzXIH`%512F&>i~v_j0%4!!iRDIIiHKUbQ}mfP8V&h5ioB0F6+ z2{2~g79i>y&5_|G;XYLiTlkC{nOd5AKq3^!vUQ}8ZnxLNtYXHVaAuew%Ez-<#l_q= zTOQE>b8Z#n{r8nyIbM@KU5Pc%i8wvr%t8O2szsjFEpAmjK`11OydRS)qf8=3azA7g zA)Pa|HhnmS5&rz(&$Itn;GpB49OIzLD7%@&b2nafL-~>GEAj5aSE7^MCe$M~PO*Cz z5`;lZ+rp8gkUqDwB7sGRu$YkeX!irp;tH87;<&2nEGL&&pGhF9K-EK8v36ooe*D&! z&!Y`Iv12gCGGq10;b`p$1km^3!<>gFSB!ZxH!C+XYnDtLTk& z9rS1RITq%iGR3`K)lpQkP|J7eh}2QG*NSZN(&V#TB>%!%690zCHS>qfyYtL^P<1hP z-?=!R#t+!spo6lNCd?W13sm=1WO4q34z~Qw@cB#p80iau9sy;=|602LscX?u5$q@u z8Y0aB5c*n1egYyLR0eq~1e86)7Wcq!{?pfj1mzS+ti95&(3r!^guJg6Z6YFv{~uF| zE{puFv-#+p6UJ=wu9>O*Y*-6fA_yElbpUNm53)+ zmj>J+b(`LGBhNo1PiCuKKh8OA$;~#zJ@1*ev$4y26M8KqIV3<SgOt zLD}o5f@kNpiFfK3vL3a_Z?L>aOqttSp-dlU&B#_4i7+srzs;D*H3Ek-s=IBfT5q1D zn-|SLWKrky=@+D+e?C2uU4BMMH8OFR$TXuVZaQ~9b6wc-W#~pCw|9}@QT|7wajZM} z!Mu7N`YCaat0HD?qbtRG5x7wMji)Fxsije9{9n%a*6H{xxqbf`!zp2_L6jm;) zhPT5d`;|6|Bq&>*tx))T5pM|+<>{>y*>1e7t<5ye!JTO^WDzdoEz$4y;1hy?ls^q; zN$AKNnUsp}*>xCJ)63SDP_9rlK*l!Sj}>{|A%?d>T<@5^CV#m5vpTY3LFcb~+SpjB zUf*1i-J5NmkmJX1R<5V&`~oQJTi~+ir_D-Z1ez#C$&<-qvJJm;>zvU~8UNN zdsLT!^Y9JOZvs)o%@M*`rrf`9{ z-8gG1e>92PD?UoV|Mj^wZ9=kI-M z*W3D(-DOXXZslejl)F(=9(k2{Cv4m(FCw`99{IZl$+~t@QAIE+PeD;!$qRssS)R>Y zHy>A&I?be9b%E6|zID;D%W7n|%Vy~P<&L*RKtl1W z#}z_P_rNh5M6<*sTJ2S&F!Ko|bqOq8>^PKBJfj>?@dBs_Jnj+mj8Wpg`qmj8AMdZ@ zn{V=sxcETTTk|Y$Z}h%4tE}hX+B_FJygpAWdcn=zw=#eodu>>W9wIzKOIDX7Ty|@a zzIIwauukyBNCu>1hw-FBQFEqB_oK62Gk$SJmU-dMewuj`su_oQHR>SA?gD2UP!1tD z7AZ3918kj`2V*uI__AWwH)NVMZso@YYUO2|E7t`{k+8)oU94z8>+P6-4F)_dSv~iahXfiUJ?DPlW&X zx5j%v`gN3;Tz~qo_hD;fYxdg5bdJzi<27IF+XhALY?1s4>cP>{633qlW@cLa3DxqZ zXQM@Qx<>7a4@FzqjJ%pB^x8V$)BIn ziCG`#eOS{9hKM+YbWwn120w%`;%7byYbF4n1wTlQ=VBVDNq^*j%1eG#>8+PK(k_eE zluTEUqYT|z!zJgL7pRLOCv~dZbF!Mi{jipE%KYcp2!=Q*8?T;<(WsdUWv%2Q#CVtV zKpjTr?;n%9gg-tQ9~d!U*Id>hF;I1)uC?jdylV^_cJr-Bo+oeB55%iAkRmz1eA>s~~ySejpAb9P2690-WCfB0p&f5Afv(xS} z-6pRFEN}CzS!hQ1?2=5AUdk4+U#x!qyzHoBlaPd}9n)w$Cth=xKB>9-^g1MP4eh(| z6cvwtA8GTNx8{tM!oUyZt%{~A>`>Dj;o4uuO~QdvS^dq*6&l=gohxXIJ(0mC1CuQy zH4>c)5xMWHrTfEUrTnK}AJ*5r>Hak#*HzZ1clc2Xz-20Rz2IeNXpj>v(j+|Ji%XJq z+>k=U+wfPazt{<$e5+@jGDq9;)7uRD0^S(TXS*nz*7oazi}H%Mxv-O=fhj3+q&y^HQ=(m?LUPsX)PR}CTZmDhni@IVC~84P{lC561mvy>wV?$y|@jY-?E4Hd#- z2MFWp^p97%Cn=TW6LV@@O&abxsz16L$%n0bIIYgA`&#xrYcn@{t^6h?uz93Er9oR- z7HTAtfi2q+A;QK#W*G^ifJqmfpDONt*Dvk|SErCRdG!p=nL+9{ob}ggX~4(boON7f z-JCqorYWcBE}b{E>(5*h;g9U@{wp-iZ?{?ZgVR+sA`aT-&w3X8-i7>a_{TT84%2=C zbleHfy5@3h}Zh~+&4UOJBUbQZ5%#mGjfoZK?0G5^H3Lh+ z=Y#CM<0P`oJA*ISd(;TAY3pSEmV%oU>ZuEET=0tmKWyHl%yH{h76aGtI zg;|$@^l!%5C(h-6l*x7NW+a|pQr1oGojyh^mK0i&=~=F*_(kVh+ipuzyyu%bd0OSsgHH+s zD~n@X2*2^H682_kdf!3st8NMYtLc~ZXjn-;Jb}61U{Ke;6Z*au@oVe0P?+)@ zu~a~mu;AuyosG}%2k{J3Nr^_Hkz^7X7Uw3GXH8=l1Ot158MFdjvB0WcG-~~a?ZoLF@(P!96@*34X zD)@ZhnimkHBQWhlHV&C;gw#^K7E zH-hM11D7khnm&vh`FJ6>{o{glldeW#=Is-H%$_6ToxBr}J(_V$>qE?R4pn4d%svLs zD%jlOyC-HNqF@6V!wP4;-jGn7#?lr+*;0gWQywF0YJ6;82mw=hvW$ zZR*2HI-rrrySYcT-O3Yk8Wue6==9u&rqMVVi$|_K-+-H~#Bm9Y_^lT7_L2=(Bdfv% z3R~Q;&l=B8*Gx2vbo=`d9awhWZ#=8`aeE%8walX}So_@c@eAN1cxHepiaO>s?hD}7 z$;7^7RK{W}@f}|0`Hf)@zl~^(IH0Pvul?IW5*8Q~r|e)^ka8p@AJTJW@U?CBD2C*S zsSr{S%v94(Hhgvu{o}W_M42_FvD7a^HZOkdsrkM5MBx3EQi4|e@2v}}n?LRL!OAF) zIHLCM_H&;R0ff`_+`&`EKcv26(GG*7$m^tOp7R4pxZA9)l`ys0iSAX?W`xD^6i{L= z$4>4mwOSfT>ATfuYfF)`pflbH@mQkh%PX#%VuBCZacKo!oA+#ZPHojDDke&iOXjl^q$`X2h3$FH7r4m`MqfNJCb!9r_9TJ$Hkh%!V{u>4=KfhW&alRsRFG{ zCZ*&%dsmSzlqVIN!-7w47D)ij`J^w=g|Ie2LV_9zK3P7;uoYsaRoQe0SG@Fi%wx

H*ZXf@ipu)RJNS)~t}nZxUH-j!8JV(M@am|Yw0 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg b/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f6bf315a807ba6aa636ac9984f4a8719159b225 GIT binary patch literal 36256 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.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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg b/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcc8b9e4140c8eb40a053bdc97d2a13c186d5b81 GIT binary patch literal 39664 zcmZs?1B_)&*S~$*wr$(C&FN{|w(Xv_ZQIkfZQHgn)BnET=YI1(`SMj#Sy!#BTJ@`{ zvy;l+b-q@=b^(ae;!@%OpzlHpL<<0X?U{j#xm%b508&!a07w7;00Te(0{$OL_--M7 zGyJ#B_^!x6AON6m3;tcPfx!NU%f1=sU#|OR%70^kznST~FWk3n{jSX4jQVYdzbgvx zfAaj3%OVW)fAXw_ZZ-~XMos`FAS3WUYJ0zBW&g{g-%K3- zA0_{&rTCYV!M+=D5CG6`!^q6S1QPcj<+I;Gp#SpWHzR&C#COc=HzWPa0Fduh`j;WU z87Tfgd4T?zaRT)J=tlhZ11J1P59T+6{Oc$DX3&3`@|(f_jbZ#|@PC=}n;{bZPcziN zjQFhs`rjDA?-=g{2!OsK03i9zaS8v?S@ylE@&9t&Hz)kdt=|mD`**%fjEq2e|F=89 zdH>lFLga6q|1vW)0Dw{Oe;R-aA^vAx|Lh4+(SP;*m%rTrkpE)PqJQ_|dt9)8{kY#T z;Qti^`Ckn6Ukv?U4ErztGwwfy$^`%r6h;7yezWm+{qJ7_GdCM6HxtMIuaAb2iJOrT z0Qmpf_wU62$mvk)9-aI`rd?ptfZ*2BJhndn~knLKJEE| z?9asrq@@Z{J1}Ldrr90|q4y)4pR^l23_S@(Ake}F-Kq4X?xXU06&SA{i>^%xW< zBCk&!)v0B5KHh&T$+s>B_X^b3F2eL{!P*5ziGzFMBxyI9Q-3HiSR%0ANG-H&!)4Z6 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%0ANG-H&!)4Z6 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg b/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..782f730fbc5d6419cf9cd9a897319d5f21ef7788 GIT binary patch literal 21864 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%0AAmG%Ub%wY5p-+A+A3= z?D3@K3}<)c8a?eLYe-3Nx6&xbDbLerbkf$}N-r%#8_w}p(WKWT3!JIT3C#Rt?>#f^ zuCpsazK%*-Qe@0DN~YjT zcWLbZx_>5nf9e97JyzNM! z?flmHXYvOwtXf+Eh*LcBJYTqJ32N@CmJILrRDN*dAH{3AD#OiyKa;U zwpx8><)6yB=O^bqS~NPm#>K1_tW8kTlJ5<^kPOFRhf1E>KjqtaFwzSt=qKP+Ar5Oe z=kb=}mPE2pI*QF;u~Ae-Z2<85Uwxa1`7~I9(NToeWWD-ZK}TaIL@@Kn#IF;?d?G9X zflu|T5`D?Wsn>Y&#|`2=od)C-hE!ipl#=n6m)#jfBlE`DShJOWTqip$M1lc-}DOV z7_>I5(L>x#xJVATSN-u5u|TBuwTjO-6-$s1@5Br^BaqTrl0zb1N!-D`Vs|!**mffT z+~2X4_a2f~_ACvP8m!aC+De>l?e4_}C61bRPIz>XoX<&U3h&oCEaZef_m8|(Gt2Bx zC7Tfrm9}p3?YvEHb7}rb(T$LvFtki>Hf9A%og~kv61&#WVnH#)5Y&6VuW6!ESV*C- zHziCwZn6(bZ5i}%9O)#nIu9sXjyihX5IoGfJPp|yBkqQ&-d77L30~mg8DiBb4x5zL zeT3I=&PED>Jkl4qEMzU4M{XhSt3@!znH6>f+2lFI+)3NyuKoC&!l1B#kBsL%oaW{o z(e-_@(iG_zYwm7Q{VR`FR*|d(XvC#Y1Pv4bu$BUmFs~r_kK2YCr4Jol>l;g8A6jLi zc$}_k)+GS|k~^-$+t#7Yj6{~m$O)tVeUysku`Xx69ae8mOtQ58k`5@_(~K0)0hEYdfjGUorm z$nLbpdc&`uYH*UIu!+>)(vI^tAapWikVDXhmDyH%*3?`Qo9W(XFmfB5!+!Blb*x=*oodS6kh zRSr~?o06wO@Zj5k(XPVn`NsS#@Ac~A?rJ{)SK#X)OR`VNxpcWgLb9rogYu3pgpd;E z=*9*`H7MDmG})|lL?%ks9AlM<)*}aNtRK{0b}~vC2$nKmicnc@nkx}%lk+(H`Z?4r zY}9h7Pf2;Q=w>`NUu7QQ2I3F0pwtnzbfrCRep3(bQ1tH@%441w%ytRp_6P*-xKo0@ z1diWg{q$M7{o>^LxM}=D{{3)Bww_MU5EFP=4`XgtbOXgk^}dT zw@f;h6{wc6J1=@cRMpPGITDPt0?58AYKp#U%@=is?!z2<-*gwX$vLC5@&Ah~CH0v5 z2mq2b^luTq5VS^VJHMQdmtfi~!o5PKbYP@GR5b4f()taD>@j_-< zK#^plT^Kol2d|nyRmLTSN4mEDYwAdlZoinpNy<3gNjjiBuE^8#mqrrx42; zm*UFJlJ`5i5n0E`H{4$vnn;0@MgDObIc5dbjoeD0?WX(7nW_l%8`nda?Hmqrm9|C* zoY%kASSul3DPE1k#1Xxq23^yYKNa$LeL)x5+r>L#0V_6UAI?K~&C za&~kOxdVJ+KhH9Ph;jQcO(*IW=ULYu-&gRp3ZI2ocW;5vmd%U%gi7Hdumr%gHa3KgZ9=~ z*rLN~nH&d@8YC#oK+=c50XC-9U}g$c?bbp z!T6d`vxoXQgsr84PA&MVLA3nRHdU_$3j3=}SpQ6Uje!Gz8>+8RELuOe}SR_@0kD5^&*OY^{HE-Eb0fAh1Mg^&1d~ z!nX;?E(4#`o;dB39Svmj9*#C2dvSaNDdHhH{~%)i0Vt9V2N2)7691{^om`jbVyPKm zex>P^e599qO`&;Wy&Hmihs*FKlsnn#m#Z%S9?iJyu9!&k-+LeAU4u1G9{=}wy9O_V z5x=yR7mXHmnuFM`JT};7jr?^Jk4+Ri{}1n@>6H|%KpQ%;d#){MXs)lW^42F| z`TVAPU!I5@(M>)5H`a3aCw39~bNf>HpYhl({~k_>$cofw&PVbB=)KUBM7>B{!cmm Gp7|dcBBz)D literal 0 HcmV?d00001 diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_template.jpg b/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_template.jpg new file mode 100644 index 0000000000000000000000000000000000000000..393db734ef5f2870bf81dbe4c3c2658074e8c2ff GIT binary patch literal 42838 zcmZs?1B_)&*S~$*wr$(C&FN{|w(Xv_ZQIkfZQHgn)BnET=YI1(`SMj#Sy!#BTJ@`{ zvy;l+b-q@=b^(ae;!@%OpzlHpL<<0X?U`YVxm%b508&!a07w7;00Te(0{$OL_--M7 zGyJ#B_^!x6AON6m3;tcPfx!NU%f1=sU#|OR%70^kznST~FWk3n{jSX4jQVYdzbgvx zfAaj3%OVW)fAXwlFLga6q|1vW)0Dw{Oe;R-aA^vAx|Lh4+(SP;*m%rTrkpE)PqJQ_|dt9)8{kY#T z;Qti^`Ckn6Ukv?U4ErztGwwfy$^`%r6h;7yezWm+{qJ7_GdCM6HxtMIuaAb2iJOrT z0Qmpf_wU62$mvk)9-aI`rd?ptfZ*2BJhndn~knLKJEE| z?9asrq@@Z{J1}Ldrr90|q4y)4pR^l23_S@(Ake}F-Kq4X?xXU06&SA{i>^%xW< zBCk&!)v0B5KHh&T$+s>B_X^b3F2eL{!P*5ziGzFMBxyI9Q-3HiSR%0ANG-H&!)4Z6 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/objdetect/table_of_content_objdetect.markdown b/doc/tutorials/objdetect/table_of_content_objdetect.markdown index 0b019d88a5..6d646a8481 100644 --- a/doc/tutorials/objdetect/table_of_content_objdetect.markdown +++ b/doc/tutorials/objdetect/table_of_content_objdetect.markdown @@ -16,3 +16,13 @@ Ever wondered how your digital camera detects peoples and faces? Look here to fi - @subpage tutorial_traincascade This tutorial describes _opencv_traincascade_ application and its parameters. + +- @subpage tutorial_generalized_hough_ballard_guil + + Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. + + *Languages:* C++ + + *Compatibility:* \> OpenCV 3.4 + + *Author:* Markus Heck \ No newline at end of file diff --git a/doc/tutorials/objdetect/traincascade.markdown b/doc/tutorials/objdetect/traincascade.markdown index d78de2ec9a..7ff39b5a90 100644 --- a/doc/tutorials/objdetect/traincascade.markdown +++ b/doc/tutorials/objdetect/traincascade.markdown @@ -2,6 +2,8 @@ Cascade Classifier Training {#tutorial_traincascade} =========================== @prev_tutorial{tutorial_cascade_classifier} +@next_tutorial{tutorial_generalized_hough_ballard_guil} + Introduction ------------ diff --git a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp new file mode 100644 index 0000000000..3e0e095a9e --- /dev/null +++ b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp @@ -0,0 +1,100 @@ +/** + @file generalizedHoughTransform.cpp + @author Markus Heck + @brief Detects an object, given by a template, in an image using GeneralizedHoughBallard and GeneralizedHoughGuil. +*/ + +#include "opencv2/highgui.hpp" +#include "opencv2/imgproc.hpp" + +using namespace cv; +using namespace std; + +int main() { +// load source images + Mat image = imread("images/generalized_hough_mini_image.jpg"); + Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); + +// create grayscale image and template + Mat templ = Mat(imgTemplate.rows, imgTemplate.cols, CV_8UC1); + Mat grayImage; + cvtColor(imgTemplate, templ, COLOR_RGB2GRAY); + cvtColor(image, grayImage, COLOR_RGB2GRAY); + +// create variable for location, scale and rotation of detected templates + vector positionBallard, positionGuil; + +// template width and height + int w = templ.cols; + int h = templ.rows; + +// create ballard and set options + Ptr ballard = createGeneralizedHoughBallard(); + ballard->setMinDist(10); + ballard->setLevels(360); + ballard->setDp(2); + ballard->setMaxBufferSize(1000); + ballard->setVotesThreshold(40); + + ballard->setCannyLowThresh(30); + ballard->setCannyHighThresh(110); + ballard->setTemplate(templ); + + +// create guil and set options + Ptr guil = createGeneralizedHoughGuil(); + guil->setMinDist(10); + guil->setLevels(360); + guil->setDp(3); + guil->setMaxBufferSize(1000); + + guil->setMinAngle(0); + guil->setMaxAngle(360); + guil->setAngleStep(1); + guil->setAngleThresh(1500); + + guil->setMinScale(0.5); + guil->setMaxScale(2.0); + guil->setScaleStep(0.05); + guil->setScaleThresh(50); + + guil->setPosThresh(10); + + guil->setCannyLowThresh(30); + guil->setCannyHighThresh(110); + + guil->setTemplate(templ); + + +// execute ballard detection + ballard->detect(grayImage, positionBallard); +// execute guil detection + guil->detect(grayImage, positionGuil); + + +// draw ballard + for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { + RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), + Size2f(w * (*iter)[2], h * (*iter)[2]), + (*iter)[3]); + Point2f vertices[4]; + rRect.points(vertices); + for (int i = 0; i < 4; i++) + line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6); + } + +// draw guil + for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) { + RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), + Size2f(w * (*iter)[2], h * (*iter)[2]), + (*iter)[3]); + Point2f vertices[4]; + rRect.points(vertices); + for (int i = 0; i < 4; i++) + line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2); + } + + imshow("result_img", image); + waitKey(); + return EXIT_SUCCESS; +} \ No newline at end of file From e2a9cff3dc1c595badc31cd80d152282a55afce6 Mon Sep 17 00:00:00 2001 From: Markus Heck Date: Thu, 8 Sep 2022 13:03:33 +0200 Subject: [PATCH 15/29] Include code snippets with doxygen notation and small fix in table_of_content_objdetect.markdown --- .../generalized_hough_ballard_guil.markdown | 98 ++----------------- .../table_of_content_objdetect.markdown | 8 +- .../generalizedHoughTransform.cpp | 10 ++ 3 files changed, 20 insertions(+), 96 deletions(-) diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown index 6507e0f4a1..b6f1479172 100644 --- a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown +++ b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown @@ -27,8 +27,7 @@ Example 4. Set the required parameters for both GeneralizedHough variants 5. Detect and show found results -Note: - +@note - Both variants can't be instantiated directly. Using the create methods is required. - Guil Hough is very slow. Calculating the results for the "mini" files used in this tutorial takes only a few seconds. With image and template in a higher resolution, as shown below, @@ -40,31 +39,14 @@ Note: ### Code The complete code for this tutorial is shown below. -@include generalizedHoughTransform.cpp +@include samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp Explanation ----------- ### Load image, template and setup variables -```c++ -// load source images -Mat image = imread("images/generalized_hough_mini_image.jpg"); -Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); - -// create grayscale image and template -Mat templ = Mat(imgTemplate.rows, imgTemplate.cols, CV_8UC1); -Mat grayImage; -cvtColor(imgTemplate, templ, COLOR_RGB2GRAY); -cvtColor(image, grayImage, COLOR_RGB2GRAY); - -// create variable for location, scale and rotation of detected templates -vector positionBallard, positionGuil; - -// template width and height -int w = templ.cols; -int h = templ.rows; -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-load-and-setup The position vectors will contain the matches the detectors will find. Every entry contains four floating point values: @@ -79,87 +61,19 @@ An example could look as follows: `[200, 100, 0.9, 120]` ### Setup parameters -```c++ -// create ballard and set options -Ptr ballard = createGeneralizedHoughBallard(); -ballard->setMinDist(10); -ballard->setLevels(360); -ballard->setDp(2); -ballard->setMaxBufferSize(1000); -ballard->setVotesThreshold(40); - -ballard->setCannyLowThresh(30); -ballard->setCannyHighThresh(110); -ballard->setTemplate(templ); - - -// create guil and set options -Ptr guil = createGeneralizedHoughGuil(); -guil->setMinDist(10); -guil->setLevels(360); -guil->setDp(3); -guil->setMaxBufferSize(1000); - -guil->setMinAngle(0); -guil->setMaxAngle(360); -guil->setAngleStep(1); -guil->setAngleThresh(1500); - -guil->setMinScale(0.5); -guil->setMaxScale(2.0); -guil->setScaleStep(0.05); -guil->setScaleThresh(50); - -guil->setPosThresh(10); - -guil->setCannyLowThresh(30); -guil->setCannyHighThresh(110); - -guil->setTemplate(templ); -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-setup-parameters Finding the optimal values can end up in trial and error and depends on many factors, such as the image resolution. ### Run detection -```c++ -// execute ballard detection - ballard->detect(grayImage, positionBallard); -// execute guil detection - guil->detect(grayImage, positionGuil); -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-run As mentioned above, this step will take some time, especially with larger images and when using Guil. ### Draw results and show image -```c++ -// draw ballard -for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { -RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), -Size2f(w * (*iter)[2], h * (*iter)[2]), -(*iter)[3]); -Point2f vertices[4]; -rRect.points(vertices); -for (int i = 0; i < 4; i++) -line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6); -} - -// draw guil -for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) { -RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), -Size2f(w * (*iter)[2], h * (*iter)[2]), -(*iter)[3]); -Point2f vertices[4]; -rRect.points(vertices); -for (int i = 0; i < 4; i++) -line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2); -} - -imshow("result_img", image); -waitKey(); -return EXIT_SUCCESS; -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-draw-results Result ------ diff --git a/doc/tutorials/objdetect/table_of_content_objdetect.markdown b/doc/tutorials/objdetect/table_of_content_objdetect.markdown index 6d646a8481..9b8a09b4e8 100644 --- a/doc/tutorials/objdetect/table_of_content_objdetect.markdown +++ b/doc/tutorials/objdetect/table_of_content_objdetect.markdown @@ -19,10 +19,10 @@ Ever wondered how your digital camera detects peoples and faces? Look here to fi - @subpage tutorial_generalized_hough_ballard_guil - Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. - *Languages:* C++ - *Compatibility:* \> OpenCV 3.4 + *Compatibility:* \>= OpenCV 3.4 - *Author:* Markus Heck \ No newline at end of file + *Author:* Markus Heck + + Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. \ No newline at end of file diff --git a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp index 3e0e095a9e..2630dc1f6e 100644 --- a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp +++ b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp @@ -11,6 +11,7 @@ using namespace cv; using namespace std; int main() { + //! [generalized-hough-transform-load-and-setup] // load source images Mat image = imread("images/generalized_hough_mini_image.jpg"); Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); @@ -27,7 +28,10 @@ int main() { // template width and height int w = templ.cols; int h = templ.rows; + //! [generalized-hough-transform-load-and-setup] + + //! [generalized-hough-transform-setup-parameters] // create ballard and set options Ptr ballard = createGeneralizedHoughBallard(); ballard->setMinDist(10); @@ -64,14 +68,18 @@ int main() { guil->setCannyHighThresh(110); guil->setTemplate(templ); + //! [generalized-hough-transform-setup-parameters] + //! [generalized-hough-transform-run] // execute ballard detection ballard->detect(grayImage, positionBallard); // execute guil detection guil->detect(grayImage, positionGuil); + //! [generalized-hough-transform-run] + //! [generalized-hough-transform-draw-results] // draw ballard for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), @@ -96,5 +104,7 @@ int main() { imshow("result_img", image); waitKey(); + //! [generalized-hough-transform-draw-results] + return EXIT_SUCCESS; } \ No newline at end of file From 54089499516e81a6a2d261129451f79324a74a83 Mon Sep 17 00:00:00 2001 From: Markus Heck Date: Fri, 9 Sep 2022 15:27:11 +0200 Subject: [PATCH 16/29] fix typo and simplify example (grayscale template) --- .../generalized_hough_ballard_guil.markdown | 2 +- .../objectDetection/generalizedHoughTransform.cpp | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown index b6f1479172..c5dc2590af 100644 --- a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown +++ b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown @@ -8,7 +8,7 @@ Object detection with Generalized Ballard and Guil Hough Transform {#tutorial_ge Goal ---- -In this tutorial you will lern how to: +In this tutorial you will learn how to: - Use @ref cv::GeneralizedHoughBallard and @ref cv::GeneralizedHoughGuil to detect an object diff --git a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp index 2630dc1f6e..dca52b1339 100644 --- a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp +++ b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp @@ -12,14 +12,12 @@ using namespace std; int main() { //! [generalized-hough-transform-load-and-setup] -// load source images +// load source image and grayscale template Mat image = imread("images/generalized_hough_mini_image.jpg"); - Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); + Mat templ = imread("images/generalized_hough_mini_template.jpg", IMREAD_GRAYSCALE); -// create grayscale image and template - Mat templ = Mat(imgTemplate.rows, imgTemplate.cols, CV_8UC1); +// create grayscale image Mat grayImage; - cvtColor(imgTemplate, templ, COLOR_RGB2GRAY); cvtColor(image, grayImage, COLOR_RGB2GRAY); // create variable for location, scale and rotation of detected templates From 619e038de97906ace6fbc555e257ddae65cae6a5 Mon Sep 17 00:00:00 2001 From: Markus Heck Date: Sat, 10 Sep 2022 17:40:31 +0200 Subject: [PATCH 17/29] move tutorial to imgproc and example to ImgTrans --- .../generalized_hough_ballard_guil.markdown | 13 +++++++------ .../images/generalized_hough_image.jpg | Bin .../generalized_hough_less_perfect_result_img.jpg | Bin .../images/generalized_hough_mini_image.jpg | Bin .../images/generalized_hough_mini_template.jpg | Bin .../images/generalized_hough_result_img.jpg | Bin .../images/generalized_hough_template.jpg | Bin .../imgtrans/hough_circle/hough_circle.markdown | 2 +- .../imgproc/imgtrans/remap/remap.markdown | 2 +- .../imgproc/table_of_content_imgproc.markdown | 10 ++++++++++ .../objdetect/table_of_content_objdetect.markdown | 10 ---------- doc/tutorials/objdetect/traincascade.markdown | 1 - .../generalizedHoughTransform.cpp | 0 13 files changed, 19 insertions(+), 19 deletions(-) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown (81%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_image.jpg (100%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg (100%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg (100%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg (100%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg (100%) rename doc/tutorials/{objdetect => imgproc}/generalized_hough_ballard_guil/images/generalized_hough_template.jpg (100%) rename samples/cpp/tutorial_code/{objectDetection => ImgTrans}/generalizedHoughTransform.cpp (100%) diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown b/doc/tutorials/imgproc/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown similarity index 81% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown index c5dc2590af..edf18b3844 100644 --- a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown +++ b/doc/tutorials/imgproc/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown @@ -3,7 +3,8 @@ Object detection with Generalized Ballard and Guil Hough Transform {#tutorial_ge @tableofcontents -@prev_tutorial{tutorial_traincascade} +@prev_tutorial{tutorial_hough_circle} +@next_tutorial{tutorial_remap} Goal ---- @@ -39,14 +40,14 @@ Example ### Code The complete code for this tutorial is shown below. -@include samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp +@include samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp Explanation ----------- ### Load image, template and setup variables -@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-load-and-setup +@snippet samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp generalized-hough-transform-load-and-setup The position vectors will contain the matches the detectors will find. Every entry contains four floating point values: @@ -61,19 +62,19 @@ An example could look as follows: `[200, 100, 0.9, 120]` ### Setup parameters -@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-setup-parameters +@snippet samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp generalized-hough-transform-setup-parameters Finding the optimal values can end up in trial and error and depends on many factors, such as the image resolution. ### Run detection -@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-run +@snippet samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp generalized-hough-transform-run As mentioned above, this step will take some time, especially with larger images and when using Guil. ### Draw results and show image -@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-draw-results +@snippet samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp generalized-hough-transform-draw-results Result ------ diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_image.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_image.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_image.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_image.jpg diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_less_perfect_result_img.jpg diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_mini_image.jpg diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_mini_template.jpg diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_result_img.jpg diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_template.jpg b/doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_template.jpg similarity index 100% rename from doc/tutorials/objdetect/generalized_hough_ballard_guil/images/generalized_hough_template.jpg rename to doc/tutorials/imgproc/generalized_hough_ballard_guil/images/generalized_hough_template.jpg diff --git a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown index 497215794b..0a2ba8843e 100644 --- a/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown +++ b/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.markdown @@ -2,7 +2,7 @@ Hough Circle Transform {#tutorial_hough_circle} ====================== @prev_tutorial{tutorial_hough_lines} -@next_tutorial{tutorial_remap} +@next_tutorial{tutorial_generalized_hough_ballard_guil} Goal ---- diff --git a/doc/tutorials/imgproc/imgtrans/remap/remap.markdown b/doc/tutorials/imgproc/imgtrans/remap/remap.markdown index ac2b879171..eb34be4bb1 100644 --- a/doc/tutorials/imgproc/imgtrans/remap/remap.markdown +++ b/doc/tutorials/imgproc/imgtrans/remap/remap.markdown @@ -1,7 +1,7 @@ Remapping {#tutorial_remap} ========= -@prev_tutorial{tutorial_hough_circle} +@prev_tutorial{tutorial_generalized_hough_ballard_guil} @next_tutorial{tutorial_warp_affine} Goal diff --git a/doc/tutorials/imgproc/table_of_content_imgproc.markdown b/doc/tutorials/imgproc/table_of_content_imgproc.markdown index b0a8b8260b..9545cd2155 100644 --- a/doc/tutorials/imgproc/table_of_content_imgproc.markdown +++ b/doc/tutorials/imgproc/table_of_content_imgproc.markdown @@ -173,6 +173,16 @@ In this section you will learn about the image processing (manipulation) functio Where we learn how to detect circles +- @subpage tutorial_generalized_hough_ballard_guil + + *Languages:* C++ + + *Compatibility:* \>= OpenCV 3.4 + + *Author:* Markus Heck + + Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. + - @subpage tutorial_remap *Languages:* C++, Java, Python diff --git a/doc/tutorials/objdetect/table_of_content_objdetect.markdown b/doc/tutorials/objdetect/table_of_content_objdetect.markdown index 9b8a09b4e8..0b019d88a5 100644 --- a/doc/tutorials/objdetect/table_of_content_objdetect.markdown +++ b/doc/tutorials/objdetect/table_of_content_objdetect.markdown @@ -16,13 +16,3 @@ Ever wondered how your digital camera detects peoples and faces? Look here to fi - @subpage tutorial_traincascade This tutorial describes _opencv_traincascade_ application and its parameters. - -- @subpage tutorial_generalized_hough_ballard_guil - - *Languages:* C++ - - *Compatibility:* \>= OpenCV 3.4 - - *Author:* Markus Heck - - Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. \ No newline at end of file diff --git a/doc/tutorials/objdetect/traincascade.markdown b/doc/tutorials/objdetect/traincascade.markdown index 7ff39b5a90..1528c02211 100644 --- a/doc/tutorials/objdetect/traincascade.markdown +++ b/doc/tutorials/objdetect/traincascade.markdown @@ -2,7 +2,6 @@ Cascade Classifier Training {#tutorial_traincascade} =========================== @prev_tutorial{tutorial_cascade_classifier} -@next_tutorial{tutorial_generalized_hough_ballard_guil} Introduction diff --git a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp b/samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp similarity index 100% rename from samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp rename to samples/cpp/tutorial_code/ImgTrans/generalizedHoughTransform.cpp From 6481cfd048e674d8c99406f0c6766ba6b1290afc Mon Sep 17 00:00:00 2001 From: Henrik Dobbe Flemmen Date: Mon, 12 Sep 2022 14:37:11 +0200 Subject: [PATCH 18/29] Update the fourcc codes link --- modules/videoio/include/opencv2/videoio.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index aa247dd84e..b63441aca9 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -876,9 +876,11 @@ public: /** @overload @param filename Name of the output video file. @param fourcc 4-character code of codec used to compress the frames. For example, - VideoWriter::fourcc('P','I','M','1') is a MPEG-1 codec, VideoWriter::fourcc('M','J','P','G') is a - motion-jpeg codec etc. List of codes can be obtained at [Video Codecs by - FOURCC](http://www.fourcc.org/codecs.php) page. FFMPEG backend with MP4 container natively uses + VideoWriter::fourcc('P','I','M','1') is a MPEG-1 codec, VideoWriter::fourcc('M','J','P','G') + is a motion-jpeg codec etc. List of codes can be obtained at + [MSDN](https://docs.microsoft.com/en-us/windows/win32/medfound/video-fourccs) page + or with this [archived page](https://web.archive.org/web/20220316062600/http://www.fourcc.org/codecs.php) + of the fourcc site for a more complete list). FFMPEG backend with MP4 container natively uses other values as fourcc code: see [ObjectType](http://mp4ra.org/#/codecs), so you may receive a warning message from OpenCV about fourcc code conversion. @param fps Framerate of the created video stream. From 65bdb3a5442af922c5b4fa9d19e448450b4be4c0 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 6 Sep 2022 15:50:37 +0000 Subject: [PATCH 19/29] dnn: eliminate GCC12 warning in total() call --- .../dnn/include/opencv2/dnn/shape_utils.hpp | 39 ++++++++++++++++--- .../dnn/src/layers/normalize_bbox_layer.cpp | 4 +- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/modules/dnn/include/opencv2/dnn/shape_utils.hpp b/modules/dnn/include/opencv2/dnn/shape_utils.hpp index fafd1bf725..3241a1a024 100644 --- a/modules/dnn/include/opencv2/dnn/shape_utils.hpp +++ b/modules/dnn/include/opencv2/dnn/shape_utils.hpp @@ -160,22 +160,49 @@ static inline MatShape shape(int a0, int a1=-1, int a2=-1, int a3=-1) static inline int total(const MatShape& shape, int start = -1, int end = -1) { - if (start == -1) start = 0; - if (end == -1) end = (int)shape.size(); - if (shape.empty()) return 0; + int dims = (int)shape.size(); + + if (start == -1) start = 0; + if (end == -1) end = dims; + + CV_CheckLE(0, start, ""); + CV_CheckLE(start, end, ""); + CV_CheckLE(end, dims, ""); + int elems = 1; - CV_Assert(start <= (int)shape.size() && end <= (int)shape.size() && - start <= end); - for(int i = start; i < end; i++) + for (int i = start; i < end; i++) { elems *= shape[i]; } return elems; } +// TODO: rename to countDimsElements() +static inline int total(const Mat& mat, int start = -1, int end = -1) +{ + if (mat.empty()) + return 0; + + int dims = mat.dims; + + if (start == -1) start = 0; + if (end == -1) end = dims; + + CV_CheckLE(0, start, ""); + CV_CheckLE(start, end, ""); + CV_CheckLE(end, dims, ""); + + int elems = 1; + for (int i = start; i < end; i++) + { + elems *= mat.size[i]; + } + return elems; +} + static inline MatShape concat(const MatShape& a, const MatShape& b) { MatShape c = a; diff --git a/modules/dnn/src/layers/normalize_bbox_layer.cpp b/modules/dnn/src/layers/normalize_bbox_layer.cpp index 37202bf863..11dc911087 100644 --- a/modules/dnn/src/layers/normalize_bbox_layer.cpp +++ b/modules/dnn/src/layers/normalize_bbox_layer.cpp @@ -208,8 +208,8 @@ public: const float* inpData = inp0.ptr(); float* outData = outputs[0].ptr(); - size_t num = total(shape(inp0.size), 0, startAxis); - size_t numPlanes = total(shape(inp0.size), startAxis, endAxis + 1); + size_t num = total(inp0, 0, startAxis); + size_t numPlanes = total(inp0, startAxis, endAxis + 1); CV_Assert(num * numPlanes != 0); size_t planeSize = inp0.total() / (num * numPlanes); for (size_t n = 0; n < num; ++n) From 2e155827997f5160bea9d738aff300bbe582c7bb Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 14 Sep 2022 11:57:46 +0000 Subject: [PATCH 20/29] build: eliminate uninitialized warnings from GCC12 --- modules/core/include/opencv2/core/hal/intrin.hpp | 10 ++++++++++ modules/imgproc/src/sumpixels.avx512_skx.hpp | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/modules/core/include/opencv2/core/hal/intrin.hpp b/modules/core/include/opencv2/core/hal/intrin.hpp index 16d5284e64..cf49bffceb 100644 --- a/modules/core/include/opencv2/core/hal/intrin.hpp +++ b/modules/core/include/opencv2/core/hal/intrin.hpp @@ -50,6 +50,12 @@ #include #include "opencv2/core/cvdef.h" +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + #define OPENCV_HAL_ADD(a, b) ((a) + (b)) #define OPENCV_HAL_AND(a, b) ((a) & (b)) #define OPENCV_HAL_NOP(a) (a) @@ -695,4 +701,8 @@ CV_CPU_OPTIMIZATION_HAL_NAMESPACE_END //! @endcond +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic pop +#endif + #endif diff --git a/modules/imgproc/src/sumpixels.avx512_skx.hpp b/modules/imgproc/src/sumpixels.avx512_skx.hpp index 3c9c90c658..81d9d1d846 100644 --- a/modules/imgproc/src/sumpixels.avx512_skx.hpp +++ b/modules/imgproc/src/sumpixels.avx512_skx.hpp @@ -6,6 +6,12 @@ #include "opencv2/core/hal/intrin.hpp" +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif + namespace cv { namespace hal { CV_CPU_OPTIMIZATION_NAMESPACE_BEGIN @@ -465,3 +471,7 @@ void calculate_integral_avx512(const uchar *src, size_t _srcstep, CV_CPU_OPTIMIZATION_NAMESPACE_END }} // end namespace cv::hal + +#if defined(__GNUC__) && __GNUC__ == 12 +#pragma GCC diagnostic pop +#endif From 3f4abcb2280fba1ef5057f100d7de7197ce39549 Mon Sep 17 00:00:00 2001 From: Andrey Senyaev Date: Tue, 20 Sep 2022 13:34:17 +0300 Subject: [PATCH 21/29] Disabled compiling warnings in case of symbols in cmake for 3.4 --- 3rdparty/openexr/CMakeLists.txt | 1 + cmake/OpenCVCompilerOptions.cmake | 1 + modules/core/include/opencv2/core/cuda.hpp | 8 ++++ .../core/include/opencv2/core/cuda.inl.hpp | 40 +++++++++++++++++++ modules/core/include/opencv2/core/matx.hpp | 8 ++++ modules/core/include/opencv2/core/opengl.hpp | 8 ++++ .../opencv2/core/utils/filesystem.private.hpp | 2 +- modules/features2d/src/affine_feature.cpp | 2 +- .../opencv2/stitching/detail/warpers.hpp | 24 +++++++++++ 9 files changed, 92 insertions(+), 2 deletions(-) diff --git a/3rdparty/openexr/CMakeLists.txt b/3rdparty/openexr/CMakeLists.txt index 1fbfa4f857..f17d05a472 100644 --- a/3rdparty/openexr/CMakeLists.txt +++ b/3rdparty/openexr/CMakeLists.txt @@ -123,6 +123,7 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4334) # vs2005 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4244) # vs2008 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267) # vs2008 Win64 ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4456) # vs2015 +ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4819) # vs2019 Win64 if(MSVC AND CV_ICC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Qrestrict") diff --git a/cmake/OpenCVCompilerOptions.cmake b/cmake/OpenCVCompilerOptions.cmake index bbfd889690..5b77ebf0d6 100644 --- a/cmake/OpenCVCompilerOptions.cmake +++ b/cmake/OpenCVCompilerOptions.cmake @@ -426,6 +426,7 @@ if(MSVC) ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4275) # non dll-interface class 'std::exception' used as base for dll-interface class 'cv::Exception' ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4512) # Assignment operator could not be generated ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4589) # Constructor of abstract class 'cv::ORB' ignores initializer for virtual base class 'cv::Algorithm' + ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4819) # Symbols like delta or epsilon cannot be represented endif() if(CV_ICC AND NOT ENABLE_NOISY_WARNINGS) diff --git a/modules/core/include/opencv2/core/cuda.hpp b/modules/core/include/opencv2/core/cuda.hpp index 7d7bb62e16..527e2e9dc2 100644 --- a/modules/core/include/opencv2/core/cuda.hpp +++ b/modules/core/include/opencv2/core/cuda.hpp @@ -488,8 +488,16 @@ public: //! Allocates a new GpuMat of given size and type. GpuMat getBuffer(int rows, int cols, int type); +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif //! Allocates a new GpuMat of given size and type. GpuMat getBuffer(Size size, int type) { return getBuffer(size.height, size.width, type); } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif //! Returns the allocator associated with the stream. Ptr getAllocator() const { return allocator_; } diff --git a/modules/core/include/opencv2/core/cuda.inl.hpp b/modules/core/include/opencv2/core/cuda.inl.hpp index 35ae2e49d7..107b5b5603 100644 --- a/modules/core/include/opencv2/core/cuda.inl.hpp +++ b/modules/core/include/opencv2/core/cuda.inl.hpp @@ -75,6 +75,11 @@ GpuMat::GpuMat(Size size_, int type_, Allocator* allocator_) create(size_.height, size_.width, type_); } +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline GpuMat::GpuMat(int rows_, int cols_, int type_, Scalar s_, Allocator* allocator_) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), allocator(allocator_) @@ -96,6 +101,9 @@ GpuMat::GpuMat(Size size_, int type_, Scalar s_, Allocator* allocator_) setTo(s_); } } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif inline GpuMat::GpuMat(const GpuMat& m) @@ -158,11 +166,19 @@ GpuMat GpuMat::clone() const return m; } +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline void GpuMat::copyTo(OutputArray dst, InputArray mask) const { copyTo(dst, mask, Stream::Null()); } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif inline GpuMat& GpuMat::setTo(Scalar s) @@ -176,6 +192,11 @@ GpuMat& GpuMat::setTo(Scalar s, InputArray mask) return setTo(s, mask, Stream::Null()); } +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline void GpuMat::convertTo(OutputArray dst, int rtype) const { @@ -187,6 +208,9 @@ void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, double beta) co { convertTo(dst, rtype, alpha, beta, Stream::Null()); } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif inline void GpuMat::convertTo(OutputArray dst, int rtype, double alpha, Stream& stream) const @@ -554,6 +578,11 @@ Event::Event(const Ptr& impl) // Initialization & Info //=================================================================================== +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline bool TargetArchs::has(int major, int minor) { @@ -571,6 +600,9 @@ DeviceInfo::DeviceInfo() { device_id_ = getDevice(); } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif inline DeviceInfo::DeviceInfo(int device_id) @@ -579,6 +611,11 @@ DeviceInfo::DeviceInfo(int device_id) device_id_ = device_id; } +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline int DeviceInfo::deviceID() const { @@ -607,6 +644,9 @@ bool DeviceInfo::supports(FeatureSet feature_set) const int version = majorVersion() * 10 + minorVersion(); return version >= feature_set; } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif }} // namespace cv { namespace cuda { diff --git a/modules/core/include/opencv2/core/matx.hpp b/modules/core/include/opencv2/core/matx.hpp index be1c26bb64..a9a72ecf67 100644 --- a/modules/core/include/opencv2/core/matx.hpp +++ b/modules/core/include/opencv2/core/matx.hpp @@ -681,11 +681,19 @@ Matx<_Tp,m,n>::Matx(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp for(int i = 16; i < channels; i++) val[i] = _Tp(0); } +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif template inline Matx<_Tp, m, n>::Matx(const _Tp* values) { for( int i = 0; i < channels; i++ ) val[i] = values[i]; } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif #ifdef CV_CXX11 template inline diff --git a/modules/core/include/opencv2/core/opengl.hpp b/modules/core/include/opencv2/core/opengl.hpp index a6288bebe8..c6f9b928a8 100644 --- a/modules/core/include/opencv2/core/opengl.hpp +++ b/modules/core/include/opencv2/core/opengl.hpp @@ -703,10 +703,18 @@ cv::ogl::Texture2D::Format cv::ogl::Texture2D::format() const /////// +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif inline cv::ogl::Arrays::Arrays() : size_(0) { } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif inline int cv::ogl::Arrays::size() const diff --git a/modules/core/include/opencv2/core/utils/filesystem.private.hpp b/modules/core/include/opencv2/core/utils/filesystem.private.hpp index 72b2bb9479..c32be15c61 100644 --- a/modules/core/include/opencv2/core/utils/filesystem.private.hpp +++ b/modules/core/include/opencv2/core/utils/filesystem.private.hpp @@ -36,7 +36,7 @@ namespace cv { namespace utils { namespace fs { * Provides interprocess synchronization mechanism. * Platform dependent. * - * Supports multiple readers / single writer access pattern (RW / readers–writer / shared-exclusive lock). + * Supports multiple readers / single writer access pattern (RW / readers-writer / shared-exclusive lock). * * File must exist. * File can't be re-used (for example, I/O operations via std::fstream is not safe) diff --git a/modules/features2d/src/affine_feature.cpp b/modules/features2d/src/affine_feature.cpp index 41518d945d..40e03e92ba 100644 --- a/modules/features2d/src/affine_feature.cpp +++ b/modules/features2d/src/affine_feature.cpp @@ -41,7 +41,7 @@ /* Guoshen Yu, Jean-Michel Morel, ASIFT: An Algorithm for Fully Affine - Invariant Comparison, Image Processing On Line, 1 (2011), pp. 11–38. + Invariant Comparison, Image Processing On Line, 1 (2011), pp. 11-38. https://doi.org/10.5201/ipol.2011.my-asift */ diff --git a/modules/stitching/include/opencv2/stitching/detail/warpers.hpp b/modules/stitching/include/opencv2/stitching/detail/warpers.hpp index 263cb01032..e67dc0738d 100644 --- a/modules/stitching/include/opencv2/stitching/detail/warpers.hpp +++ b/modules/stitching/include/opencv2/stitching/detail/warpers.hpp @@ -472,6 +472,11 @@ class CV_EXPORTS PlaneWarperGpu : public PlaneWarper public: PlaneWarperGpu(float scale = 1.f) : PlaneWarper(scale) {} +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE { Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); @@ -505,6 +510,9 @@ public: d_dst_.download(dst); return result; } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); @@ -526,6 +534,11 @@ class CV_EXPORTS SphericalWarperGpu : public SphericalWarper public: SphericalWarperGpu(float scale) : SphericalWarper(scale) {} +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE { Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); @@ -542,6 +555,9 @@ public: d_dst_.download(dst); return result; } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); @@ -558,6 +574,11 @@ class CV_EXPORTS CylindricalWarperGpu : public CylindricalWarper public: CylindricalWarperGpu(float scale) : CylindricalWarper(scale) {} +// WARNING: unreachable code using Ninja +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(push) +#pragma warning(disable: 4702) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, OutputArray xmap, OutputArray ymap) CV_OVERRIDE { Rect result = buildMaps(src_size, K, R, d_xmap_, d_ymap_); @@ -574,6 +595,9 @@ public: d_dst_.download(dst); return result; } +#if defined _MSC_VER && _MSC_VER >= 1920 +#pragma warning(pop) +#endif Rect buildMaps(Size src_size, InputArray K, InputArray R, cuda::GpuMat & xmap, cuda::GpuMat & ymap); From 3d9f27b87711e957994eb615e299cf353224d1a7 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Mon, 26 Sep 2022 13:50:23 +0300 Subject: [PATCH 22/29] Report that animated webp is not supported for now. --- modules/imgcodecs/src/grfmt_webp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/imgcodecs/src/grfmt_webp.cpp b/modules/imgcodecs/src/grfmt_webp.cpp index e137b8734d..99eb09e105 100644 --- a/modules/imgcodecs/src/grfmt_webp.cpp +++ b/modules/imgcodecs/src/grfmt_webp.cpp @@ -126,6 +126,8 @@ bool WebPDecoder::readHeader() WebPBitstreamFeatures features; if (VP8_STATUS_OK == WebPGetFeatures(header, sizeof(header), &features)) { + CV_CheckEQ(features.has_animation, false, "WebP backend does not support animated webp images"); + m_width = features.width; m_height = features.height; From c34c4b50d070b9ac9151669963d4f5bc336af479 Mon Sep 17 00:00:00 2001 From: catree Date: Mon, 26 Sep 2022 18:40:18 +0200 Subject: [PATCH 23/29] Add information about the disparity-to-depth mapping matrix. Add more references about other related functions in the calib3d doc. --- modules/calib3d/include/opencv2/calib3d.hpp | 97 ++++++++++++--------- modules/imgproc/include/opencv2/imgproc.hpp | 2 +- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index 2de2d34b0d..e13d488018 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -577,7 +577,7 @@ a vector\ . - @ref RHO - PROSAC-based robust method @param ransacReprojThreshold Maximum allowed reprojection error to treat a point pair as an inlier (used in the RANSAC and RHO methods only). That is, if -\f[\| \texttt{dstPoints} _i - \texttt{convertPointsHomogeneous} ( \texttt{H} * \texttt{srcPoints} _i) \|_2 > \texttt{ransacReprojThreshold}\f] +\f[\| \texttt{dstPoints} _i - \texttt{convertPointsHomogeneous} ( \texttt{H} \cdot \texttt{srcPoints} _i) \|_2 > \texttt{ransacReprojThreshold}\f] then the point \f$i\f$ is considered as an outlier. If srcPoints and dstPoints are measured in pixels, it usually makes sense to set this parameter somewhere in the range of 1 to 10. @param mask Optional output mask set by a robust method ( RANSAC or LMeDS ). Note that the input @@ -642,7 +642,7 @@ CV_EXPORTS Mat findHomography( InputArray srcPoints, InputArray dstPoints, @param Qz Optional output 3x3 rotation matrix around z-axis. The function computes a RQ decomposition using the given rotations. This function is used in -decomposeProjectionMatrix to decompose the left 3x3 submatrix of a projection matrix into a camera +@ref decomposeProjectionMatrix to decompose the left 3x3 submatrix of a projection matrix into a camera and a rotation matrix. It optionally returns three rotation matrices, one for each axis, and the three Euler angles in @@ -676,7 +676,7 @@ be used in OpenGL. Note, there is always more than one sequence of rotations abo principal axes that results in the same orientation of an object, e.g. see @cite Slabaugh . Returned tree rotation matrices and corresponding three Euler angles are only one of the possible solutions. -The function is based on RQDecomp3x3 . +The function is based on @ref RQDecomp3x3 . */ CV_EXPORTS_W void decomposeProjectionMatrix( InputArray projMatrix, OutputArray cameraMatrix, OutputArray rotMatrix, OutputArray transVect, @@ -696,7 +696,7 @@ CV_EXPORTS_W void decomposeProjectionMatrix( InputArray projMatrix, OutputArray The function computes partial derivatives of the elements of the matrix product \f$A*B\f$ with regard to the elements of each of the two input matrices. The function is used to compute the Jacobian -matrices in stereoCalibrate but can also be used in any other similar optimization function. +matrices in @ref stereoCalibrate but can also be used in any other similar optimization function. */ CV_EXPORTS_W void matMulDeriv( InputArray A, InputArray B, OutputArray dABdA, OutputArray dABdB ); @@ -722,10 +722,10 @@ The functions compute: \f[\begin{array}{l} \texttt{rvec3} = \mathrm{rodrigues} ^{-1} \left ( \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \mathrm{rodrigues} ( \texttt{rvec1} ) \right ) \\ \texttt{tvec3} = \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \texttt{tvec1} + \texttt{tvec2} \end{array} ,\f] where \f$\mathrm{rodrigues}\f$ denotes a rotation vector to a rotation matrix transformation, and -\f$\mathrm{rodrigues}^{-1}\f$ denotes the inverse transformation. See Rodrigues for details. +\f$\mathrm{rodrigues}^{-1}\f$ denotes the inverse transformation. See @ref Rodrigues for details. Also, the functions can compute the derivatives of the output vectors with regards to the input -vectors (see matMulDeriv ). The functions are used inside stereoCalibrate but can also be used in +vectors (see @ref matMulDeriv ). The functions are used inside @ref stereoCalibrate but can also be used in your own code where Levenberg-Marquardt or another gradient-based solver is used to optimize a function that contains a matrix multiplication. */ @@ -1084,7 +1084,7 @@ calibrateCamera for details. old interface all the per-view vectors are concatenated. @param imageSize Image size in pixels used to initialize the principal point. @param aspectRatio If it is zero or negative, both \f$f_x\f$ and \f$f_y\f$ are estimated independently. -Otherwise, \f$f_x = f_y * \texttt{aspectRatio}\f$ . +Otherwise, \f$f_x = f_y \cdot \texttt{aspectRatio}\f$ . The function estimates and returns an initial camera intrinsic matrix for the camera calibration process. Currently, the function only supports planar calibration patterns, which are patterns where each @@ -1098,12 +1098,12 @@ CV_EXPORTS_W Mat initCameraMatrix2D( InputArrayOfArrays objectPoints, @param image Source chessboard view. It must be an 8-bit grayscale or color image. @param patternSize Number of inner corners per a chessboard row and column -( patternSize = cvSize(points_per_row,points_per_colum) = cvSize(columns,rows) ). +( patternSize = cv::Size(points_per_row,points_per_colum) = cv::Size(columns,rows) ). @param corners Output array of detected corners. @param flags Various operation flags that can be zero or a combination of the following values: - @ref CALIB_CB_ADAPTIVE_THRESH Use adaptive thresholding to convert the image to black and white, rather than a fixed threshold level (computed from the average image brightness). -- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with equalizeHist before +- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with @ref equalizeHist before applying fixed or adaptive thresholding. - @ref CALIB_CB_FILTER_QUADS Use additional criteria (like contour area, perimeter, square-like shape) to filter out false quads extracted at the contour retrieval stage. @@ -1117,7 +1117,7 @@ are found and they are placed in a certain order (row by row, left to right in e Otherwise, if the function fails to find all the corners or reorder them, it returns 0. For example, a regular chessboard has 8 x 8 squares and 7 x 7 internal corners, that is, points where the black squares touch each other. The detected coordinates are approximate, and to determine their positions -more accurately, the function calls cornerSubPix. You also may use the function cornerSubPix with +more accurately, the function calls @ref cornerSubPix. You also may use the function @ref cornerSubPix with different parameters if returned coordinates are not accurate enough. Sample usage of detecting and drawing chessboard corners: : @@ -1154,9 +1154,9 @@ CV_EXPORTS_W bool find4QuadCornerSubpix( InputArray img, InputOutputArray corner @param image Destination image. It must be an 8-bit color image. @param patternSize Number of inner corners per a chessboard row and column (patternSize = cv::Size(points_per_row,points_per_column)). -@param corners Array of detected corners, the output of findChessboardCorners. +@param corners Array of detected corners, the output of @ref findChessboardCorners. @param patternWasFound Parameter indicating whether the complete board was found or not. The -return value of findChessboardCorners should be passed here. +return value of @ref findChessboardCorners should be passed here. The function draws individual chessboard corners detected either as red circles if the board was not found, or as colored corners connected with lines if the board was found. @@ -1542,7 +1542,7 @@ Besides the stereo-related information, the function can also perform a full cal the two cameras. However, due to the high dimensionality of the parameter space and noise in the input data, the function can diverge from the correct solution. If the intrinsic parameters can be estimated with high accuracy for each of the cameras individually (for example, using -calibrateCamera ), you are recommended to do so and then pass @ref CALIB_FIX_INTRINSIC flag to the +@ref calibrateCamera ), you are recommended to do so and then pass @ref CALIB_FIX_INTRINSIC flag to the function along with the computed intrinsic parameters. Otherwise, if all the parameters are estimated at once, it makes sense to restrict some parameters, for example, pass @ref CALIB_SAME_FOCAL_LENGTH and @ref CALIB_ZERO_TANGENT_DIST flags, which is usually a @@ -1608,7 +1608,7 @@ pixels from the original images from the cameras are retained in the rectified i image pixels are lost). Any intermediate value yields an intermediate result between those two extreme cases. @param newImageSize New image resolution after rectification. The same size should be passed to -initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) +@ref initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) is passed (default), it is set to the original imageSize . Setting it to a larger value can help you preserve details in the original image, especially when there is a big radial distortion. @param validPixROI1 Optional output rectangles inside the rectified images where all the pixels @@ -1620,7 +1620,7 @@ are valid. If alpha=0 , the ROIs cover the whole images. Otherwise, they are lik The function computes the rotation matrices for each camera that (virtually) make both camera image planes the same plane. Consequently, this makes all the epipolar lines parallel and thus simplifies -the dense stereo correspondence problem. The function takes the matrices computed by stereoCalibrate +the dense stereo correspondence problem. The function takes the matrices computed by @ref stereoCalibrate as input. As output, it provides two rotation matrices and also two projection matrices in the new coordinates. The function distinguishes the following two cases: @@ -1636,11 +1636,18 @@ coordinates. The function distinguishes the following two cases: \end{bmatrix}\f] \f[\texttt{P2} = \begin{bmatrix} - f & 0 & cx_2 & T_x*f \\ + f & 0 & cx_2 & T_x \cdot f \\ 0 & f & cy & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} ,\f] + \f[\texttt{Q} = \begin{bmatrix} + 1 & 0 & 0 & -cx_1 \\ + 0 & 1 & 0 & -cy \\ + 0 & 0 & 0 & f \\ + 0 & 0 & -\frac{1}{T_x} & \frac{cx_1 - cx_2}{T_x} + \end{bmatrix} \f] + where \f$T_x\f$ is a horizontal shift between the cameras and \f$cx_1=cx_2\f$ if @ref CALIB_ZERO_DISPARITY is set. @@ -1656,15 +1663,22 @@ coordinates. The function distinguishes the following two cases: \f[\texttt{P2} = \begin{bmatrix} f & 0 & cx & 0 \\ - 0 & f & cy_2 & T_y*f \\ + 0 & f & cy_2 & T_y \cdot f \\ 0 & 0 & 1 & 0 \end{bmatrix},\f] + \f[\texttt{Q} = \begin{bmatrix} + 1 & 0 & 0 & -cx \\ + 0 & 1 & 0 & -cy_1 \\ + 0 & 0 & 0 & f \\ + 0 & 0 & -\frac{1}{T_y} & \frac{cy_1 - cy_2}{T_y} + \end{bmatrix} \f] + where \f$T_y\f$ is a vertical shift between the cameras and \f$cy_1=cy_2\f$ if @ref CALIB_ZERO_DISPARITY is set. As you can see, the first three columns of P1 and P2 will effectively be the new "rectified" camera -matrices. The matrices, together with R1 and R2 , can then be passed to initUndistortRectifyMap to +matrices. The matrices, together with R1 and R2 , can then be passed to @ref initUndistortRectifyMap to initialize the rectification map for each camera. See below the screenshot from the stereo_calib.cpp sample. Some red horizontal lines pass through @@ -1687,20 +1701,20 @@ CV_EXPORTS_W void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs @param points1 Array of feature points in the first image. @param points2 The corresponding points in the second image. The same formats as in -findFundamentalMat are supported. +@ref findFundamentalMat are supported. @param F Input fundamental matrix. It can be computed from the same set of point pairs using -findFundamentalMat . +@ref findFundamentalMat . @param imgSize Size of the image. @param H1 Output rectification homography matrix for the first image. @param H2 Output rectification homography matrix for the second image. @param threshold Optional threshold used to filter out the outliers. If the parameter is greater than zero, all the point pairs that do not comply with the epipolar geometry (that is, the points -for which \f$|\texttt{points2[i]}^T*\texttt{F}*\texttt{points1[i]}|>\texttt{threshold}\f$ ) are -rejected prior to computing the homographies. Otherwise, all the points are considered inliers. +for which \f$|\texttt{points2[i]}^T \cdot \texttt{F} \cdot \texttt{points1[i]}|>\texttt{threshold}\f$ ) +are rejected prior to computing the homographies. Otherwise, all the points are considered inliers. The function computes the rectification transformations without knowing intrinsic parameters of the cameras and their relative position in the space, which explains the suffix "uncalibrated". Another -related difference from stereoRectify is that the function outputs not the rectification +related difference from @ref stereoRectify is that the function outputs not the rectification transformations in the object (3D) space, but the planar perspective transformations encoded by the homography matrices H1 and H2 . The function implements the algorithm @cite Hartley99 . @@ -1709,8 +1723,8 @@ homography matrices H1 and H2 . The function implements the algorithm @cite Hart depends on the epipolar geometry. Therefore, if the camera lenses have a significant distortion, it would be better to correct it before computing the fundamental matrix and calling this function. For example, distortion coefficients can be estimated for each head of stereo camera - separately by using calibrateCamera . Then, the images can be corrected using undistort , or - just the point coordinates can be corrected with undistortPoints . + separately by using @ref calibrateCamera . Then, the images can be corrected using @ref undistort , or + just the point coordinates can be corrected with @ref undistortPoints . */ CV_EXPORTS_W bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, InputArray F, Size imgSize, @@ -1738,10 +1752,10 @@ assumed. @param imageSize Original image size. @param alpha Free scaling parameter between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image). See -stereoRectify for details. +@ref stereoRectify for details. @param newImgSize Image size after rectification. By default, it is set to imageSize . @param validPixROI Optional output rectangle that outlines all-good-pixels region in the -undistorted image. See roi1, roi2 description in stereoRectify . +undistorted image. See roi1, roi2 description in @ref stereoRectify . @param centerPrincipalPoint Optional flag that indicates whether in the new camera intrinsic matrix the principal point should be at the image center or not. By default, the principal point is chosen to best fit a subset of the source image (determined by alpha) to the corrected image. @@ -1753,7 +1767,7 @@ image pixels if there is valuable information in the corners alpha=1 , or get so When alpha\>0 , the undistorted result is likely to have some black pixels corresponding to "virtual" pixels outside of the captured distorted image. The original camera intrinsic matrix, distortion coefficients, the computed new camera intrinsic matrix, and newImageSize should be passed to -initUndistortRectifyMap to produce the maps for remap . +@ref initUndistortRectifyMap to produce the maps for @ref remap . */ CV_EXPORTS_W Mat getOptimalNewCameraMatrix( InputArray cameraMatrix, InputArray distCoeffs, Size imageSize, double alpha, Size newImgSize = Size(), @@ -1920,7 +1934,7 @@ CV_EXPORTS_W void convertPointsFromHomogeneous( InputArray src, OutputArray dst @param dst Output vector of 2D, 3D, or 4D points. The function converts 2D or 3D points from/to homogeneous coordinates by calling either -convertPointsToHomogeneous or convertPointsFromHomogeneous. +@ref convertPointsToHomogeneous or @ref convertPointsFromHomogeneous. @note The function is obsolete. Use one of the previous two functions instead. */ @@ -1957,9 +1971,9 @@ the found fundamental matrix. Normally just one matrix is found. But in case of algorithm, the function may return up to 3 solutions ( \f$9 \times 3\f$ matrix that stores all 3 matrices sequentially). -The calculated fundamental matrix may be passed further to computeCorrespondEpilines that finds the +The calculated fundamental matrix may be passed further to @ref computeCorrespondEpilines that finds the epipolar lines corresponding to the specified points. It can also be passed to -stereoRectifyUncalibrated to compute the rectification transformation. : +@ref stereoRectifyUncalibrated to compute the rectification transformation. : @code // Example. Estimation of fundamental matrix using the RANSAC algorithm int point_count = 100; @@ -2023,7 +2037,7 @@ This function estimates essential matrix based on the five-point algorithm solve where \f$E\f$ is an essential matrix, \f$p_1\f$ and \f$p_2\f$ are corresponding points in the first and the second images, respectively. The result of this function may be passed further to -decomposeEssentialMat or recoverPose to recover the relative pose between cameras. +@ref decomposeEssentialMat or @ref recoverPose to recover the relative pose between cameras. */ CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, InputArray cameraMatrix, int method, @@ -2220,14 +2234,14 @@ CV_EXPORTS_W int recoverPose( InputArray E, InputArray points1, InputArray point @param points Input points. \f$N \times 1\f$ or \f$1 \times N\f$ matrix of type CV_32FC2 or vector\ . @param whichImage Index of the image (1 or 2) that contains the points . -@param F Fundamental matrix that can be estimated using findFundamentalMat or stereoRectify . +@param F Fundamental matrix that can be estimated using @ref findFundamentalMat or @ref stereoRectify . @param lines Output vector of the epipolar lines corresponding to the points in the other image. Each line \f$ax + by + c=0\f$ is encoded by 3 numbers \f$(a, b, c)\f$ . For every point in one of the two images of a stereo pair, the function finds the equation of the corresponding epipolar line in the other image. -From the fundamental matrix definition (see findFundamentalMat ), line \f$l^{(2)}_i\f$ in the second +From the fundamental matrix definition (see @ref findFundamentalMat ), line \f$l^{(2)}_i\f$ in the second image for the point \f$p^{(1)}_i\f$ in the first image (when whichImage=1 ) is computed as: \f[l^{(2)}_i = F p^{(1)}_i\f] @@ -2277,12 +2291,12 @@ CV_EXPORTS_W void triangulatePoints( InputArray projMatr1, InputArray projMatr2, @param newPoints1 The optimized points1. @param newPoints2 The optimized points2. -The function implements the Optimal Triangulation Method (see Multiple View Geometry for details). +The function implements the Optimal Triangulation Method (see Multiple View Geometry @cite HartleyZ00 for details). For each given point correspondence points1[i] \<-\> points2[i], and a fundamental matrix F, it computes the corrected correspondences newPoints1[i] \<-\> newPoints2[i] that minimize the geometric error \f$d(points1[i], newPoints1[i])^2 + d(points2[i],newPoints2[i])^2\f$ (where \f$d(a,b)\f$ is the geometric distance between points \f$a\f$ and \f$b\f$ ) subject to the epipolar constraint -\f$newPoints2^T * F * newPoints1 = 0\f$ . +\f$newPoints2^T \cdot F \cdot newPoints1 = 0\f$ . */ CV_EXPORTS_W void correctMatches( InputArray F, InputArray points1, InputArray points2, OutputArray newPoints1, OutputArray newPoints2 ); @@ -2584,10 +2598,11 @@ CV_EXPORTS_W int decomposeHomographyMat(InputArray H, @param beforePoints Vector of (rectified) visible reference points before the homography is applied @param afterPoints Vector of (rectified) visible reference points after the homography is applied @param possibleSolutions Vector of int indices representing the viable solution set after filtering -@param pointsMask optional Mat/Vector of 8u type representing the mask for the inliers as given by the findHomography function +@param pointsMask optional Mat/Vector of 8u type representing the mask for the inliers as given by the +@ref findHomography function -This function is intended to filter the output of the decomposeHomographyMat based on additional -information as described in @cite Malis2007 . The summary of the method: the decomposeHomographyMat function +This function is intended to filter the output of the @ref decomposeHomographyMat based on additional +information as described in @cite Malis2007 . The summary of the method: the @ref decomposeHomographyMat function returns 2 unique solutions and their "opposites" for a total of 4 solutions. If we have access to the sets of points visible in the camera frame before and after the homography transformation is applied, we can determine which are the true potential solutions and which are the opposites by verifying which @@ -2977,14 +2992,14 @@ optimization. It stays at the center or at a different location specified when @ camera. @param P2 Output 3x4 projection matrix in the new (rectified) coordinate systems for the second camera. - @param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see reprojectImageTo3D ). + @param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see @ref reprojectImageTo3D ). @param flags Operation flags that may be zero or @ref fisheye::CALIB_ZERO_DISPARITY . If the flag is set, the function makes the principal points of each camera have the same pixel coordinates in the rectified views. And if the flag is not set, the function may still shift the images in the horizontal or vertical direction (depending on the orientation of epipolar lines) to maximize the useful image area. @param newImageSize New image resolution after rectification. The same size should be passed to - initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) + @ref initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) is passed (default), it is set to the original imageSize . Setting it to larger value can help you preserve details in the original image, especially when there is a big radial distortion. @param balance Sets the new focal length in range between the min focal length and the max focal diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index 44a2e65d24..481c0bf9f7 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -3126,7 +3126,7 @@ where cameraMatrix can be chosen arbitrarily. of 4, 5, 8, 12 or 14 elements. If the vector is NULL/empty, the zero distortion coefficients are assumed. @param R Optional rectification transformation in the object space (3x3 matrix). R1 or R2 , computed by #stereoRectify can be passed here. If the matrix is empty, the identity transformation -is assumed. In cvInitUndistortMap R assumed to be an identity matrix. +is assumed. In #initUndistortRectifyMap R is assumed to be an identity matrix. @param newCameraMatrix New camera matrix \f$A'=\vecthreethree{f_x'}{0}{c_x'}{0}{f_y'}{c_y'}{0}{0}{1}\f$. @param size Undistorted image size. @param m1type Type of the first output map that can be CV_32FC1, CV_32FC2 or CV_16SC2, see #convertMaps From 38c9c20a355c62eb7c0940849c6dc88221c597f5 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Wed, 28 Sep 2022 21:57:46 +0200 Subject: [PATCH 24/29] Move marking memory as initialized earlier. --- modules/core/src/hal_internal.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/core/src/hal_internal.cpp b/modules/core/src/hal_internal.cpp index d2648fae81..f581d05cf4 100644 --- a/modules/core/src/hal_internal.cpp +++ b/modules/core/src/hal_internal.cpp @@ -244,6 +244,11 @@ lapack_SVD(fptype* a, size_t a_step, fptype *w, fptype* u, size_t u_step, fptype lwork = (int)round(work1); //optimal buffer size fptype* buffer = new fptype[lwork + 1]; + // Make sure MSAN sees the memory as having been written. + // MSAN does not think it has been written because a different language is called. + // Note: we do this here because if dgesdd is C++, MSAN errors can be reported within it. + CV_ANNOTATE_MEMORY_IS_INITIALIZED(buffer, sizeof(fptype) * (lwork + 1)); + if(typeid(fptype) == typeid(float)) OCV_LAPACK_FUNC(sgesdd)(mode, &m, &n, (float*)a, &lda, (float*)w, (float*)u, &ldu, (float*)vt, &ldv, (float*)buffer, &lwork, iworkBuf, info); else if(typeid(fptype) == typeid(double)) @@ -252,7 +257,6 @@ lapack_SVD(fptype* a, size_t a_step, fptype *w, fptype* u, size_t u_step, fptype // Make sure MSAN sees the memory as having been written. // MSAN does not think it has been written because a different language was called. CV_ANNOTATE_MEMORY_IS_INITIALIZED(a, a_step * n); - CV_ANNOTATE_MEMORY_IS_INITIALIZED(buffer, sizeof(fptype) * (lwork + 1)); if (u) CV_ANNOTATE_MEMORY_IS_INITIALIZED(u, u_step * m); if (vt) From 2f79b1b0877b194f461de0fb73ee4e7ab01a90fa Mon Sep 17 00:00:00 2001 From: Kumataro Date: Tue, 4 Oct 2022 00:24:15 +0900 Subject: [PATCH 25/29] Merge pull request #22404 from Kumataro:3.4-fix22388_2 * imgcodecs: tiff: Reduce memory usage to read 16bit image. * imgcodecs: tiff: Reduce memory usage to read 8bit images * imgcodecs: tiff: split basic test and full test. * imgcodecs: tiff: fix to warning C4244 * imgcodecs: tiff: fix to warning C4244 --- modules/imgcodecs/src/grfmt_tiff.cpp | 249 ++++++++++++++-- modules/imgcodecs/test/test_tiff.cpp | 428 +++++++++++++++++++++++++++ 2 files changed, 646 insertions(+), 31 deletions(-) diff --git a/modules/imgcodecs/src/grfmt_tiff.cpp b/modules/imgcodecs/src/grfmt_tiff.cpp index 04df6ff8bb..42ddeb2aa1 100644 --- a/modules/imgcodecs/src/grfmt_tiff.cpp +++ b/modules/imgcodecs/src/grfmt_tiff.cpp @@ -234,7 +234,6 @@ public: bool TiffDecoder::readHeader() { bool result = false; - TIFF* tif = static_cast(m_tif.get()); if (!tif) { @@ -390,18 +389,15 @@ static void fixOrientationFull(Mat &img, int orientation) * For 8 bit some corrections are done by TIFFReadRGBAStrip/Tile already. * Not so for 16/32/64 bit. */ -static void fixOrientation(Mat &img, uint16 orientation, int dst_bpp) +static void fixOrientation(Mat &img, uint16 orientation, bool isOrientationFull) { - switch(dst_bpp) { - case 8: - fixOrientationPartial(img, orientation); - break; - - case 16: - case 32: - case 64: - fixOrientationFull(img, orientation); - break; + if( isOrientationFull ) + { + fixOrientationFull(img, orientation); + } + else + { + fixOrientationPartial(img, orientation); } } @@ -440,17 +436,7 @@ bool TiffDecoder::readData( Mat& img ) (img_orientation == ORIENTATION_BOTRIGHT || img_orientation == ORIENTATION_RIGHTBOT || img_orientation == ORIENTATION_BOTLEFT || img_orientation == ORIENTATION_LEFTBOT); int wanted_channels = normalizeChannelsNumber(img.channels()); - - if (dst_bpp == 8) - { - char errmsg[1024]; - if (!TIFFRGBAImageOK(tif, errmsg)) - { - CV_LOG_WARNING(NULL, "OpenCV TIFF: TIFFRGBAImageOK: " << errmsg); - close(); - return false; - } - } + bool doReadScanline = false; uint32 tile_width0 = m_width, tile_height0 = 0; @@ -480,25 +466,139 @@ bool TiffDecoder::readData( Mat& img ) const uint64_t MAX_TILE_SIZE = (CV_BIG_UINT(1) << 30); CV_CheckLE((int)ncn, 4, ""); CV_CheckLE((int)bpp, 64, ""); - CV_Assert(((uint64_t)tile_width0 * tile_height0 * ncn * std::max(1, (int)(bpp / bitsPerByte)) < MAX_TILE_SIZE) && "TIFF tile size is too large: >= 1Gb"); if (dst_bpp == 8) { - // we will use TIFFReadRGBA* functions, so allocate temporary buffer for 32bit RGBA - bpp = 8; - ncn = 4; + const int _ncn = 4; // Read RGBA + const int _bpp = 8; // Read 8bit + + // if buffer_size(as 32bit RGBA) >= MAX_TILE_SIZE*95%, + // we will use TIFFReadScanline function. + + if ( + (uint64_t)tile_width0 * tile_height0 * _ncn * std::max(1, (int)(_bpp / bitsPerByte)) + >= + ( (uint64_t) MAX_TILE_SIZE * 95 / 100) + ) + { + uint16_t planerConfig = (uint16)-1; + CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig)); + + doReadScanline = (!is_tiled) // no tile + && + ( ( ncn == 1 ) || ( ncn == 3 ) || ( ncn == 4 ) ) + && + ( ( bpp == 8 ) || ( bpp == 16 ) ) + && + (tile_height0 == (uint32_t) m_height) // single strip + && + ( + (photometric == PHOTOMETRIC_MINISWHITE) + || + (photometric == PHOTOMETRIC_MINISBLACK) + || + (photometric == PHOTOMETRIC_RGB) + ) + && + (planerConfig != PLANARCONFIG_SEPARATE); + + // Currently only EXTRASAMPLE_ASSOCALPHA is supported. + if ( doReadScanline && ( ncn == 4 ) ) + { + uint16_t extra_samples_num; + uint16_t *extra_samples = NULL; + CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_samples_num, &extra_samples )); + doReadScanline = ( extra_samples_num == 1 ) && ( extra_samples[0] == EXTRASAMPLE_ASSOCALPHA ); + } + } + + if ( !doReadScanline ) + { + // we will use TIFFReadRGBA* functions, so allocate temporary buffer for 32bit RGBA + bpp = 8; + ncn = 4; + + char errmsg[1024]; + if (!TIFFRGBAImageOK(tif, errmsg)) + { + CV_LOG_WARNING(NULL, "OpenCV TIFF: TIFFRGBAImageOK: " << errmsg); + close(); + return false; + } + } + } + else if (dst_bpp == 16) + { + // if buffer_size >= MAX_TILE_SIZE*95%, + // we will use TIFFReadScanline function. + if ( + (uint64_t)tile_width0 * tile_height0 * ncn * std::max(1, (int)(bpp / bitsPerByte)) + >= + MAX_TILE_SIZE * 95 / 100 + ) + { + uint16_t planerConfig = (uint16)-1; + CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &planerConfig)); + + doReadScanline = (!is_tiled) // no tile + && + ( ( ncn == 1 ) || ( ncn == 3 ) || ( ncn == 4 ) ) + && + ( ( bpp == 8 ) || ( bpp == 16 ) ) + && + (tile_height0 == (uint32_t) m_height) // single strip + && + ( + (photometric == PHOTOMETRIC_MINISWHITE) + || + (photometric == PHOTOMETRIC_MINISBLACK) + || + (photometric == PHOTOMETRIC_RGB) + ) + && + (planerConfig != PLANARCONFIG_SEPARATE); + + // Currently only EXTRASAMPLE_ASSOCALPHA is supported. + if ( doReadScanline && ( ncn == 4 ) ) + { + uint16_t extra_samples_num; + uint16_t *extra_samples = NULL; + CV_TIFF_CHECK_CALL(TIFFGetField(tif, TIFFTAG_EXTRASAMPLES, &extra_samples_num, &extra_samples )); + doReadScanline = ( extra_samples_num == 1 ) && ( extra_samples[0] == EXTRASAMPLE_ASSOCALPHA ); + } + } } else if (dst_bpp == 32 || dst_bpp == 64) { CV_Assert(ncn == img.channels()); CV_TIFF_CHECK_CALL(TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP)); } + + if ( doReadScanline ) + { + // Read each scanlines. + tile_height0 = 1; + } + const size_t buffer_size = (bpp / bitsPerByte) * ncn * tile_height0 * tile_width0; + CV_CheckLT( buffer_size, MAX_TILE_SIZE, "buffer_size is too large: >= 1Gb"); + + if ( doReadScanline ) + { + CV_CheckGE( static_cast(buffer_size), + static_cast(TIFFScanlineSize(tif)), + "buffer_size is smaller than TIFFScanlineSize(). "); + } + AutoBuffer _buffer(buffer_size); uchar* buffer = _buffer.data(); ushort* buffer16 = (ushort*)buffer; int tileidx = 0; + #define MAKE_FLAG(a,b) ( (a << 8) | b ) + const int convert_flag = MAKE_FLAG( ncn, wanted_channels ); + const bool isNeedConvert16to8 = ( doReadScanline ) && ( bpp == 16 ) && ( dst_bpp == 8); + for (int y = 0; y < m_height; y += (int)tile_height0) { int tile_height = std::min((int)tile_height0, m_height - y); @@ -514,7 +614,29 @@ bool TiffDecoder::readData( Mat& img ) case 8: { uchar* bstart = buffer; - if (!is_tiled) + if (doReadScanline) + { + CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (uint32*)buffer, y) >= 0); + + if ( isNeedConvert16to8 ) + { + // Convert buffer image from 16bit to 8bit. + int ix; + for ( ix = 0 ; ix < tile_width * ncn - 4; ix += 4 ) + { + buffer[ ix ] = buffer[ ix * 2 + 1 ]; + buffer[ ix + 1 ] = buffer[ ix * 2 + 3 ]; + buffer[ ix + 2 ] = buffer[ ix * 2 + 5 ]; + buffer[ ix + 3 ] = buffer[ ix * 2 + 7 ]; + } + + for ( ; ix < tile_width * ncn ; ix ++ ) + { + buffer[ ix ] = buffer[ ix * 2 + 1]; + } + } + } + else if (!is_tiled) { CV_TIFF_CHECK_CALL(TIFFReadRGBAStrip(tif, y, (uint32*)buffer)); } @@ -525,9 +647,65 @@ bool TiffDecoder::readData( Mat& img ) bstart += (tile_height0 - tile_height) * tile_width0 * 4; } + uchar* img_line_buffer = (uchar*) img.ptr(y, 0); + for (int i = 0; i < tile_height; i++) { - if (color) + if (doReadScanline) + { + switch ( convert_flag ) + { + case MAKE_FLAG( 1, 1 ): // GRAY to GRAY + memcpy( (void*) img_line_buffer, + (void*) bstart, + tile_width * sizeof(uchar) ); + break; + + case MAKE_FLAG( 1, 3 ): // GRAY to BGR + icvCvt_Gray2BGR_8u_C1C3R( bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1) ); + break; + + case MAKE_FLAG( 3, 1): // RGB to GRAY + icvCvt_BGR2Gray_8u_C3C1R( bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1) ); + break; + + case MAKE_FLAG( 3, 3 ): // RGB to BGR + icvCvt_BGR2RGB_8u_C3R( bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1) ); + break; + + case MAKE_FLAG( 4, 1 ): // RGBA to GRAY + icvCvt_BGRA2Gray_8u_C4C1R( bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1) ); + break; + + case MAKE_FLAG( 4, 3 ): // RGBA to BGR + icvCvt_BGRA2BGR_8u_C4C3R( bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1), 2 ); + break; + + case MAKE_FLAG( 4, 4 ): // RGBA to BGRA + icvCvt_BGRA2RGBA_8u_C4R(bstart, 0, + img_line_buffer, 0, + Size(tile_width, 1) ); + break; + + default: + CV_LOG_ONCE_ERROR(NULL, "OpenCV TIFF(line " << __LINE__ << "): Unsupported convertion :" + << " bpp = " << bpp << " ncn = " << (int)ncn + << " wanted_channels =" << wanted_channels ); + break; + } + #undef MAKE_FLAG + } + else if (color) { if (wanted_channels == 4) { @@ -556,7 +734,11 @@ bool TiffDecoder::readData( Mat& img ) case 16: { - if (!is_tiled) + if (doReadScanline) + { + CV_TIFF_CHECK_CALL((int)TIFFReadScanline(tif, (uint32*)buffer, y) >= 0); + } + else if (!is_tiled) { CV_TIFF_CHECK_CALL((int)TIFFReadEncodedStrip(tif, tileidx, (uint32*)buffer, buffer_size) >= 0); } @@ -655,7 +837,11 @@ bool TiffDecoder::readData( Mat& img ) } // for x } // for y } - fixOrientation(img, img_orientation, dst_bpp); + + // If TIFFReadRGBA* function is used -> fixOrientationPartial(). + // Otherwise -> fixOrientationFull(). + fixOrientation(img, img_orientation, + ( ( dst_bpp != 8 ) && ( !doReadScanline ) ) ); } if (m_hdr && depth >= CV_32F) @@ -680,6 +866,7 @@ TiffEncoder::~TiffEncoder() ImageEncoder TiffEncoder::newEncoder() const { + cv_tiffSetErrorHandler(); return makePtr(); } diff --git a/modules/imgcodecs/test/test_tiff.cpp b/modules/imgcodecs/test/test_tiff.cpp index 063bd9ae50..eed9eb8410 100644 --- a/modules/imgcodecs/test/test_tiff.cpp +++ b/modules/imgcodecs/test/test_tiff.cpp @@ -2,6 +2,8 @@ // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html #include "test_precomp.hpp" +#include "opencv2/core/utils/logger.hpp" +#include "opencv2/core/utils/configuration.private.hpp" namespace opencv_test { namespace { @@ -46,6 +48,432 @@ TEST(Imgcodecs_Tiff, decode_tile16384x16384) EXPECT_EQ(0, remove(file4.c_str())); } +//================================================================================================== +// See https://github.com/opencv/opencv/issues/22388 + +/** + * Dummy enum to show combination of IMREAD_*. + */ +enum ImreadMixModes +{ + IMREAD_MIX_UNCHANGED = IMREAD_UNCHANGED , + IMREAD_MIX_GRAYSCALE = IMREAD_GRAYSCALE , + IMREAD_MIX_COLOR = IMREAD_COLOR , + IMREAD_MIX_GRAYSCALE_ANYDEPTH = IMREAD_GRAYSCALE | IMREAD_ANYDEPTH , + IMREAD_MIX_GRAYSCALE_ANYCOLOR = IMREAD_GRAYSCALE | IMREAD_ANYCOLOR, + IMREAD_MIX_GRAYSCALE_ANYDEPTH_ANYCOLOR = IMREAD_GRAYSCALE | IMREAD_ANYDEPTH | IMREAD_ANYCOLOR, + IMREAD_MIX_COLOR_ANYDEPTH = IMREAD_COLOR | IMREAD_ANYDEPTH , + IMREAD_MIX_COLOR_ANYCOLOR = IMREAD_COLOR | IMREAD_ANYCOLOR, + IMREAD_MIX_COLOR_ANYDEPTH_ANYCOLOR = IMREAD_COLOR | IMREAD_ANYDEPTH | IMREAD_ANYCOLOR +}; + +typedef tuple< uint64_t, tuple, ImreadMixModes > Bufsize_and_Type; +typedef testing::TestWithParam Imgcodecs_Tiff_decode_Huge; + +static inline +void PrintTo(const ImreadMixModes& val, std::ostream* os) +{ + PrintTo( static_cast(val), os ); +} + +TEST_P(Imgcodecs_Tiff_decode_Huge, regression) +{ + // Get test parameters + const uint64_t buffer_size = get<0>(GetParam()); + const string mat_type_string = get<0>(get<1>(GetParam())); + const int mat_type = get<1>(get<1>(GetParam())); + const int imread_mode = get<2>(GetParam()); + + // Detect data file + const string req_filename = cv::format("readwrite/huge-tiff/%s_%llu.tif", mat_type_string.c_str(), buffer_size); + const string filename = findDataFile( req_filename ); + + // Preparation process for test + { + // Convert from mat_type and buffer_size to tiff file information. + const uint64_t width = 32768; + int ncn = CV_MAT_CN(mat_type); + int depth = ( CV_MAT_DEPTH(mat_type) == CV_16U) ? 2 : 1; // 16bit or 8 bit + const uint64_t height = (uint64_t) buffer_size / width / ncn / depth; + const uint64_t base_scanline_size = (uint64_t) width * ncn * depth; + const uint64_t base_strip_size = (uint64_t) base_scanline_size * height; + + // To avoid exception about pixel size, check it. + static const size_t CV_IO_MAX_IMAGE_PIXELS = utils::getConfigurationParameterSizeT("OPENCV_IO_MAX_IMAGE_PIXELS", 1 << 30); + uint64_t pixels = (uint64_t) width * height; + if ( pixels > CV_IO_MAX_IMAGE_PIXELS ) + { + throw SkipTestException( cv::format("Test is skipped( pixels(%lu) > CV_IO_MAX_IMAGE_PIXELS(%lu) )", + pixels, CV_IO_MAX_IMAGE_PIXELS ) ); + } + + // If buffer_size >= 1GB * 95%, TIFFReadScanline() is used. + const uint64_t BUFFER_SIZE_LIMIT_FOR_READS_CANLINE = (uint64_t) 1024*1024*1024*95/100; + const bool doReadScanline = ( base_strip_size >= BUFFER_SIZE_LIMIT_FOR_READS_CANLINE ); + + // Update ncn and depth for destination Mat. + switch ( imread_mode ) + { + case IMREAD_UNCHANGED: + break; + case IMREAD_GRAYSCALE: + ncn = 1; + depth = 1; + break; + case IMREAD_GRAYSCALE | IMREAD_ANYDEPTH: + ncn = 1; + break; + case IMREAD_GRAYSCALE | IMREAD_ANYCOLOR: + ncn = (ncn == 1)?1:3; + depth = 1; + break; + case IMREAD_GRAYSCALE | IMREAD_ANYCOLOR | IMREAD_ANYDEPTH: + ncn = (ncn == 1)?1:3; + break; + case IMREAD_COLOR: + ncn = 3; + depth = 1; + break; + case IMREAD_COLOR | IMREAD_ANYDEPTH: + ncn = 3; + break; + case IMREAD_COLOR | IMREAD_ANYCOLOR: + ncn = 3; + depth = 1; + break; + case IMREAD_COLOR | IMREAD_ANYDEPTH | IMREAD_ANYCOLOR: + ncn = 3; + break; + default: + break; + } + + // Memory usage for Destination Mat + const uint64_t memory_usage_cvmat = (uint64_t) width * ncn * depth * height; + + // Memory usage for Work memory in libtiff. + uint64_t memory_usage_tiff = 0; + if ( ( depth == 1 ) && ( !doReadScanline ) ) + { + // TIFFReadRGBA*() request to allocate RGBA(32bit) buffer. + memory_usage_tiff = (uint64_t) + width * + 4 * // ncn = RGBA + 1 * // dst_bpp = 8 bpp + height; + } + else + { + // TIFFReadEncodedStrip() or TIFFReadScanline() request to allocate strip memory. + memory_usage_tiff = base_strip_size; + } + + // Memory usage for Work memory in imgcodec/grfmt_tiff.cpp + const uint64_t memory_usage_work = + ( doReadScanline ) ? base_scanline_size // for TIFFReadScanline() + : base_strip_size; // for TIFFReadRGBA*() or TIFFReadEncodedStrip() + + // Total memory usage. + const uint64_t memory_usage_total = + memory_usage_cvmat + // Destination Mat + memory_usage_tiff + // Work memory in libtiff + memory_usage_work; // Work memory in imgcodecs + + // Output memory usage log. + CV_LOG_DEBUG(NULL, cv::format("OpenCV TIFF-test(line %d):memory usage info : mat(%llu), libtiff(%llu), work(%llu) -> total(%llu)", + __LINE__, memory_usage_cvmat, memory_usage_tiff, memory_usage_work, memory_usage_total) ); + + // Add test tags. + if ( memory_usage_total >= (uint64_t) 6144 * 1024 * 1024 ) + { + applyTestTag( CV_TEST_TAG_MEMORY_14GB, CV_TEST_TAG_VERYLONG ); + } + else if ( memory_usage_total >= (uint64_t) 2048 * 1024 * 1024 ) + { + applyTestTag( CV_TEST_TAG_MEMORY_6GB, CV_TEST_TAG_VERYLONG ); + } + else if ( memory_usage_total >= (uint64_t) 1024 * 1024 * 1024 ) + { + applyTestTag( CV_TEST_TAG_MEMORY_2GB, CV_TEST_TAG_LONG ); + } + else if ( memory_usage_total >= (uint64_t) 512 * 1024 * 1024 ) + { + applyTestTag( CV_TEST_TAG_MEMORY_1GB ); + } + else if ( memory_usage_total >= (uint64_t) 200 * 1024 * 1024 ) + { + applyTestTag( CV_TEST_TAG_MEMORY_512MB ); + } + else + { + // do nothing. + } + } + + // TEST Main + + cv::Mat img; + ASSERT_NO_THROW( img = cv::imread(filename, imread_mode) ); + ASSERT_FALSE(img.empty()); + + /** + * Test marker pixels at each corners. + * + * 0xAn,0x00 ... 0x00, 0xBn + * 0x00,0x00 ... 0x00, 0x00 + * : : : : + * 0x00,0x00 ... 0x00, 0x00 + * 0xCn,0x00 .., 0x00, 0xDn + * + */ + +#define MAKE_FLAG(from_type, to_type) (((uint64_t)from_type << 32 ) | to_type ) + + switch ( MAKE_FLAG(mat_type, img.type() ) ) + { + // GRAY TO GRAY + case MAKE_FLAG(CV_8UC1, CV_8UC1): + case MAKE_FLAG(CV_16UC1, CV_8UC1): + EXPECT_EQ( 0xA0, img.at(0, 0) ); + EXPECT_EQ( 0xB0, img.at(0, img.cols-1) ); + EXPECT_EQ( 0xC0, img.at(img.rows-1, 0) ); + EXPECT_EQ( 0xD0, img.at(img.rows-1, img.cols-1) ); + break; + + // RGB/RGBA TO BGR + case MAKE_FLAG(CV_8UC3, CV_8UC3): + case MAKE_FLAG(CV_8UC4, CV_8UC3): + case MAKE_FLAG(CV_16UC3, CV_8UC3): + case MAKE_FLAG(CV_16UC4, CV_8UC3): + EXPECT_EQ( 0xA2, img.at(0, 0) [0] ); + EXPECT_EQ( 0xA1, img.at(0, 0) [1] ); + EXPECT_EQ( 0xA0, img.at(0, 0) [2] ); + EXPECT_EQ( 0xB2, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xB1, img.at(0, img.cols-1)[1] ); + EXPECT_EQ( 0xB0, img.at(0, img.cols-1)[2] ); + EXPECT_EQ( 0xC2, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xC1, img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( 0xC0, img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( 0xD2, img.at(img.rows-1, img.cols-1)[0] ); + EXPECT_EQ( 0xD1, img.at(img.rows-1, img.cols-1)[1] ); + EXPECT_EQ( 0xD0, img.at(img.rows-1, img.cols-1)[2] ); + break; + + // RGBA TO BGRA + case MAKE_FLAG(CV_8UC4, CV_8UC4): + case MAKE_FLAG(CV_16UC4, CV_8UC4): + EXPECT_EQ( 0xA2, img.at(0, 0) [0] ); + EXPECT_EQ( 0xA1, img.at(0, 0) [1] ); + EXPECT_EQ( 0xA0, img.at(0, 0) [2] ); + EXPECT_EQ( 0xA3, img.at(0, 0) [3] ); + EXPECT_EQ( 0xB2, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xB1, img.at(0, img.cols-1)[1] ); + EXPECT_EQ( 0xB0, img.at(0, img.cols-1)[2] ); + EXPECT_EQ( 0xB3, img.at(0, img.cols-1)[3] ); + EXPECT_EQ( 0xC2, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xC1, img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( 0xC0, img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( 0xC3, img.at(img.rows-1, 0) [3] ); + EXPECT_EQ( 0xD2, img.at(img.rows-1, img.cols-1)[0] ); + EXPECT_EQ( 0xD1, img.at(img.rows-1, img.cols-1)[1] ); + EXPECT_EQ( 0xD0, img.at(img.rows-1, img.cols-1)[2] ); + EXPECT_EQ( 0xD3, img.at(img.rows-1, img.cols-1)[3] ); + break; + + // RGB/RGBA to GRAY + case MAKE_FLAG(CV_8UC3, CV_8UC1): + case MAKE_FLAG(CV_8UC4, CV_8UC1): + case MAKE_FLAG(CV_16UC3, CV_8UC1): + case MAKE_FLAG(CV_16UC4, CV_8UC1): + EXPECT_LE( 0xA0, img.at(0, 0) ); + EXPECT_GE( 0xA2, img.at(0, 0) ); + EXPECT_LE( 0xB0, img.at(0, img.cols-1) ); + EXPECT_GE( 0xB2, img.at(0, img.cols-1) ); + EXPECT_LE( 0xC0, img.at(img.rows-1, 0) ); + EXPECT_GE( 0xC2, img.at(img.rows-1, 0) ); + EXPECT_LE( 0xD0, img.at(img.rows-1, img.cols-1) ); + EXPECT_GE( 0xD2, img.at(img.rows-1, img.cols-1) ); + break; + + // GRAY to BGR + case MAKE_FLAG(CV_8UC1, CV_8UC3): + case MAKE_FLAG(CV_16UC1, CV_8UC3): + EXPECT_EQ( 0xA0, img.at(0, 0) [0] ); + EXPECT_EQ( 0xB0, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xC0, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xD0, img.at(img.rows-1, img.cols-1)[0] ); + // R==G==B + EXPECT_EQ( img.at(0, 0) [0], img.at(0, 0) [1] ); + EXPECT_EQ( img.at(0, 0) [0], img.at(0, 0) [2] ); + EXPECT_EQ( img.at(0, img.cols-1) [0], img.at(0, img.cols-1)[1] ); + EXPECT_EQ( img.at(0, img.cols-1) [0], img.at(0, img.cols-1)[2] ); + EXPECT_EQ( img.at(img.rows-1, 0) [0], img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( img.at(img.rows-1, 0) [0], img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( img.at(img.rows-1, img.cols-1) [0], img.at(img.rows-1, img.cols-1)[1] ); + EXPECT_EQ( img.at(img.rows-1, img.cols-1) [0], img.at(img.rows-1, img.cols-1)[2] ); + break; + + // GRAY TO GRAY + case MAKE_FLAG(CV_16UC1, CV_16UC1): + EXPECT_EQ( 0xA090, img.at(0, 0) ); + EXPECT_EQ( 0xB080, img.at(0, img.cols-1) ); + EXPECT_EQ( 0xC070, img.at(img.rows-1, 0) ); + EXPECT_EQ( 0xD060, img.at(img.rows-1, img.cols-1) ); + break; + + // RGB/RGBA TO BGR + case MAKE_FLAG(CV_16UC3, CV_16UC3): + case MAKE_FLAG(CV_16UC4, CV_16UC3): + EXPECT_EQ( 0xA292, img.at(0, 0) [0] ); + EXPECT_EQ( 0xA191, img.at(0, 0) [1] ); + EXPECT_EQ( 0xA090, img.at(0, 0) [2] ); + EXPECT_EQ( 0xB282, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xB181, img.at(0, img.cols-1)[1] ); + EXPECT_EQ( 0xB080, img.at(0, img.cols-1)[2] ); + EXPECT_EQ( 0xC272, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xC171, img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( 0xC070, img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( 0xD262, img.at(img.rows-1, img.cols-1)[0] ); + EXPECT_EQ( 0xD161, img.at(img.rows-1, img.cols-1)[1] ); + EXPECT_EQ( 0xD060, img.at(img.rows-1, img.cols-1)[2] ); + break; + + // RGBA TO RGBA + case MAKE_FLAG(CV_16UC4, CV_16UC4): + EXPECT_EQ( 0xA292, img.at(0, 0) [0] ); + EXPECT_EQ( 0xA191, img.at(0, 0) [1] ); + EXPECT_EQ( 0xA090, img.at(0, 0) [2] ); + EXPECT_EQ( 0xA393, img.at(0, 0) [3] ); + EXPECT_EQ( 0xB282, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xB181, img.at(0, img.cols-1)[1] ); + EXPECT_EQ( 0xB080, img.at(0, img.cols-1)[2] ); + EXPECT_EQ( 0xB383, img.at(0, img.cols-1)[3] ); + EXPECT_EQ( 0xC272, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xC171, img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( 0xC070, img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( 0xC373, img.at(img.rows-1, 0) [3] ); + EXPECT_EQ( 0xD262, img.at(img.rows-1,img.cols-1) [0] ); + EXPECT_EQ( 0xD161, img.at(img.rows-1,img.cols-1) [1] ); + EXPECT_EQ( 0xD060, img.at(img.rows-1,img.cols-1) [2] ); + EXPECT_EQ( 0xD363, img.at(img.rows-1,img.cols-1) [3] ); + break; + + // RGB/RGBA to GRAY + case MAKE_FLAG(CV_16UC3, CV_16UC1): + case MAKE_FLAG(CV_16UC4, CV_16UC1): + EXPECT_LE( 0xA090, img.at(0, 0) ); + EXPECT_GE( 0xA292, img.at(0, 0) ); + EXPECT_LE( 0xB080, img.at(0, img.cols-1) ); + EXPECT_GE( 0xB282, img.at(0, img.cols-1) ); + EXPECT_LE( 0xC070, img.at(img.rows-1, 0) ); + EXPECT_GE( 0xC272, img.at(img.rows-1, 0) ); + EXPECT_LE( 0xD060, img.at(img.rows-1, img.cols-1) ); + EXPECT_GE( 0xD262, img.at(img.rows-1, img.cols-1) ); + break; + + // GRAY to RGB + case MAKE_FLAG(CV_16UC1, CV_16UC3): + EXPECT_EQ( 0xA090, img.at(0, 0) [0] ); + EXPECT_EQ( 0xB080, img.at(0, img.cols-1)[0] ); + EXPECT_EQ( 0xC070, img.at(img.rows-1, 0) [0] ); + EXPECT_EQ( 0xD060, img.at(img.rows-1, img.cols-1)[0] ); + // R==G==B + EXPECT_EQ( img.at(0, 0) [0], img.at(0, 0) [1] ); + EXPECT_EQ( img.at(0, 0) [0], img.at(0, 0) [2] ); + EXPECT_EQ( img.at(0, img.cols-1) [0], img.at(0, img.cols-1)[1] ); + EXPECT_EQ( img.at(0, img.cols-1) [0], img.at(0, img.cols-1)[2] ); + EXPECT_EQ( img.at(img.rows-1, 0) [0], img.at(img.rows-1, 0) [1] ); + EXPECT_EQ( img.at(img.rows-1, 0) [0], img.at(img.rows-1, 0) [2] ); + EXPECT_EQ( img.at(img.rows-1, img.cols-1) [0], img.at(img.rows-1, img.cols-1)[1] ); + EXPECT_EQ( img.at(img.rows-1, img.cols-1) [0], img.at(img.rows-1, img.cols-1)[2] ); + break; + + // No supported. + // (1) 8bit to 16bit + case MAKE_FLAG(CV_8UC1, CV_16UC1): + case MAKE_FLAG(CV_8UC1, CV_16UC3): + case MAKE_FLAG(CV_8UC1, CV_16UC4): + case MAKE_FLAG(CV_8UC3, CV_16UC1): + case MAKE_FLAG(CV_8UC3, CV_16UC3): + case MAKE_FLAG(CV_8UC3, CV_16UC4): + case MAKE_FLAG(CV_8UC4, CV_16UC1): + case MAKE_FLAG(CV_8UC4, CV_16UC3): + case MAKE_FLAG(CV_8UC4, CV_16UC4): + // (2) GRAY/RGB TO RGBA + case MAKE_FLAG(CV_8UC1, CV_8UC4): + case MAKE_FLAG(CV_8UC3, CV_8UC4): + case MAKE_FLAG(CV_16UC1, CV_8UC4): + case MAKE_FLAG(CV_16UC3, CV_8UC4): + case MAKE_FLAG(CV_16UC1, CV_16UC4): + case MAKE_FLAG(CV_16UC3, CV_16UC4): + default: + FAIL() << cv::format("Unknown test pattern: from = %d ( %d, %d) to = %d ( %d, %d )", + mat_type, (int)CV_MAT_CN(mat_type ), ( CV_MAT_DEPTH(mat_type )==CV_16U)?16:8, + img.type(), (int)CV_MAT_CN(img.type() ), ( CV_MAT_DEPTH(img.type() )==CV_16U)?16:8); + break; + } + +#undef MAKE_FLAG +} + +// Basic Test +const Bufsize_and_Type Imgcodecs_Tiff_decode_Huge_list_basic[] = +{ + make_tuple,ImreadMixModes>( 1073479680ull, make_tuple("CV_8UC1", CV_8UC1), IMREAD_MIX_COLOR ), + make_tuple,ImreadMixModes>( 2147483648ull, make_tuple("CV_16UC4", CV_16UC4), IMREAD_MIX_COLOR ), +}; + +INSTANTIATE_TEST_CASE_P(Imgcodecs_Tiff, Imgcodecs_Tiff_decode_Huge, + testing::ValuesIn( Imgcodecs_Tiff_decode_Huge_list_basic ) +); + +// Full Test + +/** + * Test lists for combination of IMREAD_*. + */ +const ImreadMixModes all_modes_Huge_Full[] = +{ + IMREAD_MIX_UNCHANGED, + IMREAD_MIX_GRAYSCALE, + IMREAD_MIX_GRAYSCALE_ANYDEPTH, + IMREAD_MIX_GRAYSCALE_ANYCOLOR, + IMREAD_MIX_GRAYSCALE_ANYDEPTH_ANYCOLOR, + IMREAD_MIX_COLOR, + IMREAD_MIX_COLOR_ANYDEPTH, + IMREAD_MIX_COLOR_ANYCOLOR, + IMREAD_MIX_COLOR_ANYDEPTH_ANYCOLOR, +}; + +const uint64_t huge_buffer_sizes_decode_Full[] = +{ + 1048576ull, // 1 * 1024 * 1024 + 1073479680ull, // 1024 * 1024 * 1024 - 32768 * 4 * 2 + 1073741824ull, // 1024 * 1024 * 1024 + 2147483648ull, // 2048 * 1024 * 1024 +}; + +const tuple mat_types_Full[] = +{ + make_tuple("CV_8UC1", CV_8UC1), // 8bit GRAY + make_tuple("CV_8UC3", CV_8UC3), // 24bit RGB + make_tuple("CV_8UC4", CV_8UC4), // 32bit RGBA + make_tuple("CV_16UC1", CV_16UC1), // 16bit GRAY + make_tuple("CV_16UC3", CV_16UC3), // 48bit RGB + make_tuple("CV_16UC4", CV_16UC4), // 64bit RGBA +}; + +INSTANTIATE_TEST_CASE_P(DISABLED_Imgcodecs_Tiff_Full, Imgcodecs_Tiff_decode_Huge, + testing::Combine( + testing::ValuesIn(huge_buffer_sizes_decode_Full), + testing::ValuesIn(mat_types_Full), + testing::ValuesIn(all_modes_Huge_Full) + ) +); + + +//================================================================================================== + TEST(Imgcodecs_Tiff, write_read_16bit_big_little_endian) { // see issue #2601 "16-bit Grayscale TIFF Load Failures Due to Buffer Underflow and Endianness" From ab5279f4adc855a3c701fb4d3349c8cb552760a9 Mon Sep 17 00:00:00 2001 From: catree Date: Tue, 20 Sep 2022 13:39:31 +0200 Subject: [PATCH 26/29] Add an image to illustrate camera poses interpolation for the small homography exercise. --- .../features2d/homography/homography.markdown | 8 +++++--- .../homography_camera_poses_interpolation.jpg | Bin 0 -> 80375 bytes 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 doc/tutorials/features2d/homography/images/homography_camera_poses_interpolation.jpg diff --git a/doc/tutorials/features2d/homography/homography.markdown b/doc/tutorials/features2d/homography/homography.markdown index b8c17c0856..c70c313bb8 100644 --- a/doc/tutorials/features2d/homography/homography.markdown +++ b/doc/tutorials/features2d/homography/homography.markdown @@ -412,15 +412,17 @@ homography from camera displacement: The homography matrices are similar. If we compare the image 1 warped using both homography matrices: -![Left: image warped using the homography estimated. Right: using the homography computed from the camera displacement](images/homography_camera_displacement_compare.jpg) +![Left: image warped using the estimated homography. Right: using the homography computed from the camera displacement.](images/homography_camera_displacement_compare.jpg) Visually, it is hard to distinguish a difference between the result image from the homography computed from the camera displacement and the one estimated with @ref cv::findHomography function. #### Exercise -This demo shows you how to compute the homography transformation from two camera poses. Try to perform the same operations, but by computing N inter homography this time. Instead of computing one homography to directly warp the source image to the desired camera viewpoint, perform N warping operations to the see the different transformations operating. +This demo shows you how to compute the homography transformation from two camera poses. Try to perform the same operations, but by computing N inter homography this time. Instead of computing one homography to directly warp the source image to the desired camera viewpoint, perform N warping operations to see the different transformations operating. -You should get something similar to this video: +You should get something similar to the following: + +![The first three images show the source image warped at three different interpolated camera viewpoints. The 4th image shows the "error image" between the warped source image at the final camera viewpoint and the desired image.](images/homography_camera_poses_interpolation.jpg) ### Demo 4: Decompose the homography matrix {#tutorial_homography_Demo4} diff --git a/doc/tutorials/features2d/homography/images/homography_camera_poses_interpolation.jpg b/doc/tutorials/features2d/homography/images/homography_camera_poses_interpolation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..353260c88048f22a9fafd7fd829e24b1f3d81373 GIT binary patch literal 80375 zcmb5VWmFtZy9GM9%itbh26uNK+=9D148bLY5ZrBWcXzjhV1v7RUfdx-2pYM(-*?uz z=l;C4di9^`+G|%;_w(#$clY15zdHbY6$NDl0K#iyM_>m4{%!)~07!_4{~oUm`Sn0S zM?pbGM!`fwLq*5N#Ky+L#KOYCCBVnQ1>$01;gjG435ke_iLvoW$w-LE2#AP@{slom zdL4s|f`Nj9L4<>aL-hZ<{T&1V(GmI)4UrIl07M`H5)k1p96${KARr?lAOQZip#qRm z&=8T(5inl6iT-cTe=qsF0l-E=03hNc;lGYOy#A6*ov0SgLomR?iVKq)RNHbDO2i2V zU@GNIhZ|8CD%^5I`6#l;vM9#riDZE%YQ~^_V0Cc9Xt))P8#ZFg7glWbh96uh}g(@4ySVELbi?A>!NEs?i6wXgZmW5y$9S-uBCW@$x zgwbSYVMh-J3eutP4^lPA?EVY&iYGyx!NMy{O&Q(7ze0>0-p#52gNxu>J97)q!*od{Ol z{JgBvmhgYqa^V}(lsY}H1SJl}O}9;67wy&+54MIdMi@PRsgllOZ%lC&s{TlmX%e>t ze`>iuGKrBh!qI}-5;hGvIYqR4Tb>}P$hhTWpwH7pgs0EEZZad1r#L2>CNdpObT=Xr zusEbBjy^#?)RBELLlddBOB3~Y7NnHe&57?_Kd`gI$HJG3A-!}G3cx{xW8kBVxV?#2 z!Ve69ati^=y7^Vn7-kgm`n{udExiWj!mNYYejti}L%~7VMZc4u)5MX!C3CcO1?gL4R-A~pGin5$FP=>$RB2lT( z!q2a%(Ah)#!86Vxa7fHQjEgcehn$8eHF|KXI%+%&0&aUCwYE44t~?HcHZ&bW!v#BT z>d*#p^i8^STvr0?-X)#V5B$JZR0c~_3R%xtj*-ENrR268tRdRAH^OQ1k-od9 zRDnP6HOzO4P&KKY9Vzo9v9mHUzRY38$Duc>jg@v_v0vBY`g0CcGb5yqvgB&4iQHAp z^m8Dk%MfEVxQu@hL)kceq3skhtB;-#imn%nEV!zi*T_pZYNMC z@63Ddq(a5K#qm?l`#GJsdzz;_IH^ zfQqCTrA{h>3`mz@ccoQRF76kn&Zor>W8%!f*T$fTtva=4Kai^&{1J=jRgY`Lc74%@ zt3eTAH=!e+haL^%$5EoY)^$O_Da-0-pp)Yb>=^(+0%(X~lY^o}r#gdaB1K~CybTB= zmEI|+EorQS-a$ghXpjLSGHOgL#6xWfQFbykTt`N%_+n*Hd7?d8zOg|Bm^weeb6htc z*&+%QRwR=7(loUo0*J#u8Op|qk`4xp&y@yC@7|C;IR@L5tTW-7Fc(v!ds~&2 zPaKHiD77R}6AbCdF#4;7@6(edaD^8qodur-N&@L4P-yOH?pyMbC(Y-^fFG&mBxu%>qELI$U`hy=E@&I@hTTNqH2VI$?N6>MY{C& zr~diUo+qMeG{{FkfYr#d1^M_m#M$hMB-xx^GRx&bT4+W{Osx6bMwP@Vil*tn>4+9@ zt8q)CK$7lR%P~|VIuCaF(5OH>R0qVzors%Qvo2S`+dL2n7rtv}r=xYZ1(plwkOO1G{;F3vkR+ggZ<^kS3QSKG55HG?5<=HTq zd7aSFh%6{IY@e@MmEYfM+z2<042F&o7MY~c^d>l@-&yNeoF+ez6j1)okj_b|AXKhI z*xl^#0ul;e2g}D#@AJkWP2v}0iTmp*Y7lAB_#n){fy)fqT9sE1#D29T36@LIpldVA|6MCnzJ98X09u7*D zN%(a%h|uz4j8p_&kmHAw8EN&D{06Vc!5KH8G%5t5G=nzO3X8Pv|ll@(@dm_DBVqODzh`jMjx7L z#Vms}v2|R++>$VmjA#~&e$k!i!x>z4bo-kT*MoDXQsv>n~s& zzZP$pDP(W%M?{E-qAkdm#i5*33lY8!^rj<2&8(8vhkNh}u@;?((MKW-ba^{5Nqgl< zhw*NJL&E^Hus3Njb9OX*T&?*rp+7{%GDO931e1{nAPq7=^t;dK$$4{1D1b5e$xiq; z*$@VHh0GmM88jvdfZZ55Kt7KoO+*t_zCx84Shl22fC!olr)NNw*U*AEo-p8Gi91RI z4-7rAGP;{;R1fME7`pTTKyFOzafINDsw8C4!oD~KN-@4Tzvz~;1j;yo`@m|=Q41 zzhdm)`znx&J&Uw<3%A28IFZXzLpT(xj}TacD1lJ$QyLqA*!SE+hSh7}6%iexlpjx>-UUT2$VD6FBu?I8#hr8ng49tJ%aTJDov3UfFyv-f6MSsR z+FaHr<3jI~HS-Xl#cf~G=0;cyD{Ta1}ZQp@q z5vN`+11VE+3q^zr!%5K42fe56uCG@d5tX$5M}PrOcEoX%lO0338PrEB_CfuDwg1s& zoO^5NG0okA)-KyYBq150tHJQ9Q5hkR8W?TUb zJOq%8Ws>yUKrRNAqAHnU^iHe`HlbYgGA(o$x``|xM&xnvKs10lf>xv|kRUN3@@Ad} zLV*^}4KYRJp)3@iRje!#mjJdk#led)=Gyq#kqVSR4N5~%F>;?36afX)*XmS3dJ%V~ z$CBxeU^-Hkc^Qnl4L5Q65hQMZDu&UbtTjh_U~VLmr|no0enJ?mnM9Of8fC#cz)8|4 zI+c$KPibgz$Rl}508~2dYEboc%2=_QQs>euT?1$p(LEjZ~~iVPBEXI5kMC-q^($ zI5^#wei{rfzC&IM{0-6=VYkU2-~%=*pexGeD~ON*AXc!tDCC4)r8x$A^g+ihxg2Gr z1@LtqC=xAlz8Wk`0GIiYTEbr_6b=FvAr2Y_W2i#_2c$xYVZ5dEi7Av+{hHKJ0pa)+ zzjay<4^wJR<4S&lO3{Del|<2E%Z?YO=@D9`t*OK867gQEoM^bSI1TJo9;>Ygh?7w& zfY-@PteRtrp1#nbw`1MeBSbPH5l{tFqLklxta1Bw6S((l`^k{F)4}efeLWB?@|E7? zZCGl{0{uuWm!Q0~>fuTR0fcC9M>W(8d{KUI!hz$QzrQ?X3_ZWSI0cUKz_ps;5o7An zNjS)3@t_}*v;ZcZwF9OgKJ`UrlER${2Wfm_&`1&&30(3HmetyKcYLQ470OAlg@#@_ zIK)OzwZ_Xd`8I@U%;V&jr86(LKz2d=*bwjA>qH((0y+^%O7a}M+}G%37_lQmlLF=; z5od~IK=i4$%43xf>v|*XNGGCu>MA?i_-#Ofi zFfn5gOUaN9|JY)N?mAwhFvjeWWdSMd?fEG1;!!JL14Jr0QS$L#MO*(em&KY%Mo?FaT ztAJEGWa+G5q%?J1{V!>JhOmpIgnm2D>iI>2EZy*5 zY@jV+MObD~o^Cfk9l(!{|SV(D%# zM2AEx?5vWhB+W~Kh{Egxlg_LP;udEm*cO8ARGX7n>RJaL{s$31NWo36~wDo%)^?l7u*=)QAcP0KNS9VREV^0wO)%Qb0Kte)5MftD)hm7zV zbpWV9Gy+0=B06GPdJqpU9|;3DzYHl@K#)=TEky3s`a^#;1QAdW-45~byW?x#kgG8= z(E6WozgTFCvN=cfS0iL7wa1Ru@=sJ+Eu~#}zD0vA>bINd$;T+yeY<_vf<=w<{IyOVcyzHS~widyuJZBKE zni1Lk#rEYNJ+TVcJo|y?uW*ltsv{LvjG%1boW?qnz1Q|V zv8S5fL@<}H{D!zW0gk4uz%`U$BYMI~s-`fMXT!pS?ZrH^_)dCz&^w#(`-N zwh(LxlA!!Kk@ahb=&tKe|2SFsG!b{Nd@OeF0ca^dBHPiQoFMC^Nih`4&Hn1!Ewy8? z+6RyEA0`o>>?%5Y8h>>P%9;z{Z`RMP<7umpxaoOW8c*w8z7L>KI=%aVew`2i*9|0q zuYCS2C4M=qrWro`G_pTWN|s;qsyy3u#Ju9yr7TLxTEz65af7uwo>y%tQB1q3_F$>n z(eKC?CqgL{HA9b9wOQMRXLw?dcGOc$BckDn%eFortXED?L=%9GG1D*(MEqvlO7|NZ znv;SkELY-H&9WrMP?>{2u|Yn60UN%*m(|qd?|dbA6%IcQDL>(+WhT`OEn#J)y{n?6 zXtm$e)g%Mu1@d^=w8qVYA$y&jz7uYu_mH_N=+cfd_KQu7b(7Vwa^nLWP`E8oiE- zbg_tvl)VZu6cIlz1)SadB!4vhHXjv8n9Cs-s;^f?jI-tpbsWXBiMTY}>caUFa@NT; zCUtdGs*2$StPR<}Zx8$}+DKbgpU&7ucAiC2m_MqMh;88HasZjF-{_{oqC`ANv?zy`-r0v7;XzqyhlR&F+E z-p3DX4*8XZkCLdmP}p3QrII};-56Z0B{l}tKejvP1vrk+tb7e`jCV5ohpSR0QmOs8 zohIVEz2fjHNey82)0`9O42Q*EA}f+fPZL6k(#Fkz7t|R>S4#uuZEMbtJhM+sO=8C- z(Ytk(`fN^`?_3ue?SjP}m&m&8g`XPosn)E2t?Vpv03tw=Ekz?Qc$6Ck^qS z*7EXz1nzb1^gq`81zZ|ti{A`UJzykB8WHQ6#Uu=*W}{hzyLmc(|7GoSHuN?zPaBr% zRC>CAwM-GyWHy*J)gs8GdrXrpmUvai-u23Q8GoQ*^3mQu~J#AM>&?Mr<_&xlSnT+@~y+&g(qa zD(9k23_llrGxIG;+g|{{gu7;yPgp~V{8d$@hby>z;P4s1(jLenmoT!Gh3qq>Qq>$1 zA*#E7loYv)t1MDly}ND0?!l}+qR3B>|-Lu z)oEO+fMH!;)Hseve7mg(kE^>e2djypq7I?q9G%*xMr=U}|5eHtC#;ycG4ayYG`}7A zdTz~Ib+*b(lg;>5hMqIP>?+lvSF37IE9Pt!{U$?SrG`KX9+TU=a(S|L1#&P4eAC!c zJ3@4?lEceB8ioRe(TJHwy{%Bi+Vw?7Ks|KONMK{V!|cEIu*4PPXeg6!{-zoy@{>V@EE7w3|#t?Wp5b)63(!+oU?Lb3aTJ)+B zDjOCUb@Y>V&^)#C9gRyeU%BvQbMiP=%utl%#GX3j>+6lds%AU#*ve6)P>_|wEZq8KJ$i%y?6$|yOwEGhl<0v zzIa;WK~~d)T9sx^fqoBi?G-C16`(dY%jnm#Ms{eX+5TL~!sr;FT9L6(^uh7n8Mp*y zKs}Ue>euPS_e52lnnaGn3!9n%t`omEpwlnjJWt1N=Nz86BAniiUG|lZuAy*$Y!P4G z-fVWgxVea~$*$C7$&Bwv1tVut(-|{|6!pV*GS_hsUoV zi=s^kC*jUyZOAELL<@Z7^y(#~{t?=UXQ)kX=_{A+vfuj;onZ%bzVA}}*+)ZT+bey* zbsEFR1gVon{gj<8@@`}YTE2oy^B0h&dz|+HR=;*3S?zba$lB*-@wD6Kb5HgW$G4S` zdUDT~lYpvKNo+ZeU~o)kBcuFhRo~m%O>k9CitJRq3$VJ$Y)IY0lvFj-v(S74XO*dXtJbx) z<9CUA@~@SSy`R+$qS5U9wlF%KLsYmOf=T3#!-AtPJ##de=VEx|m$lfIb%n}749s^J zn_I(V13+}{@OkFu^Gh=~Eu+Ng1EWG+zW_C6C{U+3{Xo}9g&kZRAkR{xkVjHg?4!^U zNa$28BwEcYS-M!}9wf=>qx3U0UUd_o%UN!kkiNN2$)|pLIhUnpWyO3goPCby>gxII z3Q=~j9{qiiDa8+!pDnOJ`f@ALK1hmwRqNikDj!@+F9a-><>YX6KkK(ngqNJfg!#0F z{M7f@Kx$2Hus_y?Qrzpl^i_QqtuLEQ@1M4{`$v=4w%8GS` zb3olDU1Jf#&kygS&{Fdx~6H}3WXo*b2hO(+wr4sh%Bx%`~}bX+iaq>GL% zplVTR;&v_2JUO!&^JaW9$B)d-YO8N(qz+Bz=bC=MsM~b+OKVIL4_V>hiGAi~;IZ(|M zY@?U0kWk#^=b^-YVfEhWMp*0VKoh{6kFa;8PANC`bqDJZ6vOt?Szl| z!fy z4;5HW?MMQ@kG`#)b7p6psx5HJO}|UgtUjL?o%zRSZ6UUo4J=J(YSV&b&Z2S~Guq{G z<7P7Ud^POf-pd@vE^7XmSh*r!3$gcqX|-B}XZQ4~yl|u%v&MR?gHta=?II$e&7!2I z?ZazZR{_fInmOt``WY{Y@h0{b@ileyJDUxK!e?P21zm}JN((e=_r3Tz4t5+sq4H0F z)sGYp7OcTl``(R+HLU!M#2ni8NZ1QqF~+?$|7_H?abk2tn-~&qWPKy&OtYqJV7-ZX z6L4AjVwM1|4-VMQ=sJa3{XnSd`qCGVbHVVwyzR< zaN7|}`cCP*sN&ZT|7Dk4k`87W-J{E@VCf!-x5PhHx<58VHQ`m9{T%m5+|}_~J`3ke zY+~&vWtX9ulBeSEH8h%-`XYES^YoGY+2sxX%EN<{o_qVkEUgWA*l7jnEsDAw^_p)6 zk6x67=_;JF$0Jf*cH@-IjVV@C%<#-nX1fM=@_i{|>Y_qDRsGwU!iDrmC!}*t!m6}k z%lm6H|<6{r;xPs;RkPs@}n!%_14AnSHRMn|^~ivv=MugqgN6VC=iH(b{dP zq9wi@u0rqNHxgh1ZAZp$#Np7n9NW(bpHUivoK=p3AwHLkB>bM15c(umCRhgQiT6=; zFNa!jZ{unhO}`gm)xo1r`$)H8&&U^nj2;7Z=i^Dqe90cs?U4*6IzdFfppJW@uc3H% zJ=Qs)!%p;HKe1MD7w}koD@-|AnKTX5yN~J@z_*!_9~?(qpR%>4Ct5&CCT$TSxqowM z*1Pa^A-%OryrxUnx6a4QVVysVLq~tHf_~*FTx_7RUG}7M!3R?F#&NDxfC>SJOMlU_ z8qM+ad>0;bm8w3!K`7Wzz~*t&BjjwXmND7lXk)DK@jY?)(%Y{C%ud?NLd&5w;lBG) z9BJQKBx9aZW{l`Txrp8MR+u&5X{$nw*dA6Z8cE}|7czqp*0+QR=s{fqdA4`YzT>jU z=@}!AKhbP|3(0`-0;;&^IOz$YenF#DNiiF?xa(PNY9X1pr_FmEInVX7wh2K#G?SZ4 zww{tgTIbD%TA7Qn>mC6gE*Rfy(q{hQb1l}55z$M?u60Q?fT>W23HV2>)F1ZbjU5JP zGRU~&f(80hMHXf;)%_lobytQwmSWHJH=$8xlNRPL^q@)t#wyHO)wVCToGaflRxLJB zdhNe=)>7C1L}}ei85wr_@)sagybkY;`5{O)vjs@9tL-M)@$n;Xx6tW1D>xAg`Oxb6 zY%@|@lXI8L(a~pMH$A>;C;d;{>vv*#haY2A>4N#1cN_Pe!jry_9m3Cv{E$|sx+WTX-$@`rVu`a}NBgVRBAyPC;m=0v!rt1{ zxHtX_5J3r{uQ$UI6xHr=!YronPD{mTUQS+_S|@aGF`tMP(TK_U^0q7g9aD=+6kPo+ zQNN^XOFeziPs63^w#3`JC=WLA1S<3IJc2ya1rsJDMpw(mcYZG(4=n;>Tk%HajpW66 z|I8p)TW~}`6~JC&SXDpg;@a2l%nuF0(Dvu-aF>j>gT-V_{JndX+Qq7^Re_%>E^s{Cy+cTju}=?e*X@eFpt}f8_=Hjd$7hO7Uc&f{p)J$~#=j#!2#cWVPqe6S9p@-B5h z@T{3%d11bwx4L=A!a6jJ&9QVq_?a69o_x6v`=}Gd0XNVuA2v9>d5s{UOs~eGH6|z7D36W6%4c=UJh3)Y^&X%45Q&GI+x67a*^4NlgUlUPV*= z%tA{CX7X`5e4?gbF}yrOMkP^TyBcF1SzNo?wjpbXrvCs!mFsRpujSx%##X7)STSvE zpR27e<1d+Ixp@hF>N0COOG=wK0W*&?yOh~J>)AdUHZQhh_)EJaQQuw;Nec>(i|u7; z*fVV@pSFDZn6}B0fZh6&YSXU|T2a?1IigcBBGhe(5-E?i+i6m6h)}T22-|895t-yM z6)!fbWLn{ldaq9+r!LjK!2(qaF|PB?c5?i+e%O+{8=IzFbw6%luB8aoWDFmprxS*@ zu$4Oqul`;Ml-!y1R9w@X5pp=Q1byg^9aF7LC`*g8$Eyk8JyXVnmX)1q#k=TdUaJ6HR>7#r@GY3Aj}R;cXIZE>P_UZ(5E)1<{=Ak0su%dR3Ke9pIaxqM-H8o97(vZf;HtDeKv zyXpCj{`~u6dMcuwG*5EJkt#R@JL7QNmhY%GmQeW&cdm1#?=L_iKm*C^NoUW-s-Vs( z!@1$kJ2HlqLdW`HQ9#P)2d;Rdis#b}4euoQYD8g=o+&)urIfbO^ND!A`EjM4hjg_t zKkDUsC(u(q*_i30Pnlq1CMGVg%{>DK%uo?TYZ3mkCMz(d(##N?%`mbkv|$cYo3 zHh|gMgs9Q+`nR;v`C*!$l3~I-EUl|ID8uzO^4~u2d9M-tS-q${raFaA zvZ*$tBj0C%lB8Mb{wyuc(_a5PPy`x@j+|tD|2#u~EY9U=&FRPJl{q>7&%DhxW$0!d zWI!lHX}}?P>;RR(Y?}kRXDt07s(%gcZDiy^PVudkED)_r?HskRA`3D2C*O?jgUvXn zIYY8%8L9Zf%#|ePqzuxF@>7kqXBL%hwqSnEP(!o~M-;txXGX^g4)VK&sF{(m(Y0EN z@y$lvi#Yyjn59jdqd=-5_2C|F2k+7c-&_Bi>hcCnXDP&d?5g#RRTYR9sIJ7NtSMu- zWu-^p66)`KKSHO<_tH!%awsz6VV3{&{`dEvAlSSxN7KA6N1Mpa4fZ?EFZ`DoUuEo= zQ39QXytI-+#0wmLM1N^?7SSRsyqTR9adzwFx@0F2-*8IJ zRjHFWl5+atYACb%UNiK2VuXu%UxYSe?iYW|!xIl26V|GUKAv?=J##Z2s5RH5#mzd( zspNsiZK!dKAJ?Ljhk$S)u!hP0qqow5f89G($NA%CVJyK%`_&876p7e^ETtTE9MxJ* ztfqR3zkn))TCNoA>pj`*OPGhW%T0UqvOAZlyXIkNBPfJ&LE*k{Rh7D2VS+F$5@dlq zLtiomS#3Bk&3J@mBiL?*$bbd+-gQJQrD^nQd~|Pk;!2EUbVap>MzYGc7t&xfQRtIP zlrl;Zl!&Bi&^FO_Dw6WyblVM#e-N9j?F=e@n{}yO&Ew*M z*bW`r{R@coDRi!mL-pq&iz)Qs4hvKvFHi)R9{W#*juNhHaG?}7L=-BTFlEkv(M9ZR4Xu_c65;*;Dg(y;;ITBQ|=4Y~;(45l!!c z<4y$z{muBx8D868>|Dwe)j~5gmed|w4IYXtn1I)2D^7iM)tvRv z;CTF4WNDUn7Ws|@J!lM}A(T(nT}J_^eTV>=gV{70lkHJjLUWcYuTKcx!P~LFnk7G^ z?5EHHTf^PmZQcPHRGT**>lF(u0*Ipbk+g!^O`jwyO&CdW0#mTVvD3l?GQZ{7jz1a} zzHy0n2z1f;vaQQupf{4s!5Lfdt>t!5sj>;PrPUy%=guBcjNsg-sj(&OeOFe-$0O5^ z8=2%{w;@;0_msa={=8TJ3&0!k;Skxo`SI|In9ov=d;JCA`msNscvN0LRx`Kl!$EQ(T|c2o z_sKty*`wd_OlyKl6Fd@J7{)-(0|&k)^kW!09f%z?qh>38a0l`c--F9vZ)8l4G~;8c z9!U6ijNQ+%T6nQ*+W152>Ai$%qiW_uWh)*tN;*bW+C#-PP=0O^q?Y{k;|T!Z2Ft zq;gOHdle1*E}`oFWthf$RKPm*8+Mn72XjGxgq%$FpejF!j%muGtAhEP5sy>eAiNST zEMyjt4RO7}*wcJ+J1;+EWZx{hTO624C0iv-@)>tn-PUx2@Si1<2;*t{jx`Y<)@Za` zhYka6lN|L)Y4YyZ@BL2FXG~wsiWIl<*+McR(I3DEg`-9yn`iu1=v8)5Elul3iiot6?Y`bxB^YD1H?(~ZC(%Sz< zdX3^Sn|+Fg%(O2OD}CZ5cgOE@F2ncqsq`Cu!D^<#*weVUA@LM2ApS3ad3{8!Fy!1! z3UheEn1JgIZZN+Z$f%AO?sPJ+zf^XuuFiceVg^awZoPhDN+CX(c1TWGd1lhnOc!bH9wr<#;XJF;$ET`go0_^(<{7J-m<`J-P~!N|dl~zQsW@|1HP7~+*0WXLhR?_} z-!#QxaYXY2P7bscFX^U%lNl-9GIe^=z6?hO7bv8gN-h3sf4v(77{%?v;rg^JV@1m~3?~NL~8=^ZXZZ znCbDv-)Ii|e=VFzi<8B3ZGeUl@=|Ic<3_Fst0>aN*dY9z7~S8GA4^;ZiTf|6ABvP|LYOCZs)E`D5lx z<08{_c4y@u2(P=E#*x_f9Mcs^K_b(xr|OYE#X2EUBhP(Lej*Eke*rApW}C9dcIn}9 zI_HbL1#By8<)h@{SzmgU(rgp+G@%$2GWT=S6^p^S!V?_Ps+&|8*Wg5B$Iz=-PUDTr z$8+%ROsj?j>hE^Vluuru-|e%10s11sjTV!IU$Ttv<1MhLOP)C76Y1fN;wmQT8WK#u z3!8}&BUQXM9n5R;Oq4I<75#(?!zQ8J%RH?z9t4WGO~@oZFKmR`agQs<%vHg?b$_rb zAcbDtq0Ya1mVW3cmQ9+Ow={G5*V3)WwRJ&P-OlF|vefK)2Sb zN6mj>5TGuRwMcsF>ZQ|Hc1Cn>j*^qZXj&d7)Lod&Qf5Z+vJ|(_ms_A})DEkx~{@mz2q9_&Pnw z<@^D_18=K(J`}nT+rHkBC(qI9TWj0j?i>nd)2_ky{^#8y>;1V&F5cZ)9L@r3b=Y5k zP9t|vnJF>XvxQpspNvJ@-*PP#nZNZq4{)HaThu89I6>7xyiVZ26`&}g1V4o%$2Szi z^vMGKPVsN17aD#PNr70jH?&{Hq%9L@4G)Z{&De_Rcf3ROCko{nc;)^vF{JvLf%B~E zVkf#!5!qkDmnov?*X7H!cO1i4u%%3h{wB@PVZiicB0%;qhJ-}TX4KZ{QE!ADWqD0r zq*q=5z2kC(??!T^+BSr$g$qHgdF{tmZ_Py$FcpIm{87S~{c>ripyx13x_gQ7!Q_vT z?A5c4q^#-k>zg^hz>C+&p2Vr!*)zE?{>KD+A$xz>@6_a~B`+GB>YCK@uvk8=sMJ#G z>6wici#amQ3W@EZy1Y`YSwYpP-+2&{oka=SU>t)3>*5VB}BFGDQ? zx`{~WEO zGOiU)Nr<}eBk|^1xz3Nw61ymi8ZkI&F#^S0pIOk_K_`IWe}gybw;L3a#Pkr_}tPyu6MS{(k`));4CBt=o($!};I7LB{mz zZMPFW@P98W6Oy@PQwJv|O9~r+=Xm2syQUArzNSk3mU1(0xkrm;(_>fkvC^7}02PEv zYd2M$=kK(NInqG?V72Nl&-<9Z8fQVSh+pEWMl(bdQ+p_9b4-^$T~z&A-yZp#uKvCC zY8-rNg>}Sb?MIUTyPNJR@B`O3zsgr(1yOCf$PoM?`Zj|Ru0D^O7<*Yp>4nV^(P+@l z4%V;irmA;j9Y3z_F3tT1i42r(#6{rTF|Y5^{DidT79XuB#K>r&iwjm zMDx$Lk@M?!sQDx~Px;I5i>3O^FI=t{j-$^$YadAX#Ae!!^qFZHe=9QQW9>K>+h46{ zJC8hRUn>1n<7+6Sts&|EY)j<%P5H1hl0Qhq%TmMY?$qIG;?EjdbIi}5>GSum|1$pb zUG?O7srlVku+m=ubhh?_-Eo!I`6v&)w97FC{gnntg$pNbW2 z?ta*$M-PIpTz2-fDn1-AGbX3-8tLT%k+?rI^wFpQfj*yU9S7`Zjekj55~5TjZI(dSrzVL_8Emm+wJ<%M6=VyAi~dVZRc zRIMu|MTjJPv?#ZYAQWrhe2xcO7n-J z^H{lhO8tcG4Zd3!L`jbZRO)H_gD2&^VU`rG`4&TO(@tN!VqA#-K7H7@*?yeSyut@6 zko|Y_Q6+~vXUqqL0Vyxtu8k@=0)z1bKfHk7=t}HIrI8gFBT;KKuaQ-VsIJ!5Mqx>p ze662AjnKTnG)_a}aT=1t<9ky4N0DI6%fYI@L-4>7y@GK0?@_~K^+={^j#(4)DMLt`( zFIx}}wxt=1aXHiu#OnAcShx8@)8_R#2o$1A4=kJy)r&a=a*jmtt)PEVhmRFhsb$o) zM{c@N$XvFk+v$4t>RJ@h-yS3ugCmCUSC0sKt!tit!4(^EM>wStUy6VEQ)UH zp`bT4_$T%xE3eCelBZNRg~%;CsMI6SrY%2OiMu{I`&PM-udjIF%{Q+PrY6Qy0&(1R zsN6t(VPZHf$Yfn2Wl2}DHmptGcwCpT66G&oDwm+1#drD<9v)Tw#GSh;vZdIwXlDcaYyS;Q!RzxjDLae!_fM-Fzt-Zjz^ZE^$s^%`@(8P8N{>~ za`mRbl(p_r<;&$P>7ZL7ZCpe{wYeci{T|2B+bW-hhvkBi6unxDctI8tg5r-~hpUKz zkw(M}@*)mcbB`q<;a5Wqn_kkA*KkkTsfBdKs>& zEo`bpPIa^z6&{ZtIo=Eq!01|jfhTb(gnA0bGByijJ-Bn8yx`NGO1Di(yS*iwRRyM% z9iN$K&#Ykl3=hi>#_^~F%KW;^LhUxLDUSRj+MjzZ*lRbArLMkv!Y2y+%`XCe^#;in z)y8|wlgFk0nf=MCd{`?+Kh8y;#MDC%^;$mv3#eX**t6$U`=_^eGlPF4D4QCWQfP@} zW^?9=ArZB|z%U^LVlx^4evgwVnpYWjf%zMoe0A2sPN}nvB9(sDLHozZMh7DA49{}| zF$c{Y9e(P1S^Zy@#1q`5gS@IKb}gH73{Fv^gfhYB8-h~?xC4T(z=D7ury=nvZ`cizo*ObcA%{u zKRn)BsOjsU&R90lR7N!)VqL&M6E!NGxZPYGT~CUrQt`UVG1e#Xs0nahHk|`$BLL(* zdX!>fzXCRXtjeq`N{8m1k@B30y@RaO9B&72(zlH(+^((r7~kW5kpoI^E8!<9J$t0yM)zMtstkt0G2XAQKYJO;iD`1AC^LdxpcwF(8{&VopoV2 z^3%W=tJku)0%@CN?ZB<#kke6G@^+E9D*drqmO?OXJ@wPriP#Bv{Il07uoPX zsN>&e;hPV)YPzt6z{a2Io_V<7ny4n-V^~UC!jqw7MRm8@5p33|m3ocVrG^2@lDInjxF(i2n_wAo+h#75@XI`1U`p^hbn++!Jio|IZaq|L+yLFR`9J zn%$q_JpT_D=Q;MH>;3T?7RfWxS7a=L3eR5(=>xsVSrrXFG7E!z(!SJvXA`jXjZB}U z5K%HLSr?U$$~e`lN8=c6`bC%aZu}opJdWJc^4F4q^J9sBzg*6b-v3GYdOH>%dvkb? zafJTE>IVoE?}(mr{2ik{y$R3{)Kq{KL3X`1GKoO<39yyyG9Ri+*?e0f{ZNW zXPS!zTmD9e8@F3^!ny(+A3}ssuUn;74wi3S{f6#lGlc(~S8uZ0Na4u*x&MP${CNI( zahnOny~FVUyyse0NB-e%;aD-3$y^RO>Izuu_J%jlQsZ3p3@^1}G_Nq(+c&9BB5}VZ z@_1SU`$i*BI^m$2k=(bKM{P)#KTE3Um-)y|;gA&=BGj1wPR6)@|5hMwcW$?o*^AI~ z3DMhFW)1k9Ju^GOG^2#R>ozWRU)^sUy3@2sueQgH+ZRRbM9wrs^TAP2D@Plp;!htu zm;^`G6}$z_EE-t$AzKk!ta3bh$oMa;!f|8n+`c59qSZsCo^QGTMBOV{EI9LGT>8~y z<@jT~_Gh1aG*v5~|C&2(t=4I(7>@dJ7v1-bZ!lr2w7U!N+G13{QIliV1=Ff-a_y=I zXtcHZI%C~req`Q?vB@?70%@9B2C|+YgHK@Dg!{0oVA{pu7`nkq)NsT4a?`Vtedjs` zGWMZw9l+OeA4@4&*b{E^F_D=ySW-U~J+m=S^K$NGJKf^9X>8dj;5Cv9fo~z<8PR>9 zxGD2{)-N+mi%kki&^NEtO$2DFiewC_Ji+=y4H-l5(Et8nJ+YV+`U~x0N^@xeq_}Jd z2PV$=f8Pq}ttp$+RdvjL@R1Lidzj)ER9t8soSSOlNYrIVn#CsCtixFG^m`oK0b17F zFK(|rWG9tpHwTnXdLu~Yzp%9A>r_2+Z51J0Gq|YX4C#GqP~=y85t%F#7hPKK@;laW z)bPd>FP^{g$_d2mo%p@wMaKC)K{TA`nMvuzCylGi$7VjFpIut)QV^i!f6eG;n@KB9 zZyb}dzkU-{84Rv7Fj3PavriL#8QO>}Hj}M4-tJT8m~E}tE$?llPS#t5Q?{?Ryf=$G zT@eStKAWc+tOl}H8@ zBmuE_JTqP<8kLQ0>cVzdw>6;!!>u=4XXA%MY9CaQ!j}^(XJM9S92tOP!HK!KmSmsc z>hO%o)?jeu&hC&vdNEqyNGJ7&eX^GWr6`i90>6~RMcFeqDR|87m0St%%81CZr^+_{ zI+^LOWBeIHL_%PbIKlFW72l>8iSH28;niYaxgqtYUPm+o=a*_G1u!#?bvCoh&ice3 zxXf<^~z`d445#0*RE1**aMd^f#TK=5wOXweI$AI?C1qE!ivc^M09?5_~#1h@A3mKM&tT9 zZOUdnf4gkLY@bG_`XNl4*%u8u{86;OWtR?9nv=Ya;du<2q)8n{Icl#LK=xL4Em8s- zrCh<{?E6OU0(B=EYndTzr*ER2N>|QcSuee*<-%0pJDNO1lfxDM*$^cT^{@RYz-0yG zK(rx0`plz5l946J2Sz7@cw0A+^sy;9RP!c2ymFrr7iqvXQtjN%X}KDsAcQuw-L`s7 z6%uY0#&A2{X3<6{dGgjr^TBQaq1?~VOvKS6()7mwKrQMNRAn zcfm;HY~56wYH_}W@vT^wlJVFW!?~qEs(x^N^@QGm`u0EXJ1Y;_oF=?y^f{l6T)0fJ zzCu%EWC9)9EcP7ZLE~AO{c5FsrhS4}SP=#^1B!HxiOr1xkUZr? z0^l)`EtSFXc*glCjRKrmJHchvOk7NrazquQzfItCt+PW1<`gcdiXe&uF9E@mA(crP zj!RF?X+aQMp;v`q%!jt?`D!wGFkmBgg6ZYkai2LpwQV!3gbt3rt@o;(ZQTzon#*qA zrH&Cs*R*|dYJGcT>NUB0U)R)3&>v!SK;g7#0Svx}J^sm9B_JkhQyb2 z$|2(^@r)NV+6>7V^5AoQ39y@|hYqjadkad|bPAG!-lfD&>YQ>WW#nvRZ`3y`)|&sw zEq|=LNPIHWSA@0-X#5gi`WQvQ6L4efJSU_0*K}?K$Y$^)=bSASZKl{0) z;=+Ixs#}oOY6#pYQhn{Ae5K8&a(LRDo83BXm(85e!sDhUQz@p&V=8p5?cQ`W! zo4k4%G&?a632e$!DsQ_sWcy(t?+@6V%|EOXJR_b$)4qchsY(_?hLC`OR^O$VRxszp zN8UZsn+}q5hXnSm^G8keBc>Nn7tpX=1VJdPs!#Z+kn^Wlh!WNIlUkQPUUr=pPC7Xke;-#Y0g+455~bEXQt zZyd{>dX0zs^5E$`?9&ianOx{UERB^Hc*Gw*yR{CP#Oi;(o;2l+N!j(jbrpe*uly-A zv659H4%SwW%LBx!Ex#FWH>n&@;-B?4J#g*#i}~I8LN3snMd@%rn^H!-%ZeHvWKuP# zA@ibV)6^q%k6tS&+5dy1C0f<%wzTU&`9E z1F&+nEYG$L+?oS!t(deiVn9iBBLD9h>SK$vJcaC*Z_p^jSTbyykv3DQ5r=-|e#?=P;u z40U{#Q+|fwh8OdOK!L`sx&n_0Ua>SsjOw%hSQDN{CcgUcKA0A4qs*J11pJ3pP7tA{ zVjwXAPv|OLGh??3me}AtYWcFw0u>FZqe4LXdXPLx-ezA`8D?XKzl0f_GEyACux{a1 zC9M*QDdE~K*9oh-L{gncQjXbdb@O_C{M>++EZ0yY?r%)?z>!~lIQ@mSRzn?t{||C zP@@A|8<%_4muzY~>%G9Q3kcewO*->B2^~n^*j{o0?Hu+vbPbmadh0w(#1Ph89x0d8 zmz*@G8uXh}O|J*66kpj;h2rUards#Mc>@)fwQ;b!qwvRxg`gk0Kl5@t*T}QAhYQQ; zxr@_w+ZlN)n`{k(P5)QJs33|3*G7vpWi;oa4Z!5L(*}x{h{xB)b3AQ5KpXZ!<(Koz z6w{?P^!`Y^Wjz!%vP1#tX6I266C3LI;qPi{mQNfkG174OWy@V%mQjI6`+J;G4noPJ zax!dl#gLtwC?O_KYd$8FX)eo&!4A?YR8$((o9bOpB)6ToxIt4Vp(6e5GA@(n+WA>p zi@%5=r=N_Hp>C8v>ivo9mu_9`c^G`7$|UKa31*<<-kpe{{wf)eA$)TTBL8hF(JhUCg|;)?zd3iz(_qgvvbH zeNGoziS}aO^SF3q6_NL?3skiy^=ahO(fxs{%;6j^HOMd8GqhSXa&F0$Yj#lI?Sg=r z>0X`%w3f1RJk&K$?z2mo#Zj_p{5!fL)kUh}>oK0D!he6TLM(o8SY z@MoN>a*Xw9e6IM#c#JqjqIx=>^@!c!6_mlJ-qGKuueh-s^;+CT(Qs`%P0ZYd=KCzM zllX1q5m-pTe^^2iHmNqyhB-w8A z8uv@#CW?RBDttdYCFMnZzee;6Y>!0V-3|W}2og|C%%-}>tBMz}QlHqjp3y-2aZbR? z^YFVAIN8$F)oqx4>cQP}JeRmWtmx(!B&UVBg@XBETx;Tik5$v4VS_dEeqroLpTHOS~w;s1z{<(P9q9N}LzD-meic&LIlr7t72bySONa}6v z!R}{Mjt5^@F)>&LfAvpMnEKRP=KKOs^f_AO8vG8p;bCMaZ~vXF^tRid>9dW;z@jS7 z`Im$Q3PG{XG>)fWu0bUea=Pveq6%oWKFA^4E(Y6WX{Ht^_$IQqvfD@069PPKjbaPq zNLWpBKM&?|jKWEh!3DJfRv!c7C6cRi<-sj1pQ{*^Zx5(QPseh=u56%vrxtmBAWf*zk&dC1Vm|rIVoiGNrM9G`!f%30bbOBv`Hkfeae)Q z#XjlEHV7{U;(ZPsRNN zVCqFeOhe?-sG%R>(57rdk|-axyyID`*C?dE`R0f0xTw!0aPV;6rg0vgJoB;}vJpF-Df-c{Xw4hRI@x#1Ni(VutoKII08g7_X@&ErfJ-C2Q$dO3cTbgNn-S zzxCb}+r&D1n`>kv9^9nBq?+mWw$XlPBP6kwpdw!6iEZ}EKdcwlA1y30+siYkjTGE} z|JwJ15-U4f%nrTkE?i~MmZg6ZPp{ggY-$f&Q(mr5QUM&1g{brootv9MGh<2Rmx%~3 zvS35`WJIj9s$}3xO2PgZr7Z9IWVcg^3Gc8HOyOjJ$FiKT3ohT)`mD@;QSG4HsxdYD z;-|!Hf;x6~QL)x4AwRIQq!r`xEIS8jBu@=*_#{p{7g&r%%~$zQv=S%R8-Ims+RrFQ zpL_ucU?coo>LyVTh?+-Q#isKk$^eqxc@GRh-COlxD@wM>dD1?_<-oc^=JOD6UE~=~ z>27PkEGb^=M+ck5rhOiXG_fmQ76&Ta>QX?bmj@9XKwL7dUjAzPdPWd-NCGorco0nh zOFJsLF0by)Jyf{cS@XV^n72b^-Lng~Acx>hJQ`M8q z0_~o#KAxE?Wa))e`zSoz<4jST+v*d}JR>22;R#HMQN~r(Y>0c&QGp{;JLV)d}Y zD;TIpIkP1IjtZ;M=$iOU@^0<9+Wp;sSgT0m9GvsY>{3f0wrcJyxf$f|PwMzr1%Z%h zd62+aFIYSV$Cg+EA1?@s5`T+y%Y^I|HN2;0pF zUSngYkCMd1Sp@lyr4nxG$n~2ySR7Iuu#bkO*8{!&7XN+Z7de4se+_bezGsC5r?e48 z9l^hgo;t?dD#of^-ER)U&9kYKy{4Yz=6H$n9QHHnXA*mzl-OfZ>!$SoPVtB@k=Zu^ zVHdD|&<1pj?!icZrWDFNW1YmRlwpz?jF-)XEhfY+S#;BmVg1gkKrcPP^+3TVM{tw` zSoL?e^jD4T<8!7vMk7Sjlhe?qezi-5bFe59I%O_2VE^KmcTjVZeTF{Ny?qzII#3|3KUtMd_TaB^ovA=yw^$R_ zA2qr?ULGs@9ZJMQEs8&T9HE?IbbV>F_~kBS^Ser5F`%kKPBc!lm=OZ95t#!YdUx9{dX#vyu_KP zzS!m7x}d)1IkF1|(StqDQga7yF1URgpj=A=n!)X~(ss_;d2K-ya0i!aiT#6cK2=V0nA@)%28bk2-02 zif)0Sw}C7-MR>Lj*Utrf^R03_Ck7&pshr`n!#N1yW`&WC4dOPS%aey2 zUROJaizcEpUO?aYUH$fJE)DZA~%|AQ%0Ahx^jShx+jzem9h*r>|{2By? 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

#a#`=$nq+YU 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𝔐`b}7Zd28mWie=(@66*>BjkCHWH^Rf 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 literal 0 HcmV?d00001 From d480e2e51b3c89b6ce3750ed03663295be190227 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 5 Oct 2022 21:51:39 +0300 Subject: [PATCH 27/29] cmake(opt): force separate targets for dispatched code - PCH may not pass compilation flags properly --- cmake/OpenCVCompilerOptimizations.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/OpenCVCompilerOptimizations.cmake b/cmake/OpenCVCompilerOptimizations.cmake index 1e0e812afc..598389bd34 100644 --- a/cmake/OpenCVCompilerOptimizations.cmake +++ b/cmake/OpenCVCompilerOptimizations.cmake @@ -680,7 +680,7 @@ macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME T if(fname_LOWER MATCHES "\\.${OPT_LOWER}\\.cpp$") #message("${fname} BASELINE-${OPT}") set(__opt_found 1) - list(APPEND __result "${fname}") + list(APPEND __result_${OPT} "${fname}") break() endif() endforeach() @@ -714,7 +714,7 @@ macro(ocv_compiler_optimization_process_sources SOURCES_VAR_NAME LIBS_VAR_NAME T endif() endforeach() - foreach(OPT ${CPU_DISPATCH_FINAL}) + foreach(OPT ${CPU_BASELINE_FINAL} ${CPU_DISPATCH_FINAL}) if(__result_${OPT}) #message("${OPT}: ${__result_${OPT}}") if(CMAKE_GENERATOR MATCHES "^Visual" From a565aa6db9a0a21066e41ffd8a8cd9b5f0805dbd Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 13 Oct 2022 20:40:56 +0000 Subject: [PATCH 28/29] docs: prefer # for links generation - avoid `@ref` - align with 4.x branch (minimize merge conflicts) --- modules/calib3d/include/opencv2/calib3d.hpp | 65 ++++++++++----------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/modules/calib3d/include/opencv2/calib3d.hpp b/modules/calib3d/include/opencv2/calib3d.hpp index e13d488018..3e6ab372b0 100644 --- a/modules/calib3d/include/opencv2/calib3d.hpp +++ b/modules/calib3d/include/opencv2/calib3d.hpp @@ -642,7 +642,7 @@ CV_EXPORTS Mat findHomography( InputArray srcPoints, InputArray dstPoints, @param Qz Optional output 3x3 rotation matrix around z-axis. The function computes a RQ decomposition using the given rotations. This function is used in -@ref decomposeProjectionMatrix to decompose the left 3x3 submatrix of a projection matrix into a camera +#decomposeProjectionMatrix to decompose the left 3x3 submatrix of a projection matrix into a camera and a rotation matrix. It optionally returns three rotation matrices, one for each axis, and the three Euler angles in @@ -676,7 +676,7 @@ be used in OpenGL. Note, there is always more than one sequence of rotations abo principal axes that results in the same orientation of an object, e.g. see @cite Slabaugh . Returned tree rotation matrices and corresponding three Euler angles are only one of the possible solutions. -The function is based on @ref RQDecomp3x3 . +The function is based on #RQDecomp3x3 . */ CV_EXPORTS_W void decomposeProjectionMatrix( InputArray projMatrix, OutputArray cameraMatrix, OutputArray rotMatrix, OutputArray transVect, @@ -696,7 +696,7 @@ CV_EXPORTS_W void decomposeProjectionMatrix( InputArray projMatrix, OutputArray The function computes partial derivatives of the elements of the matrix product \f$A*B\f$ with regard to the elements of each of the two input matrices. The function is used to compute the Jacobian -matrices in @ref stereoCalibrate but can also be used in any other similar optimization function. +matrices in #stereoCalibrate but can also be used in any other similar optimization function. */ CV_EXPORTS_W void matMulDeriv( InputArray A, InputArray B, OutputArray dABdA, OutputArray dABdB ); @@ -722,10 +722,10 @@ The functions compute: \f[\begin{array}{l} \texttt{rvec3} = \mathrm{rodrigues} ^{-1} \left ( \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \mathrm{rodrigues} ( \texttt{rvec1} ) \right ) \\ \texttt{tvec3} = \mathrm{rodrigues} ( \texttt{rvec2} ) \cdot \texttt{tvec1} + \texttt{tvec2} \end{array} ,\f] where \f$\mathrm{rodrigues}\f$ denotes a rotation vector to a rotation matrix transformation, and -\f$\mathrm{rodrigues}^{-1}\f$ denotes the inverse transformation. See @ref Rodrigues for details. +\f$\mathrm{rodrigues}^{-1}\f$ denotes the inverse transformation. See #Rodrigues for details. Also, the functions can compute the derivatives of the output vectors with regards to the input -vectors (see @ref matMulDeriv ). The functions are used inside @ref stereoCalibrate but can also be used in +vectors (see #matMulDeriv ). The functions are used inside #stereoCalibrate but can also be used in your own code where Levenberg-Marquardt or another gradient-based solver is used to optimize a function that contains a matrix multiplication. */ @@ -1103,7 +1103,7 @@ CV_EXPORTS_W Mat initCameraMatrix2D( InputArrayOfArrays objectPoints, @param flags Various operation flags that can be zero or a combination of the following values: - @ref CALIB_CB_ADAPTIVE_THRESH Use adaptive thresholding to convert the image to black and white, rather than a fixed threshold level (computed from the average image brightness). -- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with @ref equalizeHist before +- @ref CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with #equalizeHist before applying fixed or adaptive thresholding. - @ref CALIB_CB_FILTER_QUADS Use additional criteria (like contour area, perimeter, square-like shape) to filter out false quads extracted at the contour retrieval stage. @@ -1117,7 +1117,7 @@ are found and they are placed in a certain order (row by row, left to right in e Otherwise, if the function fails to find all the corners or reorder them, it returns 0. For example, a regular chessboard has 8 x 8 squares and 7 x 7 internal corners, that is, points where the black squares touch each other. The detected coordinates are approximate, and to determine their positions -more accurately, the function calls @ref cornerSubPix. You also may use the function @ref cornerSubPix with +more accurately, the function calls #cornerSubPix. You also may use the function #cornerSubPix with different parameters if returned coordinates are not accurate enough. Sample usage of detecting and drawing chessboard corners: : @@ -1154,9 +1154,9 @@ CV_EXPORTS_W bool find4QuadCornerSubpix( InputArray img, InputOutputArray corner @param image Destination image. It must be an 8-bit color image. @param patternSize Number of inner corners per a chessboard row and column (patternSize = cv::Size(points_per_row,points_per_column)). -@param corners Array of detected corners, the output of @ref findChessboardCorners. +@param corners Array of detected corners, the output of #findChessboardCorners. @param patternWasFound Parameter indicating whether the complete board was found or not. The -return value of @ref findChessboardCorners should be passed here. +return value of #findChessboardCorners should be passed here. The function draws individual chessboard corners detected either as red circles if the board was not found, or as colored corners connected with lines if the board was found. @@ -1542,7 +1542,7 @@ Besides the stereo-related information, the function can also perform a full cal the two cameras. However, due to the high dimensionality of the parameter space and noise in the input data, the function can diverge from the correct solution. If the intrinsic parameters can be estimated with high accuracy for each of the cameras individually (for example, using -@ref calibrateCamera ), you are recommended to do so and then pass @ref CALIB_FIX_INTRINSIC flag to the +#calibrateCamera ), you are recommended to do so and then pass @ref CALIB_FIX_INTRINSIC flag to the function along with the computed intrinsic parameters. Otherwise, if all the parameters are estimated at once, it makes sense to restrict some parameters, for example, pass @ref CALIB_SAME_FOCAL_LENGTH and @ref CALIB_ZERO_TANGENT_DIST flags, which is usually a @@ -1608,7 +1608,7 @@ pixels from the original images from the cameras are retained in the rectified i image pixels are lost). Any intermediate value yields an intermediate result between those two extreme cases. @param newImageSize New image resolution after rectification. The same size should be passed to -@ref initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) +#initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) is passed (default), it is set to the original imageSize . Setting it to a larger value can help you preserve details in the original image, especially when there is a big radial distortion. @param validPixROI1 Optional output rectangles inside the rectified images where all the pixels @@ -1620,7 +1620,7 @@ are valid. If alpha=0 , the ROIs cover the whole images. Otherwise, they are lik The function computes the rotation matrices for each camera that (virtually) make both camera image planes the same plane. Consequently, this makes all the epipolar lines parallel and thus simplifies -the dense stereo correspondence problem. The function takes the matrices computed by @ref stereoCalibrate +the dense stereo correspondence problem. The function takes the matrices computed by #stereoCalibrate as input. As output, it provides two rotation matrices and also two projection matrices in the new coordinates. The function distinguishes the following two cases: @@ -1678,7 +1678,7 @@ coordinates. The function distinguishes the following two cases: @ref CALIB_ZERO_DISPARITY is set. As you can see, the first three columns of P1 and P2 will effectively be the new "rectified" camera -matrices. The matrices, together with R1 and R2 , can then be passed to @ref initUndistortRectifyMap to +matrices. The matrices, together with R1 and R2 , can then be passed to #initUndistortRectifyMap to initialize the rectification map for each camera. See below the screenshot from the stereo_calib.cpp sample. Some red horizontal lines pass through @@ -1701,9 +1701,9 @@ CV_EXPORTS_W void stereoRectify( InputArray cameraMatrix1, InputArray distCoeffs @param points1 Array of feature points in the first image. @param points2 The corresponding points in the second image. The same formats as in -@ref findFundamentalMat are supported. +#findFundamentalMat are supported. @param F Input fundamental matrix. It can be computed from the same set of point pairs using -@ref findFundamentalMat . +#findFundamentalMat . @param imgSize Size of the image. @param H1 Output rectification homography matrix for the first image. @param H2 Output rectification homography matrix for the second image. @@ -1714,7 +1714,7 @@ are rejected prior to computing the homographies. Otherwise, all the points are The function computes the rectification transformations without knowing intrinsic parameters of the cameras and their relative position in the space, which explains the suffix "uncalibrated". Another -related difference from @ref stereoRectify is that the function outputs not the rectification +related difference from #stereoRectify is that the function outputs not the rectification transformations in the object (3D) space, but the planar perspective transformations encoded by the homography matrices H1 and H2 . The function implements the algorithm @cite Hartley99 . @@ -1723,8 +1723,8 @@ homography matrices H1 and H2 . The function implements the algorithm @cite Hart depends on the epipolar geometry. Therefore, if the camera lenses have a significant distortion, it would be better to correct it before computing the fundamental matrix and calling this function. For example, distortion coefficients can be estimated for each head of stereo camera - separately by using @ref calibrateCamera . Then, the images can be corrected using @ref undistort , or - just the point coordinates can be corrected with @ref undistortPoints . + separately by using #calibrateCamera . Then, the images can be corrected using #undistort , or + just the point coordinates can be corrected with #undistortPoints . */ CV_EXPORTS_W bool stereoRectifyUncalibrated( InputArray points1, InputArray points2, InputArray F, Size imgSize, @@ -1752,10 +1752,10 @@ assumed. @param imageSize Original image size. @param alpha Free scaling parameter between 0 (when all the pixels in the undistorted image are valid) and 1 (when all the source image pixels are retained in the undistorted image). See -@ref stereoRectify for details. +#stereoRectify for details. @param newImgSize Image size after rectification. By default, it is set to imageSize . @param validPixROI Optional output rectangle that outlines all-good-pixels region in the -undistorted image. See roi1, roi2 description in @ref stereoRectify . +undistorted image. See roi1, roi2 description in #stereoRectify . @param centerPrincipalPoint Optional flag that indicates whether in the new camera intrinsic matrix the principal point should be at the image center or not. By default, the principal point is chosen to best fit a subset of the source image (determined by alpha) to the corrected image. @@ -1767,7 +1767,7 @@ image pixels if there is valuable information in the corners alpha=1 , or get so When alpha\>0 , the undistorted result is likely to have some black pixels corresponding to "virtual" pixels outside of the captured distorted image. The original camera intrinsic matrix, distortion coefficients, the computed new camera intrinsic matrix, and newImageSize should be passed to -@ref initUndistortRectifyMap to produce the maps for @ref remap . +#initUndistortRectifyMap to produce the maps for #remap . */ CV_EXPORTS_W Mat getOptimalNewCameraMatrix( InputArray cameraMatrix, InputArray distCoeffs, Size imageSize, double alpha, Size newImgSize = Size(), @@ -1934,7 +1934,7 @@ CV_EXPORTS_W void convertPointsFromHomogeneous( InputArray src, OutputArray dst @param dst Output vector of 2D, 3D, or 4D points. The function converts 2D or 3D points from/to homogeneous coordinates by calling either -@ref convertPointsToHomogeneous or @ref convertPointsFromHomogeneous. +#convertPointsToHomogeneous or #convertPointsFromHomogeneous. @note The function is obsolete. Use one of the previous two functions instead. */ @@ -1971,9 +1971,9 @@ the found fundamental matrix. Normally just one matrix is found. But in case of algorithm, the function may return up to 3 solutions ( \f$9 \times 3\f$ matrix that stores all 3 matrices sequentially). -The calculated fundamental matrix may be passed further to @ref computeCorrespondEpilines that finds the +The calculated fundamental matrix may be passed further to #computeCorrespondEpilines that finds the epipolar lines corresponding to the specified points. It can also be passed to -@ref stereoRectifyUncalibrated to compute the rectification transformation. : +#stereoRectifyUncalibrated to compute the rectification transformation. : @code // Example. Estimation of fundamental matrix using the RANSAC algorithm int point_count = 100; @@ -2037,7 +2037,7 @@ This function estimates essential matrix based on the five-point algorithm solve where \f$E\f$ is an essential matrix, \f$p_1\f$ and \f$p_2\f$ are corresponding points in the first and the second images, respectively. The result of this function may be passed further to -@ref decomposeEssentialMat or @ref recoverPose to recover the relative pose between cameras. +#decomposeEssentialMat or #recoverPose to recover the relative pose between cameras. */ CV_EXPORTS_W Mat findEssentialMat( InputArray points1, InputArray points2, InputArray cameraMatrix, int method, @@ -2234,14 +2234,14 @@ CV_EXPORTS_W int recoverPose( InputArray E, InputArray points1, InputArray point @param points Input points. \f$N \times 1\f$ or \f$1 \times N\f$ matrix of type CV_32FC2 or vector\ . @param whichImage Index of the image (1 or 2) that contains the points . -@param F Fundamental matrix that can be estimated using @ref findFundamentalMat or @ref stereoRectify . +@param F Fundamental matrix that can be estimated using #findFundamentalMat or #stereoRectify . @param lines Output vector of the epipolar lines corresponding to the points in the other image. Each line \f$ax + by + c=0\f$ is encoded by 3 numbers \f$(a, b, c)\f$ . For every point in one of the two images of a stereo pair, the function finds the equation of the corresponding epipolar line in the other image. -From the fundamental matrix definition (see @ref findFundamentalMat ), line \f$l^{(2)}_i\f$ in the second +From the fundamental matrix definition (see #findFundamentalMat ), line \f$l^{(2)}_i\f$ in the second image for the point \f$p^{(1)}_i\f$ in the first image (when whichImage=1 ) is computed as: \f[l^{(2)}_i = F p^{(1)}_i\f] @@ -2598,11 +2598,10 @@ CV_EXPORTS_W int decomposeHomographyMat(InputArray H, @param beforePoints Vector of (rectified) visible reference points before the homography is applied @param afterPoints Vector of (rectified) visible reference points after the homography is applied @param possibleSolutions Vector of int indices representing the viable solution set after filtering -@param pointsMask optional Mat/Vector of 8u type representing the mask for the inliers as given by the -@ref findHomography function +@param pointsMask optional Mat/Vector of 8u type representing the mask for the inliers as given by the #findHomography function -This function is intended to filter the output of the @ref decomposeHomographyMat based on additional -information as described in @cite Malis2007 . The summary of the method: the @ref decomposeHomographyMat function +This function is intended to filter the output of the #decomposeHomographyMat based on additional +information as described in @cite Malis2007 . The summary of the method: the #decomposeHomographyMat function returns 2 unique solutions and their "opposites" for a total of 4 solutions. If we have access to the sets of points visible in the camera frame before and after the homography transformation is applied, we can determine which are the true potential solutions and which are the opposites by verifying which @@ -2992,14 +2991,14 @@ optimization. It stays at the center or at a different location specified when @ camera. @param P2 Output 3x4 projection matrix in the new (rectified) coordinate systems for the second camera. - @param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see @ref reprojectImageTo3D ). + @param Q Output \f$4 \times 4\f$ disparity-to-depth mapping matrix (see #reprojectImageTo3D ). @param flags Operation flags that may be zero or @ref fisheye::CALIB_ZERO_DISPARITY . If the flag is set, the function makes the principal points of each camera have the same pixel coordinates in the rectified views. And if the flag is not set, the function may still shift the images in the horizontal or vertical direction (depending on the orientation of epipolar lines) to maximize the useful image area. @param newImageSize New image resolution after rectification. The same size should be passed to - @ref initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) + #initUndistortRectifyMap (see the stereo_calib.cpp sample in OpenCV samples directory). When (0,0) is passed (default), it is set to the original imageSize . Setting it to larger value can help you preserve details in the original image, especially when there is a big radial distortion. @param balance Sets the new focal length in range between the min focal length and the max focal From 085fb78e85a4cf44ee2f6f3afc6d60c23296703d Mon Sep 17 00:00:00 2001 From: Hyunggi Chang Date: Sun, 9 Oct 2022 21:58:09 +0900 Subject: [PATCH 29/29] fix typo (portatibility -> portability) --- modules/core/include/opencv2/core/cvdef.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/cvdef.h b/modules/core/include/opencv2/core/cvdef.h index 9102316968..f1ea80c06c 100644 --- a/modules/core/include/opencv2/core/cvdef.h +++ b/modules/core/include/opencv2/core/cvdef.h @@ -723,7 +723,7 @@ Cv64suf; -// Integer types portatibility +// Integer types portability #ifdef OPENCV_STDINT_HEADER #include OPENCV_STDINT_HEADER #elif defined(__cplusplus)