プロジェクトをOpenCV 2.1に対応させる
Snow LeopardにOpenCV 2.1を導入したので、既存のOpenCV 1.1用のプロジェクトを更新した。全体として大きな問題は無いが、幾つか気がついた点があったので覚え書。動作環境は下記の通り。
BMPファイルを読み込めない
以前なら読み込めたBMPファイルが、OpenCV 2.1では読み込めないようだ(cvLoadImage()でnullが返る)。仕様としてはもちろん読み込めることになっている。
The function cvLoadImage loads an image from the specified file and returns the pointer to the loaded image. Currently the following file formats are supported:
http://opencv.willowgarage.com/documentation/c/reading_and_writing_images_and_video.html
この問題に該当すると思われるチケットはこちら。
http://code.ros.org/trac/opencv/ticket/370
OpenCV 2.1自体は2010/4/6にリリースされている。
上記のチケットに対する修正は2010/6/6に入っているので、次回のリリースには直っているはずだ。但し、手元の環境では400x300pixel程度の小さなBMP画像でも読み込めないので、この修正で本当に直っているのか不明。プロジェクトの方は他の画像形式を用意することで対処した。
OpenGLでの表示タイミングが変わった
OpenGLを使ってカメラ画像を表示させるような処理の場合、画面描画処理のタイミングが変わっているようだ。例えば、下記にはOpenCVとOpenGLを組み合わせた面白いソフトがある。
GLUTのインクルードパスを変更すれば、MacOS Xでもそのままビルド出来る。
#include <GLUT/glut.h> // Changed from <gl/glut.h>
$ gcc -ggdb `pkg-config --cflags opencv` -o cv_and_gl cv_and_gl.cpp `pkg-config --libs opencv` -framework OpenGL -framework GLUT -lstdc++
しかし、このままでは実行時にエラーが発生してしまう。
$ ./cv_and_gl 2010-08-20 18:20:03.808 cv_and_gl[5831:903] GLUT Warning: The following is a new check for GLUT 3.0; update your code. 2010-08-20 18:20:03.810 cv_and_gl[5831:903] GLUT Fatal Error: redisplay needed for window 1, but no display callback.
ソースコードを見るとmyInit()内でcvQueryFrame()を呼び出して画像をキャプチャしているものの、この時点ではまだglutDisplayFunc(displayFunc)を呼び出しておらず、描画のコールバックが設定されていない。だから画面表示出来ずに怒られているらしい。仕方ないので下記のようにコールバック設定後、メインループの直前でmyInit()を呼び出すように順番を変更した。
glutDisplayFunc(displayFunc); myInit(); // Moved to here. glutMainLoop();
これによりビルド、実行出来るようになった。もちろんマウスでグリグリと操作することも可能だ。(ただし、上記のログにも出ているように、この変更が必要になったのはOpenCV側ではなく、MacOS Xに載っているOpenGL側の変更による影響の可能性もある)
関連