From 868ad1604116806e2dea021e6c5857e6348c7b18 Mon Sep 17 00:00:00 2001 From: Vitaly Tuzov Date: Wed, 11 Oct 2017 14:11:47 +0300 Subject: [PATCH] Python wrappers for Vec and Matx --- modules/python/src2/cv2.cpp | 191 ++++++++++++++++++++++++++++++++++-- 1 file changed, 182 insertions(+), 9 deletions(-) diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index e6172fac22..276353138e 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -394,6 +394,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) { @@ -681,18 +699,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++) { @@ -700,7 +717,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; } } @@ -709,13 +726,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) { @@ -1022,14 +1045,140 @@ 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, Vec3d& v, const char* name) +bool pyopencv_to(PyObject* obj, Vec4d& v, const char* name) { - (void)name; - if(!obj) + 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) +{ + 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, "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<> PyObject* pyopencv_from(const Vec3d& v) @@ -1037,12 +1186,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) {