プロジェクトをOpenCV 2.1に対応させる

Snow LeopardOpenCV 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

この問題に該当すると思われるチケットはこちら。

  • OpenCV( Win ) 2.1: cvLoadImage --> crashes
  • OpenCV( Win ) 1.0: cvLoadImage --> works fine
http://code.ros.org/trac/opencv/ticket/370

OpenCV 2.1自体は2010/4/6にリリースされている。

上記のチケットに対する修正は2010/6/6に入っているので、次回のリリースには直っているはずだ。但し、手元の環境では400x300pixel程度の小さなBMP画像でも読み込めないので、この修正で本当に直っているのか不明。プロジェクトの方は他の画像形式を用意することで対処した。

OpenGLでの表示タイミングが変わった

OpenGLを使ってカメラ画像を表示させるような処理の場合、画面描画処理のタイミングが変わっているようだ。例えば、下記にはOpenCVOpenGLを組み合わせた面白いソフトがある。

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側の変更による影響の可能性もある)



関連