OpenCVは「Pythonバインディングを公式サポートしてます!」と言ってるけどイマイチちゃんと動いてなかった。

[追記] SVN HEADで修正されました。

Python版のSnakeImageバグってるよ!」と書いて以下のpatchを本家のtracに投げたら素早く修正されました。
https://code.ros.org/trac/opencv/ticket/393
Pythonバインディングに結構まだ粗があるのは確かだけど、公式にサポートする気持ちは強いんじゃないでしょうか。

以下もう修正されたのでどうでもいい

OpenCV1.0、1.1とかでどうなのかは知らないけど2.1とSVN版ではpythonから使うとcv.SnakeImageが動かない。


OpenCV2.1のPythonバインディングはSnakeImageがバグってる。SVN版はPythonバインディングからSnakeImageが消えている。(ちゃんと動いてねーから一旦削除ってことだろか。メーリングリストとかフォーラムとか巡っても言及が見当たらない)


しょうがないので自分で適当にPythonバインディングの修正。

~/work/OpenCV-2.1.0/interfaces/python % patch -p0 <opencv-2.1-snakeimage.patch

で適用。

opencv-2.1-snakeimage.patch
Index: api
===================================================================
--- api	(revision 3239)
+++ api	(working copy)
@@ -1517,16 +1517,16 @@
 KalmanPredict ROCvMat*
   CvKalman* kalman
   CvMat control NULL
-SnakeImage
-  IplImage image
-  CvPoints points
-  floats alpha
-  floats beta
-  floats gamma
-  int coeff_usage
-  CvSize win
-  CvTermCriteria criteria
-  int calc_gradient 1
+#SnakeImage
+#  IplImage image
+#  CvPoints points
+#  floats alpha
+#  floats beta
+#  floats gamma
+#  int coeff_usage
+#  CvSize win
+#  CvTermCriteria criteria
+#  int calc_gradient 1
 
 # Optical Flow
 CalcOpticalFlowLK
Index: cv.cpp
===================================================================
--- cv.cpp	(revision 3239)
+++ cv.cpp	(working copy)
@@ -1853,6 +1853,18 @@
   return 1;
 }
 
+static int convert_to_PyList(CvPoints *src, PyObject *dst, const char *name = "no_name")
+{
+  if (!PyList_Check(dst))
+    return 0;
+  for (Py_ssize_t i = 0; i < src->count; i++) {
+    PyObject *pt = Py_BuildValue("(ii)", src->p[i].x, src->p[i].y);
+    PyList_SET_ITEM(dst, i, pt);
+    Py_INCREF(pt);
+  }
+  return 1;
+}
+
 struct CvPoint3D32fs {
   CvPoint3D32f *p;
   int count;
@@ -3755,6 +3767,45 @@
     return seq;
 }
 
+static PyObject *pycvFixSnakeImage(PyObject *self, PyObject *args, PyObject *kw)
+{
+  IplImage* image;
+  PyObject *pyobj_image = NULL;
+  CvPoints points;
+  PyObject *pyobj_points = NULL;
+  floats alpha;
+  PyObject *pyobj_alpha = NULL;
+  floats beta;
+  PyObject *pyobj_beta = NULL;
+  floats gamma;
+  PyObject *pyobj_gamma = NULL;
+  int coeff_usage;
+  CvSize win;
+  PyObject *pyobj_win = NULL;
+  CvTermCriteria criteria;
+  PyObject *pyobj_criteria = NULL;
+  int calc_gradient = 1;
+  
+  const char *keywords[] = { "image", "points", "alpha", "beta", "gamma", "coeff_usage", "win", "criteria", "calc_gradient", NULL };
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "OOOOOiOO|i", (char**)keywords, &pyobj_image, &pyobj_points, &pyobj_alpha, &pyobj_beta, &pyobj_gamma, &coeff_usage, &pyobj_win, &pyobj_criteria, &calc_gradient))
+    return NULL;
+  if (!convert_to_IplImage(pyobj_image, &image, "image")) return NULL;
+  if (!convert_to_CvPoints(pyobj_points, &points, "points")) return NULL;
+  if (!convert_to_floats(pyobj_alpha, &alpha, "alpha")) return NULL;
+  if (!convert_to_floats(pyobj_beta, &beta, "beta")) return NULL;
+  if (!convert_to_floats(pyobj_gamma, &gamma, "gamma")) return NULL;
+  if (!convert_to_CvSize(pyobj_win, &win, "win")) return NULL;
+  if (!convert_to_CvTermCriteria(pyobj_criteria, &criteria, "criteria")) return NULL;
+#ifdef CVPY_VALIDATE_SnakeImage
+  CVPY_VALIDATE_SnakeImage();
+#endif
+  ERRWRAP(cvSnakeImage(image, points.p, points.count, alpha.f, beta.f, gamma.f, coeff_usage, win, criteria, calc_gradient));
+  if (!convert_to_PyList(&points, pyobj_points, "points")) return NULL;
+  delete points.p;
+  
+  Py_RETURN_NONE;
+}
+
 static int zero = 0;
 
 /************************************************************************/
@@ -3788,6 +3839,7 @@
   //{"_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"},
 
   {"temp_test", temp_test, METH_VARARGS},
+  {"SnakeImage", (PyCFunction)pycvFixSnakeImage, METH_KEYWORDS, "SnakeImage(image, points, alpha, beta, gamma, coeff_usage, win, criteria [, calc_gradient]) -> None"},
 
 #include "generated1.i"

test