QtでOpenCVを使うために

Qtで画像処理ライブラリであるOpenCVを使う方法についてまとめる。まぁ基本的に以前のQt勉強会で言った内容を文章としてまとめるだけだが。

ちなみに今の環境は

なので、この記事を参考にする場合には気をつけてっちょ。特にOpenCVはインストールの方法やバージョンによって PATHが変わると思うんで。

PATH設定

ぶっちゃけこのPATH設定さえ出来ればOpenCVはいつもの感覚で使うことができる。WindowsのVisualStudioとかでもPATH設定すると思うのでそんな感じ。具体的には.proファイルに以下の内容を追加するだけ。

DEPENDPATH += /opt/local/include
INCLUDEPATH += /opt/local/include
LIBS += -L/opt/local/lib/ \
     -lopencv_core \
     -lopencv_imgproc \
     -lopencv_highgui

インクルードのパスとライブラリを指定する命令を追加するだけでいい。これでQtでOpenCVが使える。Windowsとかでも同様にできるはず。

OpenCVで画像取得→Qtで表示

QtでOpenCVを使うというかOpenCVで取得した画像などをQtで表示するときにはまったことがある。OpenCVのデータをQt上で直接画像を表示することはできないので、一度QImageに変換して表示するようにしているんだが、OpenCVのcv::MatとQtのQImageではデータの順序が異なるので変えてやる必要がある。順序を変える命令はOpenCV、QImage双方とも提供しているのでどちらを使っても良い。

OpenCVの場合
cv::Mat src, dst;
src = cv::imread("test.txt");
cv::cvtColor(src, dst, CV_RGB2BGR); //OpenCVの命令でRGBの順番を入れ替える
QImage img(dst.data, dst.cols, dst.rows, QImage::Format_RGB888);
QImageの場合
cv::Mat src = cv::imread("test.txt");
QImage img(src.data, src.cols, src.rows, QImage::Format_RGB888);
img = img.rgbSwapped(); //QImageの命令でRGBの順番を入れ替える

数百回繰り返した感じだとcv::cvtColor()のほうが少し早いかなーという感じ。時間があればちゃんと時間を計測してみたいところ。

OpenCVでカメラ画像取得→Qtで表示

OpenCVのカメラ画像を取得するcv::VideoCaptureを使ってカメラ画像を取得→Qtで表示させる時にはまったこと。MBAのインナーカメラをつなげたときだが、取得されたデータが32bitなので、そのままQImageに変換するとおかしな画像になった。なので、RGBの順番を変えるとともに8bit分減らす。

cv::Mat src, dst;
cv::VideoCapture cap(0);
cap >> src;
cv::cvtColor(src, dst, CV_RGBA2BGR); //使用しているカメラは32bitだった!
QImage img(dst.data, dst.cols, dst.rows, QImage::Format_RGB888);

これ最初は全く原因がわからず途中で諦めようかと何度も思った・・・。他のカメラでは試してないのですべてのカメラが当てはまるかは不明。

まとめ

導入までの方法とQtでどう出力するかを主にまとめた。特にQImageに変換するときには小細工が必要っぽいので忘れないようにしとこう。もう時間の浪費はこりごりだ。