1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-28 23:03:03 +04:00

embeded cv Python module into cv2.

This commit is contained in:
Vadim Pisarevsky
2011-07-12 12:56:03 +00:00
parent 9b464199d6
commit 569b1ad582
55 changed files with 171 additions and 241 deletions
+24 -44
View File
@@ -5,7 +5,6 @@ project(opencv_python)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(
"${CMAKE_CURRENT_SOURCE_DIR}/src1"
"${CMAKE_CURRENT_SOURCE_DIR}/src2"
"${OpenCV_SOURCE_DIR}/modules/core/include"
"${OpenCV_SOURCE_DIR}/modules/imgproc/include"
@@ -37,37 +36,6 @@ if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
endif()
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated0.i
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src1/gen.py" "${CMAKE_CURRENT_SOURCE_DIR}/src1"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src1/api
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src1/defs
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src1/gen.py
)
set(cv_target "opencv_python")
add_library(${cv_target} SHARED src1/cv.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated0.i)
target_link_libraries(${cv_target} ${PYTHON_LIBRARIES} opencv_core opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_objdetect opencv_legacy opencv_contrib)
set_target_properties(${cv_target} PROPERTIES PREFIX "")
set_target_properties(${cv_target} PROPERTIES OUTPUT_NAME "cv")
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('SO')"
RESULT_VARIABLE PYTHON_CVPY_PROCESS
OUTPUT_VARIABLE CVPY_SUFFIX
OUTPUT_STRIP_TRAILING_WHITESPACE)
set_target_properties(${cv_target} PROPERTIES SUFFIX ${CVPY_SUFFIX})
if (MSVC AND NOT BUILD_SHARED_LIBS)
set_target_properties(${cv_target} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")
endif()
set(cvpymodules ${cv_target})
if(PYTHON_USE_NUMPY)
set(cv2_generated_hdrs
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_funcs.h"
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_func_tab.h"
@@ -75,28 +43,41 @@ set(cv2_generated_hdrs
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_type_reg.h"
"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_const_reg.h")
add_custom_command(
OUTPUT ${cv2_generated_hdrs}
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/hdr_parser.py
DEPENDS ${opencv_hdrs})
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated0.i
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen.py" "${CMAKE_CURRENT_SOURCE_DIR}/src2"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/api
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/defs
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen.py
)
set(cv2_target "opencv2_python")
add_library(${cv2_target} SHARED src2/cv2.cpp src2/opencv_extra_api.hpp ${cv2_generated_hdrs})
add_custom_command(
OUTPUT ${cv2_generated_hdrs}
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/gen2.py
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src2/hdr_parser.py
DEPENDS ${opencv_hdrs})
set(cv2_target "opencv_python")
add_library(${cv2_target} SHARED src2/cv2.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated0.i src2/opencv_extra_api.hpp ${cv2_generated_hdrs} src2/cv2.cv.hpp)
target_link_libraries(${cv2_target} ${PYTHON_LIBRARIES} opencv_core opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_objdetect opencv_legacy opencv_contrib)
set_target_properties(${cv2_target} PROPERTIES PREFIX "")
set_target_properties(${cv2_target} PROPERTIES OUTPUT_NAME "cv2")
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('SO')"
RESULT_VARIABLE PYTHON_CVPY_PROCESS
OUTPUT_VARIABLE CVPY_SUFFIX
OUTPUT_STRIP_TRAILING_WHITESPACE)
set_target_properties(${cv2_target} PROPERTIES SUFFIX ${CVPY_SUFFIX})
if (MSVC AND NOT BUILD_SHARED_LIBS)
set_target_properties(${cv2_target} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG")
endif()
set(cvpymodules ${cvpymodules} ${cv2_target})
endif()
set(cvpymodules ${cv2_target})
if(WIN32)
install(TARGETS ${cvpymodules}
@@ -105,7 +86,6 @@ if(WIN32)
ARCHIVE DESTINATION "Python${PYTHON_VERSION_MAJOR_MINOR}/Lib/site-packages" COMPONENT main
)
else()
#install(FILES ${LIBRARY_OUTPUT_PATH}/cv${CVPY_SUFFIX} DESTINATION ${PYTHON_PACKAGES_PATH})
install(TARGETS ${cvpymodules}
RUNTIME DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main
LIBRARY DESTINATION ${PYTHON_PACKAGES_PATH} COMPONENT main
+6 -4
View File
@@ -833,6 +833,8 @@ static int to_ok(PyTypeObject *to)
return (PyType_Ready(to) == 0);
}
#include "cv2.cv.hpp"
extern "C"
#if defined WIN32 || defined _WIN32
__declspec(dllexport)
@@ -848,16 +850,17 @@ void initcv2()
#include "pyopencv_generated_type_reg.h"
#endif
PyObject* m = Py_InitModule(MODULESTR"", methods);
PyObject* m = Py_InitModule(MODULESTR, methods);
PyObject* d = PyModule_GetDict(m);
PyDict_SetItemString(d, "__version__", PyString_FromString("$Rev: 4557 $"));
opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
PyDict_SetItemString(d, "error", opencv_error);
PyObject* cv_m = init_cv();
// AFAIK the only floating-point constant
PyDict_SetItemString(d, "CV_PI", PyFloat_FromDouble(CV_PI));
PyDict_SetItemString(d, "cv", cv_m);
#define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
#define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
@@ -942,7 +945,6 @@ void initcv2()
PUBLISH(CV_AA);
#include "pyopencv_generated_const_reg.h"
}
@@ -1,16 +1,7 @@
#include <Python.h>
#include "opencv2/legacy/legacy.hpp"
#include "opencv2/legacy/compat.hpp"
#include <assert.h>
#include "opencv/cxcore.h"
#include "opencv/cv.h"
#include "opencv/cvaux.h"
#include "opencv/cvwimage.h"
#include "opencv/highgui.h"
#define MODULESTR "cv"
static PyObject *opencv_error;
#define OLD_MODULESTR "cv2.cv"
struct memtrack_t {
PyObject_HEAD
@@ -168,21 +159,6 @@ static void translate_error_to_exception(void)
/************************************************************************/
static int failmsg(const char *fmt, ...)
{
char str[1000];
va_list ap;
va_start(ap, fmt);
vsnprintf(str, sizeof(str), fmt, ap);
va_end(ap);
PyErr_SetString(PyExc_TypeError, str);
return 0;
}
/************************************************************************/
/* These get/setters are polymorphic, used in both iplimage and cvmat */
static PyObject *PyObject_FromCvScalar(CvScalar s, int type)
@@ -355,7 +331,7 @@ static PyMappingMethods iplimage_as_map = {
static PyTypeObject iplimage_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".iplimage", /*name*/
OLD_MODULESTR".iplimage", /*name*/
sizeof(iplimage_t), /*basicsize*/
};
@@ -665,7 +641,7 @@ static PyMappingMethods cvmat_as_map = {
static PyTypeObject cvmat_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvmat", /*name*/
OLD_MODULESTR".cvmat", /*name*/
sizeof(cvmat_t), /*basicsize*/
};
@@ -830,7 +806,7 @@ static PyMappingMethods cvmatnd_as_map = {
static PyTypeObject cvmatnd_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvmatnd", /*name*/
OLD_MODULESTR".cvmatnd", /*name*/
sizeof(cvmatnd_t), /*basicsize*/
};
@@ -862,7 +838,7 @@ static void cvhistogram_dealloc(PyObject *self)
static PyTypeObject cvhistogram_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvhistogram", /*name*/
OLD_MODULESTR".cvhistogram", /*name*/
sizeof(cvhistogram_t), /*basicsize*/
};
@@ -915,7 +891,7 @@ static PyObject *cvlineiterator_next(PyObject *o)
static PyTypeObject cvlineiterator_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvlineiterator", /*name*/
OLD_MODULESTR".cvlineiterator", /*name*/
sizeof(cvlineiterator_t), /*basicsize*/
};
@@ -958,7 +934,7 @@ static void memtrack_dealloc(PyObject *self)
static PyTypeObject memtrack_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".memtrack", /*name*/
OLD_MODULESTR".memtrack", /*name*/
sizeof(memtrack_t), /*basicsize*/
};
@@ -1005,7 +981,7 @@ static void cvmemstorage_dealloc(PyObject *self)
static PyTypeObject cvmemstorage_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvmemstorage", /*name*/
OLD_MODULESTR".cvmemstorage", /*name*/
sizeof(cvmemstorage_t), /*basicsize*/
};
@@ -1021,7 +997,7 @@ static void cvmemstorage_specials(void)
static PyTypeObject cvfont_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvfont", /*name*/
OLD_MODULESTR".cvfont", /*name*/
sizeof(cvfont_t), /*basicsize*/
};
@@ -1034,7 +1010,7 @@ static void cvfont_specials(void) { }
static PyTypeObject cvrng_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvrng", /*name*/
OLD_MODULESTR".cvrng", /*name*/
sizeof(cvrng_t), /*basicsize*/
};
@@ -1049,7 +1025,7 @@ static void cvrng_specials(void)
static PyTypeObject cvcontourtree_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvcontourtree", /*name*/
OLD_MODULESTR".cvcontourtree", /*name*/
sizeof(cvcontourtree_t), /*basicsize*/
};
@@ -1063,7 +1039,7 @@ static void cvcontourtree_specials(void) { }
static PyTypeObject cvsubdiv2dedge_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvsubdiv2dedge", /*name*/
OLD_MODULESTR".cvsubdiv2dedge", /*name*/
sizeof(cvsubdiv2dedge_t), /*basicsize*/
};
@@ -1246,7 +1222,7 @@ static PyMappingMethods cvseq_mapping = {
static PyTypeObject cvseq_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvseq", /*name*/
OLD_MODULESTR".cvseq", /*name*/
sizeof(cvseq_t), /*basicsize*/
};
@@ -1294,7 +1270,7 @@ static void cvset_dealloc(PyObject *self)
static PyTypeObject cvset_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvset", /*name*/
OLD_MODULESTR".cvset", /*name*/
sizeof(cvset_t), /*basicsize*/
};
@@ -1334,7 +1310,7 @@ static void cvset_specials(void)
static PyTypeObject cvsubdiv2d_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvsubdiv2d", /*name*/
OLD_MODULESTR".cvsubdiv2d", /*name*/
sizeof(cvsubdiv2d_t), /*basicsize*/
};
@@ -1365,7 +1341,7 @@ static void cvsubdiv2d_specials(void)
static PyTypeObject cvsubdiv2dpoint_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*size*/
MODULESTR".cvsubdiv2dpoint", /*name*/
OLD_MODULESTR".cvsubdiv2dpoint", /*name*/
sizeof(cvsubdiv2dpoint_t), /*basicsize*/
};
@@ -3367,75 +3343,6 @@ static PyObject *pycvReshapeMatND(PyObject *self, PyObject *args)
return shareDataND(o, cva, pn);
}
static void OnMouse(int event, int x, int y, int flags, void* param)
{
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
PyObject *o = (PyObject*)param;
PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
if (r == NULL)
PyErr_Print();
else
Py_DECREF(r);
Py_DECREF(args);
PyGILState_Release(gstate);
}
static PyObject *pycvSetMouseCallback(PyObject *self, PyObject *args, PyObject *kw)
{
const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
char* name;
PyObject *on_mouse;
PyObject *param = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, &param))
return NULL;
if (!PyCallable_Check(on_mouse)) {
PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
return NULL;
}
if (param == NULL) {
param = Py_None;
}
ERRWRAP(cvSetMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
Py_RETURN_NONE;
}
void OnChange(int pos, void *param)
{
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
PyObject *o = (PyObject*)param;
PyObject *args = Py_BuildValue("(i)", pos);
PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
if (r == NULL)
PyErr_Print();
Py_DECREF(args);
PyGILState_Release(gstate);
}
static PyObject *pycvCreateTrackbar(PyObject *self, PyObject *args)
{
PyObject *on_change;
char* trackbar_name;
char* window_name;
int *value = new int;
int count;
if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
return NULL;
if (!PyCallable_Check(on_change)) {
PyErr_SetString(PyExc_TypeError, "on_change must be callable");
return NULL;
}
ERRWRAP(cvCreateTrackbar2(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
Py_RETURN_NONE;
}
static PyObject *pycvFindContours(PyObject *self, PyObject *args, PyObject *kw)
{
CvArr* image;
@@ -3964,17 +3871,12 @@ static double cppKMeans(const CvArr* _samples, int cluster_count, CvArr* _labels
#include "generated0.i"
static PyMethodDef methods[] = {
static PyMethodDef old_methods[] = {
#if PYTHON_USE_NUMPY
{"fromarray", (PyCFunction)pycvfromarray, METH_KEYWORDS, "fromarray(array) -> cvmatnd"},
#endif
//{"CalcOpticalFlowFarneback", (PyCFunction)pycvCalcOpticalFlowFarneback, METH_KEYWORDS, "CalcOpticalFlowFarneback(prev, next, flow, pyr_scale=0.5, levels=3, win_size=15, iterations=3, poly_n=7, poly_sigma=1.5, flags=0) -> None"},
//{"_HOGComputeDescriptors", (PyCFunction)pycvHOGComputeDescriptors, METH_KEYWORDS, "_HOGComputeDescriptors(image, win_stride=block_stride, locations=None, padding=(0,0), win_size=(64,128), block_size=(16,16), block_stride=(8,8), cell_size=(8,8), nbins=9, gammaCorrection=true) -> list_of_descriptors"},
//{"_HOGDetect", (PyCFunction)pycvHOGDetect, METH_KEYWORDS, "_HOGDetect(image, svm_classifier, win_stride=block_stride, locations=None, padding=(0,0), win_size=(64,128), block_size=(16,16), block_stride=(8,8), cell_size=(8,8), nbins=9, gammaCorrection=true) -> list_of_points"},
//{"_HOGDetectMultiScale", (PyCFunction)pycvHOGDetectMultiScale, METH_KEYWORDS, "_HOGDetectMultiScale(image, svm_classifier, win_stride=block_stride, scale=1.05, group_threshold=2, padding=(0,0), win_size=(64,128), block_size=(16,16), block_stride=(8,8), cell_size=(8,8), nbins=9, gammaCorrection=true) -> list_of_points"},
{"FindDataMatrix", pyfinddatamatrix, METH_VARARGS},
{"temp_test", temp_test, METH_VARARGS},
@@ -3986,33 +3888,13 @@ static PyMethodDef methods[] = {
/************************************************************************/
/* Module init */
static int to_ok(PyTypeObject *to)
PyObject* init_cv()
{
to->tp_alloc = PyType_GenericAlloc;
to->tp_new = PyType_GenericNew;
to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
return (PyType_Ready(to) == 0);
}
#define MKTYPE(NAME) NAME##_specials(); if (!to_ok(&NAME##_Type)) return
using namespace cv;
extern "C"
#if defined WIN32 || defined _WIN32
__declspec(dllexport)
#endif
void initcv()
{
#if PYTHON_USE_NUMPY
import_array();
#endif
PyObject *m, *d;
cvSetErrMode(CV_ErrModeParent);
#define MKTYPE(NAME) NAME##_specials(); to_ok(&NAME##_Type)
MKTYPE(cvcontourtree);
MKTYPE(cvfont);
MKTYPE(cvhistogram);
@@ -4031,12 +3913,12 @@ void initcv()
#include "generated4.i"
m = Py_InitModule(MODULESTR"", methods);
#undef MKTYPE
m = Py_InitModule(OLD_MODULESTR, old_methods);
d = PyModule_GetDict(m);
PyDict_SetItemString(d, "__version__", PyString_FromString("$Rev: 4557 $"));
opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
PyDict_SetItemString(d, "error", opencv_error);
// Couple of warnings about strict aliasing here. Not clear how to fix.
@@ -4127,7 +4009,13 @@ void initcv()
PUBLISH(GC_INIT_WITH_RECT);
PUBLISH(GC_INIT_WITH_MASK);
PUBLISH(GC_EVAL);
#include "generated2.i"
#undef PUBLISH
#undef PUBLISHU
#undef PUBLISH2
return m;
}
+1 -1
View File
@@ -1,7 +1,7 @@
# Calculating and displaying 2D Hue-Saturation histogram of a color image
import sys
import cv
import cv2.cv as cv
def hs_histogram(src):
# Convert to HSV
+1 -1
View File
@@ -5,7 +5,7 @@ import random
import numpy
import transformations
import cv
import cv2.cv as cv
def clamp(a, x, b):
return numpy.maximum(a, numpy.minimum(x, b))
@@ -1,5 +1,5 @@
import sys
import cv
import cv2.cv as cv
def findstereocorrespondence(image_left, image_right):
# image_left and image_right are the input 8-bit single-channel images
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
import unittest
class TestGoodFeaturesToTrack(unittest.TestCase):
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
import numpy as np
cv.NamedWindow('Leak')
while 1:
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
import numpy as np
import time
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
import math
import time
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
import math
import time
+1 -1
View File
@@ -1,4 +1,4 @@
import cv
import cv2.cv as cv
def precornerdetect(image):
# assume that the image is floating-point
+1 -1
View File
@@ -12,7 +12,7 @@ import getopt
import operator
import functools
import cv
import cv2.cv as cv
class OpenCVTests(unittest.TestCase):
+1 -1
View File
@@ -1,5 +1,5 @@
import urllib
import cv
import cv2.cv as cv
import Image
import unittest
+1 -1
View File
@@ -6,7 +6,7 @@ import sys
import array
import os
import cv
import cv2.cv as cv
def find_sample(s):
for d in ["../samples/c/", "../doc/pics/"]: