| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
Merge pull request #30287 from Nikhi00718:fix/dnn-blob-rect-no-resize-5.x dnn: fix blobRectsToImageRects when the image is not resized (5.x) - #30287 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work. 5.x port of #30243, as requested there. Related: #30042. - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable. Accuracy test added; no test data needed. - [ ] The feature is well documented and sample code can be built with the project CMake. Not applicable to this bug fix. ### Problem Port of #30243 to 5.x. `Image2BlobParams::blobRectToImageRect()` and `blobRectsToImageRects()` are identical on 5.x and have the same bug: - When `Image2BlobParams::size` equals the image size, every output rect is `Rect(0, 0, 0, 0)`, in all three padding modes. - When `size` is empty (the default, which `blobFromImageWithParams()` treats as "keep the image size"), the mapping divides by zero and returns `INT_MIN` coordinates. ```python import cv2 as cv p = cv.dnn.Image2BlobParams() p.size = (640, 640) p.paddingmode = cv.dnn.DNN_PMODE_LETTERBOX print(p.blobRectToImageRect((10, 20, 30, 40), (640, 640))) # (0, 0, 0, 0), expected (10, 20, 30, 40) p.size = (0, 0) print(p.blobRectToImageRect((10, 20, 30, 40), (640, 480))) # (-2147483648, -2147483648, -2147483648, -2147483648), expected (10, 20, 30, 40) ``` ### Change Same change as #30243, cherry-picked without conflicts. `blobRectsToImageRects()` now follows the same two rules as `blobFromImagesWithParams()` on 5.x: an empty `size` means the image size, and when the sizes match the input rects are returned unchanged. The resize, crop-center and letterbox mappings are unchanged. It also includes the Doxygen `@note` on both functions requested in the #30243 review. The new `blobRectToImageRect.no_resize` test covers both cases for all three padding modes, and checks that the blob built with the same parameters is pixel-identical to the image. #30042 contains an equivalent pass-through for the equal-size case as part of a larger Model API change. This PR is the standalone fix, including the empty-size case. If #30042 lands first, the conflict should be limited to `blobRectsToImageRects()`. ### Testing Built `opencv_test_dnn` and the Python bindings from this branch (base 5.x `6dc5ff5c1f`) on Ubuntu 26.04 (WSL2), GCC 15.2, Ninja, `BUILD_LIST=dnn,python3,ts`. - `opencv_test_dnn --gtest_filter=blobRectToImageRect*`: 4 passed. With only the `dnn_utils.cpp` change reverted, the new `blobRectToImageRect.no_resize` fails in all six mode/size combinations (`[0 x 0 from (0, 0)]` for equal sizes, `INT_MIN` for empty size). - `opencv_test_dnn --gtest_filter='blob*:*Image2Blob*:*imagesFromBlob*'`: 11 passed. - `modules/dnn/misc/python/test/test_dnn.py`: 8 passed, 2 skipped; 6 failed only because their opencv_extra files are not present locally (`dnn/googlenet_0.png`, `dnn/street.png`, ...). - The Python reproducer above prints `(10, 20, 30, 40)` for both cases with this branch (`5.1.0-dev`). - No compiler warnings in the build; `git diff --check` clean. - Full `opencv_test_dnn` was not run (needs opencv_extra test data). | 1 天前 |