diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index c03e3a1c345f..97ddcf357b85 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -2808,9 +2808,6 @@ void cvGetOptimalNewCameraMatrix( const CvMat* cameraMatrix, const CvMat* distCo (double)((inner.y - cy0)*s + cy), (double)(inner.width*s), (double)(inner.height*s)); - cv::Rect r(cvCeil(inner.x), cvCeil(inner.y), cvFloor(inner.width), cvFloor(inner.height)); - r &= cv::Rect(0, 0, newImgSize.width, newImgSize.height); - *validPixROI = cvRect(r); } } else @@ -2840,11 +2837,39 @@ void cvGetOptimalNewCameraMatrix( const CvMat* cameraMatrix, const CvMat* distCo if( validPixROI ) { icvGetRectangles( cameraMatrix, distCoeffs, 0, &matM, imgSize, inner, outer ); - cv::Rect r = inner; - r &= cv::Rect(0, 0, newImgSize.width, newImgSize.height); - *validPixROI = cvRect(r); } } + if( validPixROI ) + { + // This tolerance defines how incomplete a pixel can be to still be considered complete. + // It has been chosen to get Calib3d_GetOptimalNewCameraMatrixNoDistortion.accuracy to pass. + constexpr double kTolerance = 1e-12; + Point p1, p2; + if( std::abs(inner.x-cvRound(inner.x))get_rng(); matrix_type = types[INPUT][0] = types[INPUT][1] = types[OUTPUT][0] = types[REF_OUTPUT][0] = cvtest::randInt(rng)%2 ? CV_64F : CV_32F; + types[OUTPUT][1] = types[REF_OUTPUT][1] = CV_32S; sizes[INPUT][0] = sizes[OUTPUT][0] = sizes[REF_OUTPUT][0] = cvSize(3,3); + sizes[OUTPUT][1] = sizes[REF_OUTPUT][1] = Size(4,1); sizes[INPUT][1] = cvSize(1,4); } @@ -240,7 +245,7 @@ int CV_GetOptimalNewCameraMatrixNoDistortionTest::prepare_test_case(int test_cas void CV_GetOptimalNewCameraMatrixNoDistortionTest::run_func() { - new_camera_mat = cv::getOptimalNewCameraMatrix(camera_mat, distortion_coeffs, img_size, alpha, img_size, NULL, center_principal_point); + new_camera_mat = cv::getOptimalNewCameraMatrix(camera_mat, distortion_coeffs, img_size, alpha, img_size, &validPixROI, center_principal_point); } void CV_GetOptimalNewCameraMatrixNoDistortionTest::prepare_to_validation(int /*test_case_idx*/) @@ -248,9 +253,13 @@ void CV_GetOptimalNewCameraMatrixNoDistortionTest::prepare_to_validation(int /*t const Mat& src = test_mat[INPUT][0]; Mat& dst = test_mat[REF_OUTPUT][0]; cvtest::copy(src, dst); + Mat& ref_validPixROI = test_mat[REF_OUTPUT][1]; + cvtest::copy(cv::Mat(cv::Vec4i(0, 0, img_size.width, img_size.height)), ref_validPixROI); Mat& output = test_mat[OUTPUT][0]; cvtest::convert(new_camera_mat, output, output.type()); + Mat& output_validPixROI = test_mat[OUTPUT][1]; + cvtest::copy(cv::Mat(cv::Vec4i(validPixROI.x, validPixROI.y, validPixROI.width, validPixROI.height)), output_validPixROI); } //--------- pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy