Mergin itseez
This commit is contained in:
@@ -6,7 +6,7 @@ if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
ocv_module_disable(python)
|
||||
endif()
|
||||
|
||||
if(ANDROID OR IOS OR NOT PYTHONLIBS_FOUND OR NOT PYTHON_NUMPY_INCLUDE_DIR)
|
||||
if(ANDROID OR IOS OR NOT PYTHONLIBS_FOUND OR NOT PYTHON_NUMPY_INCLUDE_DIRS)
|
||||
ocv_module_disable(python)
|
||||
endif()
|
||||
|
||||
@@ -15,7 +15,7 @@ ocv_add_module(python BINDINGS opencv_core opencv_flann opencv_imgproc opencv_vi
|
||||
|
||||
ocv_module_include_directories(
|
||||
"${PYTHON_INCLUDE_PATH}"
|
||||
"${PYTHON_NUMPY_INCLUDE_DIR}"
|
||||
${PYTHON_NUMPY_INCLUDE_DIRS}
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/src2"
|
||||
)
|
||||
|
||||
@@ -81,6 +81,10 @@ if(ENABLE_SOLUTION_FOLDERS)
|
||||
set_target_properties(${the_module} PROPERTIES FOLDER "bindings")
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
add_definitions(-DCVAPI_EXPORTS)
|
||||
endif()
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX AND NOT ENABLE_NOISY_WARNINGS)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-function")
|
||||
endif()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <Python.h>
|
||||
|
||||
#define MODULESTR "cv2"
|
||||
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
|
||||
#include <numpy/ndarrayobject.h>
|
||||
|
||||
#include "opencv2/core.hpp"
|
||||
@@ -97,6 +98,7 @@ using namespace cv;
|
||||
typedef cv::softcascade::ChannelFeatureBuilder softcascade_ChannelFeatureBuilder;
|
||||
|
||||
typedef std::vector<uchar> vector_uchar;
|
||||
typedef std::vector<char> vector_char;
|
||||
typedef std::vector<int> vector_int;
|
||||
typedef std::vector<float> vector_float;
|
||||
typedef std::vector<double> vector_double;
|
||||
@@ -112,6 +114,8 @@ typedef std::vector<KeyPoint> vector_KeyPoint;
|
||||
typedef std::vector<Mat> vector_Mat;
|
||||
typedef std::vector<DMatch> vector_DMatch;
|
||||
typedef std::vector<String> vector_String;
|
||||
|
||||
typedef std::vector<std::vector<char> > vector_vector_char;
|
||||
typedef std::vector<std::vector<Point> > vector_vector_Point;
|
||||
typedef std::vector<std::vector<Point2f> > vector_vector_Point2f;
|
||||
typedef std::vector<std::vector<Point3f> > vector_vector_Point3f;
|
||||
@@ -143,6 +147,7 @@ typedef Ptr<MergeDebevec> Ptr_MergeDebevec;
|
||||
typedef Ptr<MergeMertens> Ptr_MergeMertens;
|
||||
|
||||
typedef Ptr<cv::softcascade::ChannelFeatureBuilder> Ptr_ChannelFeatureBuilder;
|
||||
typedef Ptr<CLAHE> Ptr_CLAHE;
|
||||
|
||||
typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
|
||||
|
||||
@@ -208,10 +213,10 @@ public:
|
||||
if(!o)
|
||||
CV_Error_(Error::StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
|
||||
refcount = refcountFromPyObject(o);
|
||||
npy_intp* _strides = PyArray_STRIDES(o);
|
||||
npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
|
||||
for( i = 0; i < dims - (cn > 1); i++ )
|
||||
step[i] = (size_t)_strides[i];
|
||||
datastart = data = (uchar*)PyArray_DATA(o);
|
||||
datastart = data = (uchar*)PyArray_DATA((PyArrayObject*) o);
|
||||
}
|
||||
|
||||
void deallocate(int* refcount, uchar*, uchar*)
|
||||
@@ -286,8 +291,10 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
return false;
|
||||
}
|
||||
|
||||
PyArrayObject* oarr = (PyArrayObject*) o;
|
||||
|
||||
bool needcopy = false, needcast = false;
|
||||
int typenum = PyArray_TYPE(o), new_typenum = typenum;
|
||||
int typenum = PyArray_TYPE(oarr), new_typenum = typenum;
|
||||
int type = typenum == NPY_UBYTE ? CV_8U :
|
||||
typenum == NPY_BYTE ? CV_8S :
|
||||
typenum == NPY_USHORT ? CV_16U :
|
||||
@@ -316,7 +323,7 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
const int CV_MAX_DIM = 32;
|
||||
#endif
|
||||
|
||||
int ndims = PyArray_NDIM(o);
|
||||
int ndims = PyArray_NDIM(oarr);
|
||||
if(ndims >= CV_MAX_DIM)
|
||||
{
|
||||
failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
|
||||
@@ -326,8 +333,8 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
int size[CV_MAX_DIM+1];
|
||||
size_t step[CV_MAX_DIM+1];
|
||||
size_t elemsize = CV_ELEM_SIZE1(type);
|
||||
const npy_intp* _sizes = PyArray_DIMS(o);
|
||||
const npy_intp* _strides = PyArray_STRIDES(o);
|
||||
const npy_intp* _sizes = PyArray_DIMS(oarr);
|
||||
const npy_intp* _strides = PyArray_STRIDES(oarr);
|
||||
bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
|
||||
|
||||
for( int i = ndims-1; i >= 0 && !needcopy; i-- )
|
||||
@@ -351,11 +358,17 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
|
||||
return false;
|
||||
}
|
||||
if( needcast )
|
||||
o = (PyObject*)PyArray_Cast((PyArrayObject*)o, new_typenum);
|
||||
else
|
||||
o = (PyObject*)PyArray_GETCONTIGUOUS((PyArrayObject*)o);
|
||||
_strides = PyArray_STRIDES(o);
|
||||
|
||||
if( needcast ) {
|
||||
o = PyArray_Cast(oarr, new_typenum);
|
||||
oarr = (PyArrayObject*) o;
|
||||
}
|
||||
else {
|
||||
oarr = PyArray_GETCONTIGUOUS(oarr);
|
||||
o = (PyObject*) oarr;
|
||||
}
|
||||
|
||||
_strides = PyArray_STRIDES(oarr);
|
||||
}
|
||||
|
||||
for(int i = 0; i < ndims; i++)
|
||||
@@ -383,7 +396,7 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
return false;
|
||||
}
|
||||
|
||||
m = Mat(ndims, size, type, PyArray_DATA(o), step);
|
||||
m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
|
||||
|
||||
if( m.data )
|
||||
{
|
||||
@@ -509,13 +522,6 @@ PyObject* pyopencv_from(const cvflann_flann_distance_t& value)
|
||||
return PyInt_FromLong(int(value));
|
||||
}
|
||||
|
||||
template<>
|
||||
bool pyopencv_to(PyObject*, cv::flann::SearchParams &, const char *)
|
||||
{
|
||||
CV_Assert(!"not implemented");
|
||||
return false;
|
||||
}
|
||||
|
||||
template<>
|
||||
bool pyopencv_to(PyObject* obj, int& value, const char* name)
|
||||
{
|
||||
@@ -693,6 +699,23 @@ bool pyopencv_to(PyObject* obj, Point2f& p, const char* name)
|
||||
return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
|
||||
}
|
||||
|
||||
template<>
|
||||
bool pyopencv_to(PyObject* obj, Point2d& p, const char* name)
|
||||
{
|
||||
(void)name;
|
||||
if(!obj || obj == Py_None)
|
||||
return true;
|
||||
if(!!PyComplex_CheckExact(obj))
|
||||
{
|
||||
Py_complex c = PyComplex_AsCComplex(obj);
|
||||
p.x = saturate_cast<double>(c.real);
|
||||
p.y = saturate_cast<double>(c.imag);
|
||||
return true;
|
||||
}
|
||||
return PyArg_ParseTuple(obj, "dd", &p.x, &p.y) > 0;
|
||||
}
|
||||
|
||||
|
||||
template<>
|
||||
PyObject* pyopencv_from(const Point& p)
|
||||
{
|
||||
@@ -841,7 +864,7 @@ template<typename _Tp> struct pyopencvVecConverter
|
||||
}
|
||||
};
|
||||
|
||||
template <typename _Tp>
|
||||
template<typename _Tp>
|
||||
bool pyopencv_to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
|
||||
{
|
||||
return pyopencvVecConverter<_Tp>::to(obj, value, info);
|
||||
@@ -899,9 +922,9 @@ template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const s
|
||||
|
||||
template<typename _Tp> struct pyopencvVecConverter<std::vector<_Tp> >
|
||||
{
|
||||
static bool to(PyObject* obj, std::vector<std::vector<_Tp> >& value, const char* name="<unknown>")
|
||||
static bool to(PyObject* obj, std::vector<std::vector<_Tp> >& value, const ArgInfo info)
|
||||
{
|
||||
return pyopencv_to_generic_vec(obj, value, name);
|
||||
return pyopencv_to_generic_vec(obj, value, info);
|
||||
}
|
||||
|
||||
static PyObject* from(const std::vector<std::vector<_Tp> >& value)
|
||||
@@ -1054,10 +1077,16 @@ bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name)
|
||||
return ok;
|
||||
}
|
||||
|
||||
template<>
|
||||
bool pyopencv_to(PyObject* obj, cv::flann::SearchParams & value, const char * name)
|
||||
{
|
||||
return pyopencv_to<cv::flann::IndexParams>(obj, value, name);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name)
|
||||
{
|
||||
p = new T();
|
||||
p = makePtr<T>();
|
||||
return pyopencv_to(o, *p, name);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,20 +13,24 @@ ignored_arg_types = ["RNG*"]
|
||||
|
||||
gen_template_check_self = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
|
||||
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
|
||||
$cname* _self_ = ${amp}((pyopencv_${name}_t*)self)->v;
|
||||
$cname* _self_ = ${amp}((pyopencv_${name}_t*)self)->v${get};
|
||||
""")
|
||||
|
||||
gen_template_check_self_algo = Template(""" if(!PyObject_TypeCheck(self, &pyopencv_${name}_Type))
|
||||
return failmsgp("Incorrect type of self (must be '${name}' or its derivative)");
|
||||
$cname* _self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.obj);
|
||||
$cname* _self_ = dynamic_cast<$cname*>(${amp}((pyopencv_${name}_t*)self)->v.get());
|
||||
""")
|
||||
|
||||
gen_template_call_constructor = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
|
||||
gen_template_call_constructor_prelude = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
|
||||
new (&(self->v)) Ptr<$cname>(); // init Ptr with placement new
|
||||
if(self) ERRWRAP2(self->v = new $cname""")
|
||||
if(self) """)
|
||||
|
||||
gen_template_simple_call_constructor = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
|
||||
if(self) ERRWRAP2(self->v = $cname""")
|
||||
gen_template_call_constructor = Template("""self->v.reset(new ${cname}${args})""")
|
||||
|
||||
gen_template_simple_call_constructor_prelude = Template("""self = PyObject_NEW(pyopencv_${name}_t, &pyopencv_${name}_Type);
|
||||
if(self) """)
|
||||
|
||||
gen_template_simple_call_constructor = Template("""self->v = ${cname}${args}""")
|
||||
|
||||
gen_template_parse_args = Template("""const char* keywords[] = { $kw_list, NULL };
|
||||
if( PyArg_ParseTupleAndKeywords(args, kw, "$fmtspec", (char**)keywords, $parse_arglist)$code_cvt )""")
|
||||
@@ -34,7 +38,7 @@ gen_template_parse_args = Template("""const char* keywords[] = { $kw_list, NULL
|
||||
gen_template_func_body = Template("""$code_decl
|
||||
$code_parse
|
||||
{
|
||||
$code_fcall;
|
||||
${code_prelude}ERRWRAP2($code_fcall);
|
||||
$code_ret;
|
||||
}
|
||||
""")
|
||||
@@ -124,7 +128,7 @@ template<> bool pyopencv_to(PyObject* src, Ptr<${cname}>& dst, const char* name)
|
||||
failmsg("Expected ${cname} for argument '%%s'", name);
|
||||
return false;
|
||||
}
|
||||
dst = ((pyopencv_${name}_t*)src)->v;
|
||||
dst = ((pyopencv_${name}_t*)src)->v.dynamicCast<${cname}>();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -187,7 +191,7 @@ static PyObject* pyopencv_${name}_get_${member}(pyopencv_${name}_t* p, void *clo
|
||||
gen_template_get_prop_algo = Template("""
|
||||
static PyObject* pyopencv_${name}_get_${member}(pyopencv_${name}_t* p, void *closure)
|
||||
{
|
||||
return pyopencv_from(dynamic_cast<$cname*>(p->v.obj)${access}${member});
|
||||
return pyopencv_from(dynamic_cast<$cname*>(p->v.get())${access}${member});
|
||||
}
|
||||
""")
|
||||
|
||||
@@ -211,7 +215,7 @@ static int pyopencv_${name}_set_${member}(pyopencv_${name}_t* p, PyObject *value
|
||||
PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
|
||||
return -1;
|
||||
}
|
||||
return pyopencv_to(value, dynamic_cast<$cname*>(p->v.obj)${access}${member}) ? 0 : -1;
|
||||
return pyopencv_to(value, dynamic_cast<$cname*>(p->v.get())${access}${member}) ? 0 : -1;
|
||||
}
|
||||
""")
|
||||
|
||||
@@ -559,39 +563,22 @@ class FuncInfo(object):
|
||||
if self.classname:
|
||||
selfinfo = all_classes[self.classname]
|
||||
if not self.isconstructor:
|
||||
amp = ""
|
||||
if selfinfo.issimple:
|
||||
amp = "&"
|
||||
amp = "&" if selfinfo.issimple else ""
|
||||
if selfinfo.isalgorithm:
|
||||
code += gen_template_check_self_algo.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
|
||||
else:
|
||||
code += gen_template_check_self.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp)
|
||||
get = "" if selfinfo.issimple else ".get()"
|
||||
code += gen_template_check_self.substitute(name=selfinfo.name, cname=selfinfo.cname, amp=amp, get=get)
|
||||
fullname = selfinfo.wname + "." + fullname
|
||||
|
||||
all_code_variants = []
|
||||
declno = -1
|
||||
for v in self.variants:
|
||||
code_decl = ""
|
||||
code_fcall = ""
|
||||
code_ret = ""
|
||||
code_cvt_list = []
|
||||
|
||||
if self.isconstructor:
|
||||
code_decl += " pyopencv_%s_t* self = 0;\n" % selfinfo.name
|
||||
templ = gen_template_call_constructor
|
||||
if selfinfo.issimple:
|
||||
templ = gen_template_simple_call_constructor
|
||||
code_fcall = templ.substitute(name=selfinfo.name, cname=selfinfo.cname)
|
||||
else:
|
||||
code_fcall = "ERRWRAP2( "
|
||||
if v.rettype:
|
||||
code_decl += " " + v.rettype + " retval;\n"
|
||||
code_fcall += "retval = "
|
||||
if ismethod:
|
||||
code_fcall += "_self_->" + self.cname
|
||||
else:
|
||||
code_fcall += self.cname
|
||||
code_fcall += "("
|
||||
code_args = "("
|
||||
all_cargs = []
|
||||
parse_arglist = []
|
||||
|
||||
@@ -605,9 +592,9 @@ class FuncInfo(object):
|
||||
if not defval and a.tp.endswith("*"):
|
||||
defval = 0
|
||||
assert defval
|
||||
if not code_fcall.endswith("("):
|
||||
code_fcall += ", "
|
||||
code_fcall += defval
|
||||
if not code_args.endswith("("):
|
||||
code_args += ", "
|
||||
code_args += defval
|
||||
all_cargs.append([[None, ""], ""])
|
||||
continue
|
||||
tp1 = tp = a.tp
|
||||
@@ -649,11 +636,34 @@ class FuncInfo(object):
|
||||
else:
|
||||
code_decl += " %s %s;\n" % (amapping[0], a.name)
|
||||
|
||||
if not code_fcall.endswith("("):
|
||||
code_fcall += ", "
|
||||
code_fcall += amp + a.name
|
||||
if not code_args.endswith("("):
|
||||
code_args += ", "
|
||||
code_args += amp + a.name
|
||||
|
||||
code_fcall += "))"
|
||||
code_args += ")"
|
||||
|
||||
if self.isconstructor:
|
||||
code_decl += " pyopencv_%s_t* self = 0;\n" % selfinfo.name
|
||||
if selfinfo.issimple:
|
||||
templ_prelude = gen_template_simple_call_constructor_prelude
|
||||
templ = gen_template_simple_call_constructor
|
||||
else:
|
||||
templ_prelude = gen_template_call_constructor_prelude
|
||||
templ = gen_template_call_constructor
|
||||
|
||||
code_prelude = templ_prelude.substitute(name=selfinfo.name, cname=selfinfo.cname)
|
||||
code_fcall = templ.substitute(name=selfinfo.name, cname=selfinfo.cname, args=code_args)
|
||||
else:
|
||||
code_prelude = ""
|
||||
code_fcall = ""
|
||||
if v.rettype:
|
||||
code_decl += " " + v.rettype + " retval;\n"
|
||||
code_fcall += "retval = "
|
||||
if ismethod:
|
||||
code_fcall += "_self_->" + self.cname
|
||||
else:
|
||||
code_fcall += self.cname
|
||||
code_fcall += code_args
|
||||
|
||||
if code_cvt_list:
|
||||
code_cvt_list = [""] + code_cvt_list
|
||||
@@ -706,7 +716,7 @@ class FuncInfo(object):
|
||||
(fmtspec, ", ".join(["pyopencv_from(" + aname + ")" for aname, argno in v.py_outlist]))
|
||||
|
||||
all_code_variants.append(gen_template_func_body.substitute(code_decl=code_decl,
|
||||
code_parse=code_parse, code_fcall=code_fcall, code_ret=code_ret))
|
||||
code_parse=code_parse, code_prelude=code_prelude, code_fcall=code_fcall, code_ret=code_ret))
|
||||
|
||||
if len(all_code_variants)==1:
|
||||
# if the function/method has only 1 signature, then just put it
|
||||
|
||||
@@ -51,4 +51,3 @@ if __name__ == '__main__':
|
||||
cv.ShowImage("H-S Histogram", hs_histogram(src))
|
||||
|
||||
cv.WaitKey(0)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user