OpenCV2.0 betaのPythonバインディングを試す

OpenCVにはPythonから扱うためのラッパーが標準で添付されています。SWIGで機械的に作られている感じですが、いずれにしろラッパー開発者として知っておかないわけにはいきません。

導入

Pythonをインストールしたディレクトリの、Lib/site-packagesの中にopencvという名前のディレクトリを作り、その中に、OpenCVをインストールしたディレクトリのinterfaces/swig/pythonにあるファイルを全部コピーして入れます。

例外を起こしてみる

ぶっちゃけ、Pythonには疎いのであまり突っ込みません。知りたいのは、OpenCV 2.0 (beta)から変更になった例外処理はPythonバインディングではどうなっているのか、これだけです。

以下のようなPythonのコードを試してみます。画像サイズに負の値を指定しているので例外が起きるはずです。

#!/usr/bin/python
from opencv.cv import *

if __name__=="__main__":
    img = cvCreateImage( cvSize(-1,-1), 8, 1 )

これを実行してみると、以下のようなメッセージがコンソールに出ました。

C:\>python hoge.py
OpenCV Error: Incorrect size of input array (Non-positive width or height) in un
known function, file ..\..\..\..\opencv\src\cxcore\cxarray.cpp, line 113

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

そしてPythonごと落ちます。

try-exceptを付けてみても、エラーは捕捉できず、Pythonが落ちます。

try:
	img = cvCreateImage( cvSize(-1,-1), 8, 1 )
except:
	print sys.exc_info()[0]


ここからわかることは、

  1. 例外の対策してない?
  2. コンソールにエラーの内容は出力される

ということでした。

対策してないというのは、残念な気もしつつ、困るのはC#だけじゃないんだというよくわからない仲間意識?もあって複雑です。SWIGで生成された(と思われる)ソースを見てみると、OpenCVの関数の呼び出しは必ずtry-catchで囲ってあるし、error.cppにはSendErrorToPythonといういかにも怪しい関数があったりして、無対策ではない気がするのですがどうもよくわかりませんでした。

しかしエラー内容がコンソールに表示されるのであまり問題ないと言えば問題ないでしょう。これはある意味当然で、OpenCVでエラーが起きた時に最終的に呼ばれる関数であるcv::errorは、例外をthrowする前にエラー内容をfprintfでstderrに表示しています。ですから表示されて当たり前のはずですが、しかしこれがなぜかC#からDllImportで呼ぶと出てくれません。



結局よくわかりません、というところでお開き。