mirror of
https://github.com/opencv/opencv.git
synced 2025-06-07 17:44:04 +08:00
python: exception-free pyopencv_to() wrapper
This commit is contained in:
parent
bf03f5fa3a
commit
d651ff8d6b
@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
#define CV_HAS_CONVERSION_ERROR(x) (((x) == -1) && PyErr_Occurred())
|
#define CV_HAS_CONVERSION_ERROR(x) (((x) == -1) && PyErr_Occurred())
|
||||||
|
|
||||||
|
static PyObject* opencv_error = NULL;
|
||||||
|
|
||||||
class ArgInfo
|
class ArgInfo
|
||||||
{
|
{
|
||||||
@ -66,14 +67,32 @@ struct PyOpenCV_Converter
|
|||||||
//static inline PyObject* from(const T& src);
|
//static inline PyObject* from(const T& src);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// exception-safe pyopencv_to
|
||||||
|
template<typename _Tp> static
|
||||||
|
bool pyopencv_to_safe(PyObject* obj, _Tp& value, const ArgInfo& info)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return pyopencv_to(obj, value, info);
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
PyErr_SetString(opencv_error, cv::format("Conversion error: %s, what: %s", info.name, e.what()).c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
PyErr_SetString(opencv_error, cv::format("Conversion error: %s", info.name).c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T> static
|
template<typename T> static
|
||||||
bool pyopencv_to(PyObject* obj, T& p, const ArgInfo& info) { return PyOpenCV_Converter<T>::to(obj, p, info); }
|
bool pyopencv_to(PyObject* obj, T& p, const ArgInfo& info) { return PyOpenCV_Converter<T>::to(obj, p, info); }
|
||||||
|
|
||||||
template<typename T> static
|
template<typename T> static
|
||||||
PyObject* pyopencv_from(const T& src) { return PyOpenCV_Converter<T>::from(src); }
|
PyObject* pyopencv_from(const T& src) { return PyOpenCV_Converter<T>::from(src); }
|
||||||
|
|
||||||
static PyObject* opencv_error = NULL;
|
|
||||||
|
|
||||||
static bool isPythonBindingsDebugEnabled()
|
static bool isPythonBindingsDebugEnabled()
|
||||||
{
|
{
|
||||||
static bool param_debug = cv::utils::getConfigurationParameterBool("OPENCV_PYTHON_DEBUG", false);
|
static bool param_debug = cv::utils::getConfigurationParameterBool("OPENCV_PYTHON_DEBUG", false);
|
||||||
@ -211,6 +230,11 @@ catch (const std::exception &e) \
|
|||||||
{ \
|
{ \
|
||||||
PyErr_SetString(opencv_error, e.what()); \
|
PyErr_SetString(opencv_error, e.what()); \
|
||||||
return 0; \
|
return 0; \
|
||||||
|
} \
|
||||||
|
catch (...) \
|
||||||
|
{ \
|
||||||
|
PyErr_SetString(opencv_error, "Unknown C++ exception from OpenCV code"); \
|
||||||
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
@ -47,7 +47,7 @@ gen_template_func_body = Template("""$code_decl
|
|||||||
gen_template_mappable = Template("""
|
gen_template_mappable = Template("""
|
||||||
{
|
{
|
||||||
${mappable} _src;
|
${mappable} _src;
|
||||||
if (pyopencv_to(src, _src, info))
|
if (pyopencv_to_safe(src, _src, info))
|
||||||
{
|
{
|
||||||
return cv_mappable_to(_src, dst);
|
return cv_mappable_to(_src, dst);
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ gen_template_set_prop_from_map = Template("""
|
|||||||
if( PyMapping_HasKeyString(src, (char*)"$propname") )
|
if( PyMapping_HasKeyString(src, (char*)"$propname") )
|
||||||
{
|
{
|
||||||
tmp = PyMapping_GetItemString(src, (char*)"$propname");
|
tmp = PyMapping_GetItemString(src, (char*)"$propname");
|
||||||
ok = tmp && pyopencv_to(tmp, dst.$propname, ArgInfo("$propname", false));
|
ok = tmp && pyopencv_to_safe(tmp, dst.$propname, ArgInfo("$propname", false));
|
||||||
Py_DECREF(tmp);
|
Py_DECREF(tmp);
|
||||||
if(!ok) return false;
|
if(!ok) return false;
|
||||||
}""")
|
}""")
|
||||||
@ -145,7 +145,7 @@ static int pyopencv_${name}_set_${member}(pyopencv_${name}_t* p, PyObject *value
|
|||||||
PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
|
PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return pyopencv_to(value, p->v${access}${member}, ArgInfo("value", false)) ? 0 : -1;
|
return pyopencv_to_safe(value, p->v${access}${member}, ArgInfo("value", false)) ? 0 : -1;
|
||||||
}
|
}
|
||||||
""")
|
""")
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ static int pyopencv_${name}_set_${member}(pyopencv_${name}_t* p, PyObject *value
|
|||||||
failmsgp("Incorrect type of object (must be '${name}' or its derivative)");
|
failmsgp("Incorrect type of object (must be '${name}' or its derivative)");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return pyopencv_to(value, _self_${access}${member}, ArgInfo("value", false)) ? 0 : -1;
|
return pyopencv_to_safe(value, _self_${access}${member}, ArgInfo("value", false)) ? 0 : -1;
|
||||||
}
|
}
|
||||||
""")
|
""")
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ class ClassInfo(object):
|
|||||||
code = "static bool pyopencv_to(PyObject* src, %s& dst, const ArgInfo& info)\n{\n PyObject* tmp;\n bool ok;\n" % (self.cname)
|
code = "static bool pyopencv_to(PyObject* src, %s& dst, const ArgInfo& info)\n{\n PyObject* tmp;\n bool ok;\n" % (self.cname)
|
||||||
code += "".join([gen_template_set_prop_from_map.substitute(propname=p.name,proptype=p.tp) for p in self.props])
|
code += "".join([gen_template_set_prop_from_map.substitute(propname=p.name,proptype=p.tp) for p in self.props])
|
||||||
if self.base:
|
if self.base:
|
||||||
code += "\n return pyopencv_to(src, (%s&)dst, info);\n}\n" % all_classes[self.base].cname
|
code += "\n return pyopencv_to_safe(src, (%s&)dst, info);\n}\n" % all_classes[self.base].cname
|
||||||
else:
|
else:
|
||||||
code += "\n return true;\n}\n"
|
code += "\n return true;\n}\n"
|
||||||
return code
|
return code
|
||||||
@ -665,7 +665,7 @@ class FuncInfo(object):
|
|||||||
if a.tp == 'char':
|
if a.tp == 'char':
|
||||||
code_cvt_list.append("convert_to_char(pyobj_%s, &%s, %s)" % (a.name, a.name, a.crepr()))
|
code_cvt_list.append("convert_to_char(pyobj_%s, &%s, %s)" % (a.name, a.name, a.crepr()))
|
||||||
else:
|
else:
|
||||||
code_cvt_list.append("pyopencv_to(pyobj_%s, %s, %s)" % (a.name, a.name, a.crepr()))
|
code_cvt_list.append("pyopencv_to_safe(pyobj_%s, %s, %s)" % (a.name, a.name, a.crepr()))
|
||||||
|
|
||||||
all_cargs.append([arg_type_info, parse_name])
|
all_cargs.append([arg_type_info, parse_name])
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user