]> rtime.felk.cvut.cz Git - opencv.git/commitdiff
#152, FindStereoCorrespondenceBM and FindStereoCorrespondenceGC
authorjamesb <jamesb@73c94f0f-984f-4a5f-82bc-2d8db8d8ee08>
Thu, 4 Mar 2010 17:47:10 +0000 (17:47 +0000)
committerjamesb <jamesb@73c94f0f-984f-4a5f-82bc-2d8db8d8ee08>
Thu, 4 Mar 2010 17:47:10 +0000 (17:47 +0000)
git-svn-id: https://code.ros.org/svn/opencv/trunk@2741 73c94f0f-984f-4a5f-82bc-2d8db8d8ee08

opencv/interfaces/python/api
opencv/interfaces/python/cv.cpp
opencv/interfaces/python/gen.py
opencv/tests/python/goodfeatures.py
opencv/tests/python/test.py

index 0ec84e06e8f8ef5e9cd1cb48f6196f17a51a8c82..ed0e31969bc051167fad1bb931857b961853198c 100644 (file)
@@ -1250,6 +1250,24 @@ FindHomography homography
   int method 0
   double ransacReprojThreshold 0.0
   CvMat mask NULL
+CreateStereoBMState CvStereoBMState*
+  int preset CV_STEREO_BM_BASIC
+  int numberOfDisparities 0
+CreateStereoGCState CvStereoGCState*
+  int numberOfDisparities
+  int maxIters
+FindStereoCorrespondenceBM
+  CvArr left
+  CvArr right
+  CvArr disparity
+  CvStereoBMState* state
+FindStereoCorrespondenceGC
+  CvArr left
+  CvArr right
+  CvArr dispLeft
+  CvArr dispRight
+  CvStereoGCState* state
+  int useDisparityGuess 0
 CalibrateCamera2 
   CvMat object_points
   CvMat image_points
index 98ec4f4620a87701ad51f98594502698bcf5b4af..3764b2f9d8938104fc97cae2c5e2618b328c8234 100644 (file)
@@ -222,6 +222,7 @@ static Py_ssize_t what_size(PyObject *o)
 
 
 /************************************************************************/
+#include "generated3.i"
 
 /* iplimage */
 
@@ -3872,6 +3873,8 @@ void initcv()
   MKTYPE(iplimage);
   MKTYPE(memtrack);
 
+#include "generated4.i"
+
   m = Py_InitModule(MODULESTR"", methods);
   d = PyModule_GetDict(m);
 
index 99d9693477d6f0347ea4874632f5ddbf7b9bb885..e5eb16e6d7f5ebf6b260a1dc8eed0f4aaecded1c 100644 (file)
@@ -1,4 +1,5 @@
 import sys
+from string import Template
 
 class argument:
   def __init__(self, fields):
@@ -61,6 +62,8 @@ conversion_types = [
 'CvBox2D', # '((ff)(ff)f)',
 'CvBox2D*',
 'CvCapture*',
+'CvStereoBMState*',
+'CvStereoGCState*',
 'CvVideoWriter*',
 'CvContourTree*',
 'CvFont',
@@ -239,6 +242,8 @@ def gen(name, args, ty):
       'CvSubdiv2DPoint*',
       'CvSubdiv2DEdge',
       'ROIplImage*',
+      'CvStereoBMState*',
+      'CvStereoGCState*',
       'float',
       'generic',
       'unsigned' ]
@@ -272,7 +277,7 @@ def gen(name, args, ty):
 
   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):
@@ -305,5 +310,155 @@ 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()
index b6ca708c5d19869508ed0c91f7af16d04bd5c395..d68bd1f9f9cc53b1eab0bc6c61e115aebeadd185 100644 (file)
@@ -15,6 +15,11 @@ class TestGoodFeaturesToTrack(unittest.TestCase):
         # Check that GoodFeaturesToTrack has not modified input image
         self.assert_(arr.tostring() == original.tostring())
 
+        # Check for repeatability
+        for i in range(10):
+            results2 = dict([(t, cv.GoodFeaturesToTrack(arr, eig_image, temp_image, 20000, t, 2, use_harris = 1)) for t in threshes])
+            self.assert_(results == results2)
+
         for t0,t1 in zip(threshes, threshes[1:]):
              r0 = results[t0]
              r1 = results[t1]
index 706a1d96d4ff502d41bc53466722c06da9b4337d..74d7cde340ade8fcefbf5485f23a20fdd534dc2c 100644 (file)
@@ -721,6 +721,28 @@ class AreaTests(OpenCVTests):
         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)