import sys
+from string import Template
class argument:
def __init__(self, fields):
'CvBox2D', # '((ff)(ff)f)',
'CvBox2D*',
'CvCapture*',
+'CvStereoBMState*',
+'CvStereoGCState*',
'CvVideoWriter*',
'CvContourTree*',
'CvFont',
'CvSubdiv2DPoint*',
'CvSubdiv2DEdge',
'ROIplImage*',
+ 'CvStereoBMState*',
+ 'CvStereoGCState*',
'float',
'generic',
'unsigned' ]
yield '}'
-gen_c = [ open("generated%d.i" % i, "w") for i in range(3) ]
+gen_c = [ open("generated%d.i" % i, "w") for i in range(5) ]
print "Generated %d functions" % len(api)
for nm,args,ty in sorted(api):
for l in open("%s/defs" % sys.argv[1]):
print >>gen_c[2], "PUBLISH(%s);" % l.split()[1]
+# Generated objects. gen_c[3] is the code, gen_c[4] initializers
+
+s = Template("""
+/*
+ ${cvtype} is the OpenCV C struct
+ ${ourname}_t is the Python object
+*/
+
+struct ${ourname}_t {
+ PyObject_HEAD
+ ${cvtype} *v;
+};
+
+static void ${ourname}_dealloc(PyObject *self)
+{
+ ${ourname}_t *p = (${ourname}_t*)self;
+ cvRelease${ourname}(&p->v);
+ PyObject_Del(self);
+}
+
+static PyObject *${ourname}_repr(PyObject *self)
+{
+ ${ourname}_t *p = (${ourname}_t*)self;
+ char str[1000];
+ sprintf(str, "<${ourname} %p>", p->v);
+ return PyString_FromString(str);
+}
+
+${getset_funcs}
+
+static PyGetSetDef ${ourname}_getseters[] = {
+
+ ${getset_inits}
+ {NULL} /* Sentinel */
+};
+
+static PyTypeObject ${ourname}_Type = {
+ PyObject_HEAD_INIT(&PyType_Type)
+ 0, /*size*/
+ MODULESTR".${ourname}", /*name*/
+ sizeof(${ourname}_t), /*basicsize*/
+};
+
+static void ${ourname}_specials(void)
+{
+ ${ourname}_Type.tp_dealloc = ${ourname}_dealloc;
+ ${ourname}_Type.tp_repr = ${ourname}_repr;
+ ${ourname}_Type.tp_getset = ${ourname}_getseters;
+}
+
+static PyObject *FROM_${cvtype}PTR(${cvtype} *r)
+{
+ ${ourname}_t *m = PyObject_NEW(${ourname}_t, &${ourname}_Type);
+ m->v = r;
+ return (PyObject*)m;
+}
+
+static int convert_to_${cvtype}PTR(PyObject *o, ${cvtype}** dst, const char *name = "no_name")
+{
+ if (PyType_IsSubtype(o->ob_type, &${ourname}_Type)) {
+ *dst = ((${ourname}_t*)o)->v;
+ return 1;
+ } else {
+ (*dst) = (${cvtype}*)NULL;
+ return failmsg("Expected ${cvtype} for argument '%s'", name);
+ }
+}
+
+""")
+
+getset_func_template = Template("""
+static PyObject *${ourname}_get_${member}(${ourname}_t *p, void *closure)
+{
+ return ${rconverter}(p->v->${member});
+}
+
+static int ${ourname}_set_${member}(${ourname}_t *p, PyObject *value, void *closure)
+{
+ if (value == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Cannot delete the ${member} attribute");
+ return -1;
+ }
+
+ if (! ${checker}(value)) {
+ PyErr_SetString(PyExc_TypeError, "The ${member} attribute value must be a ${typename}");
+ return -1;
+ }
+
+ p->v->${member} = ${converter}(value);
+ return 0;
+}
+
+""")
+
+getset_init_template = Template("""
+ {(char*)"${member}", (getter)${ourname}_get_${member}, (setter)${ourname}_set_${member}, (char*)"${member}", NULL},
+""")
+
+objects = [
+ ( 'CvStereoBMState', {
+ "preFilterType" : 'i',
+ "preFilterSize" : 'i',
+ "preFilterCap" : 'i',
+ "SADWindowSize" : 'i',
+ "minDisparity" : 'i',
+ "numberOfDisparities" : 'i',
+ "textureThreshold" : 'i',
+ "uniquenessRatio" : 'i',
+ "speckleWindowSize" : 'i',
+ "speckleRange" : 'i',
+ }),
+ ( 'CvStereoGCState', {
+ "Ithreshold" : 'i',
+ "interactionRadius" : 'i',
+ "K" : 'f',
+ "lambda" : 'f',
+ "lambda1" : 'f',
+ "lambda2" : 'f',
+ "occlusionCost" : 'i',
+ "minDisparity" : 'i',
+ "numberOfDisparities" : 'i',
+ "maxIters" : 'i',
+ })
+]
+
+checkers = {
+ 'i' : 'PyNumber_Check',
+ 'f' : 'PyNumber_Check',
+}
+converters = {
+ 'i' : 'PyInt_AsLong',
+ 'f' : 'PyFloat_AsDouble',
+}
+rconverters = {
+ 'i' : 'PyInt_FromLong',
+ 'f' : 'PyFloat_FromDouble',
+}
+typenames = {
+ 'i' : 'integer',
+ 'f' : 'float',
+}
+
+for (t, members) in objects:
+ map = {'cvtype' : t,
+ 'ourname' : t.replace('Cv', '')}
+ gsf = "".join([getset_func_template.substitute(map, member = m, checker = checkers[t], converter = converters[t], rconverter = rconverters[t], typename = typenames[t]) for (m, t) in members.items()])
+ gsi = "".join([getset_init_template.substitute(map, member = m) for (m, t) in members.items()])
+ print >>gen_c[3], s.substitute(map, getset_funcs = gsf, getset_inits = gsi)
+ print >>gen_c[4], "MKTYPE(%s);" % map['ourname']
+
for f in gen_c:
f.close()
else:
print "SKIPPING test_numpy - numpy support not built"
+ def test_stereo(self):
+ bm = cv.CreateStereoBMState()
+ def illegal_delete():
+ bm = cv.CreateStereoBMState()
+ del bm.preFilterType
+ def illegal_assign():
+ bm = cv.CreateStereoBMState()
+ bm.preFilterType = "foo"
+
+ self.assertRaises(TypeError, illegal_delete)
+ self.assertRaises(TypeError, illegal_assign)
+
+ left = self.get_sample("samples/c/lena.jpg", 0)
+ right = self.get_sample("samples/c/lena.jpg", 0)
+ disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+ cv.FindStereoCorrespondenceBM(left, right, disparity, bm)
+
+ gc = cv.CreateStereoGCState(16, 2)
+ left_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+ right_disparity = cv.CreateMat(512, 512, cv.CV_16SC1)
+ cv.FindStereoCorrespondenceGC(left, right, left_disparity, right_disparity, gc)
+
def failing_test_exception(self):
a = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)
b = cv.CreateImage((640, 480), cv.IPL_DEPTH_8U, 1)