diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index 40a0d96169..30c84f46b9 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -396,6 +396,24 @@ bool pyopencv_to(PyObject* o, Mat& m, const char* name) return pyopencv_to(o, m, ArgInfo(name, 0)); } +template +bool pyopencv_to(PyObject* o, Matx<_Tp, m, n>& mx, const ArgInfo info) +{ + Mat tmp; + if (!pyopencv_to(o, tmp, info)) { + return false; + } + + tmp.copyTo(mx); + return true; +} + +template +bool pyopencv_to(PyObject* o, Matx<_Tp, m, n>& mx, const char* name) +{ + return pyopencv_to(o, mx, ArgInfo(name, 0)); +} + template bool pyopencv_to(PyObject *o, Ptr& p, const char *name) { @@ -683,18 +701,17 @@ PyObject* pyopencv_from(const UMat& m) { return o; } -template<> -bool pyopencv_to(PyObject *o, Scalar& s, const char *name) +static bool pyopencv_to(PyObject *o, Scalar& s, const ArgInfo info) { if(!o || o == Py_None) return true; if (PySequence_Check(o)) { - PyObject *fi = PySequence_Fast(o, name); + PyObject *fi = PySequence_Fast(o, info.name); if (fi == NULL) return false; if (4 < PySequence_Fast_GET_SIZE(fi)) { - failmsg("Scalar value for argument '%s' is longer than 4", name); + failmsg("Scalar value for argument '%s' is longer than 4", info.name); return false; } for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) { @@ -702,7 +719,7 @@ bool pyopencv_to(PyObject *o, Scalar& s, const char *name) if (PyFloat_Check(item) || PyInt_Check(item)) { s[(int)i] = PyFloat_AsDouble(item); } else { - failmsg("Scalar value for argument '%s' is not numeric", name); + failmsg("Scalar value for argument '%s' is not numeric", info.name); return false; } } @@ -711,13 +728,19 @@ bool pyopencv_to(PyObject *o, Scalar& s, const char *name) if (PyFloat_Check(o) || PyInt_Check(o)) { s[0] = PyFloat_AsDouble(o); } else { - failmsg("Scalar value for argument '%s' is not numeric", name); + failmsg("Scalar value for argument '%s' is not numeric", info.name); return false; } } return true; } +template<> +bool pyopencv_to(PyObject *o, Scalar& s, const char *name) +{ + return pyopencv_to(o, s, ArgInfo(name, 0)); +} + template<> PyObject* pyopencv_from(const Scalar& src) { @@ -1024,13 +1047,139 @@ PyObject* pyopencv_from(const Point3f& p) return Py_BuildValue("(ddd)", p.x, p.y, p.z); } +static bool pyopencv_to(PyObject* obj, Vec4d& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "dddd", &v[0], &v[1], &v[2], &v[3]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec4d& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec4f& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "ffff", &v[0], &v[1], &v[2], &v[3]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec4f& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec4i& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "iiii", &v[0], &v[1], &v[2], &v[3]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec4i& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec3d& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0; +} template<> bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name) { - (void)name; - if(!obj) + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec3f& v, ArgInfo info) +{ + (void)info; + if (!obj) return true; - return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0; + return PyArg_ParseTuple(obj, "fff", &v[0], &v[1], &v[2]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec3f& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec3i& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "iii", &v[0], &v[1], &v[2]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec3i& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec2d& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "dd", &v[0], &v[1]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec2d& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec2f& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "ff", &v[0], &v[1]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec2f& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +static bool pyopencv_to(PyObject* obj, Vec2i& v, ArgInfo info) +{ + (void)info; + if (!obj) + return true; + return PyArg_ParseTuple(obj, "ii", &v[0], &v[1]) > 0; +} +template<> +bool pyopencv_to(PyObject* obj, Vec2i& v, const char* name) +{ + return pyopencv_to(obj, v, ArgInfo(name, 0)); +} + +template<> +PyObject* pyopencv_from(const Vec4d& v) +{ + return Py_BuildValue("(dddd)", v[0], v[1], v[2], v[3]); +} + +template<> +PyObject* pyopencv_from(const Vec4f& v) +{ + return Py_BuildValue("(ffff)", v[0], v[1], v[2], v[3]); +} + +template<> +PyObject* pyopencv_from(const Vec4i& v) +{ + return Py_BuildValue("(iiii)", v[0], v[1], v[2], v[3]); } template<> @@ -1039,12 +1188,36 @@ PyObject* pyopencv_from(const Vec3d& v) return Py_BuildValue("(ddd)", v[0], v[1], v[2]); } +template<> +PyObject* pyopencv_from(const Vec3f& v) +{ + return Py_BuildValue("(fff)", v[0], v[1], v[2]); +} + +template<> +PyObject* pyopencv_from(const Vec3i& v) +{ + return Py_BuildValue("(iii)", v[0], v[1], v[2]); +} + template<> PyObject* pyopencv_from(const Vec2d& v) { return Py_BuildValue("(dd)", v[0], v[1]); } +template<> +PyObject* pyopencv_from(const Vec2f& v) +{ + return Py_BuildValue("(ff)", v[0], v[1]); +} + +template<> +PyObject* pyopencv_from(const Vec2i& v) +{ + return Py_BuildValue("(ii)", v[0], v[1]); +} + template<> PyObject* pyopencv_from(const Point2d& p) {