From a8cd06d5df8afb40a43f29fc219eb0a4e3b2a5f7 Mon Sep 17 00:00:00 2001 From: David Schwer Date: Tue, 10 Dec 2024 10:47:45 +0100 Subject: [PATCH 1/5] style: remove sporadic usage of cv:: inside the function --- modules/ximgproc/src/radon_transform.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ximgproc/src/radon_transform.cpp b/modules/ximgproc/src/radon_transform.cpp index 5e23edda5aa..3b40a98c549 100644 --- a/modules/ximgproc/src/radon_transform.cpp +++ b/modules/ximgproc/src/radon_transform.cpp @@ -23,7 +23,7 @@ namespace cv {namespace ximgproc { _col_num = cvRound((end_angle - start_angle) / theta); transpose(_srcMat, _srcMat); Mat _masked_src; - cv::Point _center; + Point _center; if (_srcMat.type() == CV_32FC1 || _srcMat.type() == CV_64FC1) { _out_mat_type = CV_64FC1; @@ -35,7 +35,7 @@ namespace cv {namespace ximgproc { if (crop) { // crop the source into square _row_num = min(_srcMat.rows, _srcMat.cols); - cv::Rect _crop_ROI( + Rect _crop_ROI( _srcMat.cols / 2 - _row_num / 2, _srcMat.rows / 2 - _row_num / 2, _row_num, _row_num); @@ -64,11 +64,11 @@ namespace cv {namespace ximgproc { for (int _col = 0; _col < _col_num; _col++) { // rotate the source by _t _t = (start_angle + _col * theta); - cv::Mat _r_matrix = cv::getRotationMatrix2D(_center, _t, 1); - cv::warpAffine(_masked_src, _rotated_src, _r_matrix, _masked_src.size()); + Mat _r_matrix = getRotationMatrix2D(_center, _t, 1); + warpAffine(_masked_src, _rotated_src, _r_matrix, _masked_src.size()); Mat _col_mat = _radon.col(_col); // make projection - cv::reduce(_rotated_src, _col_mat, 1, REDUCE_SUM, _out_mat_type); + reduce(_rotated_src, _col_mat, 1, REDUCE_SUM, _out_mat_type); } if (norm) { From 56397c15af0069ba6ba8434f4dc44c5fdb843098 Mon Sep 17 00:00:00 2001 From: David Schwer Date: Tue, 26 Nov 2024 16:22:17 +0100 Subject: [PATCH 2/5] fix: move rotation center to produce correct results By using Point2f we can set the rotation center correctly in the center of the image instead of slightly offset --- modules/ximgproc/src/radon_transform.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ximgproc/src/radon_transform.cpp b/modules/ximgproc/src/radon_transform.cpp index 3b40a98c549..47e9ebf7acf 100644 --- a/modules/ximgproc/src/radon_transform.cpp +++ b/modules/ximgproc/src/radon_transform.cpp @@ -23,7 +23,7 @@ namespace cv {namespace ximgproc { _col_num = cvRound((end_angle - start_angle) / theta); transpose(_srcMat, _srcMat); Mat _masked_src; - Point _center; + Point2f _center; if (_srcMat.type() == CV_32FC1 || _srcMat.type() == CV_64FC1) { _out_mat_type = CV_64FC1; @@ -42,7 +42,7 @@ namespace cv {namespace ximgproc { _srcMat = _srcMat(_crop_ROI); // crop the source into circle Mat _mask(_srcMat.size(), CV_8UC1, Scalar(0)); - _center = Point(_srcMat.cols / 2, _srcMat.rows / 2); + _center = Point2f(_srcMat.cols / 2.f - 0.5f, _srcMat.rows / 2.f - 0.5f); circle(_mask, _center, _srcMat.cols / 2, Scalar(255), FILLED); _srcMat.copyTo(_masked_src, _mask); } @@ -50,7 +50,7 @@ namespace cv {namespace ximgproc { // avoid cropping corner when rotating _row_num = cvCeil(sqrt(_srcMat.rows * _srcMat.rows + _srcMat.cols * _srcMat.cols)); _masked_src = Mat(Size(_row_num, _row_num), _srcMat.type(), Scalar(0)); - _center = Point(_masked_src.cols / 2, _masked_src.rows / 2); + _center = Point2f(_masked_src.cols / 2.f - 0.5f, _masked_src.rows / 2.f - 0.5f); _srcMat.copyTo(_masked_src(Rect( (_row_num - _srcMat.cols) / 2, (_row_num - _srcMat.rows) / 2, From 75ac4bfdf4dc45ac279b6ba1aef52e624f277d60 Mon Sep 17 00:00:00 2001 From: David Schwer Date: Tue, 26 Nov 2024 16:33:41 +0100 Subject: [PATCH 3/5] fix: Center circle correctly in the middle of the mask square We use a shift of 1 to move the center to a non integer coordinate. Since shift of 1 means we will half the center vector and the diameter, we have to double them in the circle definition We added the LINE_8 default value, to add the shift value --- modules/ximgproc/src/radon_transform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ximgproc/src/radon_transform.cpp b/modules/ximgproc/src/radon_transform.cpp index 47e9ebf7acf..fde37104886 100644 --- a/modules/ximgproc/src/radon_transform.cpp +++ b/modules/ximgproc/src/radon_transform.cpp @@ -43,7 +43,7 @@ namespace cv {namespace ximgproc { // crop the source into circle Mat _mask(_srcMat.size(), CV_8UC1, Scalar(0)); _center = Point2f(_srcMat.cols / 2.f - 0.5f, _srcMat.rows / 2.f - 0.5f); - circle(_mask, _center, _srcMat.cols / 2, Scalar(255), FILLED); + circle(_mask, _center * 2, _srcMat.cols, Scalar(255), FILLED, LINE_8, 1); _srcMat.copyTo(_masked_src, _mask); } else { From 9c1f91ed957e06e54c9ae51c0394e4f0c4294bda Mon Sep 17 00:00:00 2001 From: David Schwer Date: Thu, 12 Dec 2024 14:51:48 +0100 Subject: [PATCH 4/5] fix: translate center of source into center of big square mask --- modules/ximgproc/src/radon_transform.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ximgproc/src/radon_transform.cpp b/modules/ximgproc/src/radon_transform.cpp index fde37104886..3739f72ff0c 100644 --- a/modules/ximgproc/src/radon_transform.cpp +++ b/modules/ximgproc/src/radon_transform.cpp @@ -51,10 +51,10 @@ namespace cv {namespace ximgproc { _row_num = cvCeil(sqrt(_srcMat.rows * _srcMat.rows + _srcMat.cols * _srcMat.cols)); _masked_src = Mat(Size(_row_num, _row_num), _srcMat.type(), Scalar(0)); _center = Point2f(_masked_src.cols / 2.f - 0.5f, _masked_src.rows / 2.f - 0.5f); - _srcMat.copyTo(_masked_src(Rect( - (_row_num - _srcMat.cols) / 2, - (_row_num - _srcMat.rows) / 2, - _srcMat.cols, _srcMat.rows))); + Point2f _srcCenter = Point2f(_srcMat.cols / 2.f - 0.5f, _srcMat.rows / 2.f - 0.5f); + Point2f _offset = _center - _srcCenter; + Mat _t_matrix = (Mat1f(2, 3) << 1, 0, _offset.x, 0, 1, _offset.y); + warpAffine(_srcMat, _masked_src, _t_matrix, _masked_src.size()); } double _t; From 96c9563e1d6dd19ecc86da6b24235e63c981d683 Mon Sep 17 00:00:00 2001 From: David Schwer Date: Thu, 12 Dec 2024 14:57:09 +0100 Subject: [PATCH 5/5] fix: translate center of source into center of square to crop --- modules/ximgproc/src/radon_transform.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/ximgproc/src/radon_transform.cpp b/modules/ximgproc/src/radon_transform.cpp index 3739f72ff0c..643441fb913 100644 --- a/modules/ximgproc/src/radon_transform.cpp +++ b/modules/ximgproc/src/radon_transform.cpp @@ -35,16 +35,16 @@ namespace cv {namespace ximgproc { if (crop) { // crop the source into square _row_num = min(_srcMat.rows, _srcMat.cols); - Rect _crop_ROI( - _srcMat.cols / 2 - _row_num / 2, - _srcMat.rows / 2 - _row_num / 2, - _row_num, _row_num); - _srcMat = _srcMat(_crop_ROI); + Point2f _srcCenter = Point2f(_srcMat.cols / 2.f - 0.5f, _srcMat.rows / 2.f - 0.5f); + Mat _squared_src = Mat(Size(_row_num, _row_num), _srcMat.type(), Scalar(0)); + _center = Point2f(_squared_src.cols / 2.f - 0.5f, _squared_src.rows / 2.f - 0.5f); + Point2f _offset = _center - _srcCenter; + Mat _t_matrix = (Mat1f(2, 3) << 1, 0, _offset.x, 0, 1, _offset.y); + warpAffine(_srcMat, _squared_src, _t_matrix, _squared_src.size()); // crop the source into circle - Mat _mask(_srcMat.size(), CV_8UC1, Scalar(0)); - _center = Point2f(_srcMat.cols / 2.f - 0.5f, _srcMat.rows / 2.f - 0.5f); + Mat _mask(_squared_src.size(), CV_8UC1, Scalar(0)); circle(_mask, _center * 2, _srcMat.cols, Scalar(255), FILLED, LINE_8, 1); - _srcMat.copyTo(_masked_src, _mask); + _squared_src.copyTo(_masked_src, _mask); } else { // avoid cropping corner when rotating