Mergin itseez

This commit is contained in:
Fedor Morozov
2013-09-18 18:55:12 +04:00
1586 changed files with 85437 additions and 29692 deletions

View File

@@ -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);
}