さまざまなオブジェクト検出器に OpenCV を使用していますが、移植可能なコードを書くのが難しいと感じています。
たとえば、OpenCV を自作でインストールした Mac に顔検出器をロードするには、次のように記述します。
haar=cv.Load('/usr/local/Cellar/opencv/2.4.2/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
これは移植性がありません。別のマシンに変更したい場合は、別の絶対パスを決定し、このコードを変更する必要があります。
OpenCV の OpenCV ルートを保持する変数はありますか? そうすれば、次のように書くことができます。
haar=cv.Load(os.path.join(OpenCVRoot, "haarcascades",
"haarcascade_frontalface_default.xml"))
更新:これは私だけの問題ではないようです。これは、OpenCV ドキュメントの問題でもあります。ドキュメントには、次の壊れたサンプル コードが含まれています。
>>> import cv
>>> image = cv.LoadImageM("lena.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
>>> cascade = cv.Load("../../data/haarcascades/haarcascade_frontalface_alt.xml")
>>> print cv.HaarDetectObjects(image, cascade, cv.CreateMemStorage(0), 1.2, 2, 0, (20, 20))
[((217, 203, 169, 169), 24)]
lena.jpg のような例や事前トレーニング済みの分類器がインストールされている場所を推測する方法があれば、これは簡単に回避できます。
ソース: http://opencv.willowgarage.com/documentation/python/objdetect_cascade_classification.html (取得 3/5/13)