diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index c834b1f322..384207cd06 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -23,6 +23,8 @@ # include "opencv2/nonfree.hpp" #endif +#include "pycompat.hpp" + using cv::flann::IndexParams; using cv::flann::SearchParams; @@ -1176,7 +1178,11 @@ static int convert_to_char(PyObject *o, char *dst, const char *name = "no_name") } } +#if PY_MAJOR_VERSION >= 3 +#define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return NULL; +#else #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return +#endif #ifdef __GNUC__ # pragma GCC diagnostic ignored "-Wunused-parameter" @@ -1205,15 +1211,35 @@ static int to_ok(PyTypeObject *to) return (PyType_Ready(to) == 0); } + +#if PY_MAJOR_VERSION >= 3 +extern "C" CV_EXPORTS PyObject* PyInit_cv2(); +static struct PyModuleDef cv2_moduledef = +{ + PyModuleDef_HEAD_INIT, + MODULESTR, + "Python wrapper for OpenCV.", + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + methods +}; + +PyObject* PyInit_cv2() +#else extern "C" CV_EXPORTS void initcv2(); void initcv2() +#endif { import_array(); #include "pyopencv_generated_type_reg.h" +#if PY_MAJOR_VERSION >= 3 + PyObject* m = PyModule_Create(&cv2_moduledef); +#else PyObject* m = Py_InitModule(MODULESTR, methods); +#endif PyObject* d = PyModule_GetDict(m); PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION)); @@ -1262,5 +1288,7 @@ void initcv2() PUBLISH(CV_64FC4); #include "pyopencv_generated_const_reg.h" - +#if PY_MAJOR_VERSION >= 3 + return m; +#endif } diff --git a/modules/python/src2/pycompat.hpp b/modules/python/src2/pycompat.hpp new file mode 100644 index 0000000000..c473fffb20 --- /dev/null +++ b/modules/python/src2/pycompat.hpp @@ -0,0 +1,64 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +// Defines for Python 2/3 compatibility. +#ifndef __PYCOMPAT_HPP__ +#define __PYCOMPAT_HPP__ + +#if PY_MAJOR_VERSION >= 3 +// Python3 treats all ints as longs, PyInt_X functions have been removed. +#define PyInt_Check PyLong_Check +#define PyInt_CheckExact PyLong_CheckExact +#define PyInt_AsLong PyLong_AsLong +#define PyInt_AS_LONG PyLong_AS_LONG +#define PyInt_FromLong PyLong_FromLong +#define PyNumber_Int PyNumber_Long + +// Python3 strings are unicode, these defines mimic the Python2 functionality. +#define PyString_Check PyUnicode_Check +#define PyString_FromString PyUnicode_FromString +#define PyString_AsString PyUnicode_AsUTF8 +#define PyString_FromStringAndSize PyUnicode_FromStringAndSize +#define PyString_Size PyUnicode_GET_SIZE +#endif + +#endif // END HEADER GUARD