python: attempts to fix 3d mat parsing problem for dnn#25810
python: attempts to fix 3d mat parsing problem for dnn#25810asmorkalov merged 4 commits intoopencv:4.xfrom
Conversation
|
@fengyuentau should work for DNN as the most popular case, but what about other functions, e.g. contrib? There is no way to define the same behaviour there. |
Could you give an example on functions in contrib? I think, if we extract the filter |
|
@fengyuentau, thank you! I'd suggest to add another function/method parameter attribute e.g. |
Discussed and decided to use |
|
Done refactor with |
|
@fengyuentau Please add/modify python tests to cover the feature. |
opencv-alalek
left a comment
There was a problem hiding this comment.
Output arrays should be handled too.
E.g. forward(OutputArrayOfArrays
|
There is dedicated header which is used to test binding generator features: https://github.com/opencv/opencv/blob/4.x/modules/core/include/opencv2/core/bindings_utils.hpp |
Specifically speaking for numpy, there is no multi-channel numpy array. So there is no need to mark output. |
|
There is ability to pass pre-allocated arrays via such API. So shapes of these arrays should be properly passed to C++ code. |
This comment was marked as outdated.
This comment was marked as outdated.
@opencv-alalek I updated code according to your comment. This introduce a convention:
Before this commit, the first dimension of a pre-allocated |
|
@opencv-alalek could you take a look again? |
…d_mat_in_dnn python: attempts to fix 3d mat parsing problem for dnn opencv#25810 Fixes opencv#25762 opencv#23242 Relates opencv#25763 opencv#19091 Although `cv.Mat` has already been introduced to workaround this problem, people do not know it and it kind of leads to confusion with `numpy.array`. This patch adds a "switch" to turn off the auto multichannel feature when the API is from cv::dnn::Net (more specifically, `setInput`) and the parameter is of type `Mat`. This patch only leads to changes of three places in `pyopencv_generated_types_content.h`: ```.diff static PyObject* pyopencv_cv_dnn_dnn_Net_setInput(PyObject* self, PyObject* py_args, PyObject* kw) { ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) && + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) && ... } // I guess we also need to change this as one-channel blob is expected for param static PyObject* pyopencv_cv_dnn_dnn_Net_setParam(PyObject* self, PyObject* py_args, PyObject* kw) { ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) ) + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) ) ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) ) + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) ) ... } ``` Others are unchanged, e.g. `dnn_SegmentationModel` and stuff like that. ### 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 - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake
Fixes #25762 #23242
Relates #25763 #19091
Although
cv.Mathas already been introduced to workaround this problem, people do not know it and it kind of leads to confusion withnumpy.array. This patch adds a "switch" to turn off the auto multichannel feature when the API is from cv::dnn::Net (more specifically,setInput) and the parameter is of typeMat. This patch only leads to changes of three places inpyopencv_generated_types_content.h:static PyObject* pyopencv_cv_dnn_dnn_Net_setInput(PyObject* self, PyObject* py_args, PyObject* kw) { ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) && + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) && ... } // I guess we also need to change this as one-channel blob is expected for param static PyObject* pyopencv_cv_dnn_dnn_Net_setParam(PyObject* self, PyObject* py_args, PyObject* kw) { ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) ) + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) ) ... - pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 0)) ) + pyopencv_to_safe(pyobj_blob, blob, ArgInfo("blob", 8)) ) ... }Others are unchanged, e.g.
dnn_SegmentationModeland stuff like that.Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
Patch to opencv_extra has the same branch name.