はじめに
仕事でちょこまかとOpenCVを使っています。しかし、他の人に活用してもらいたいときはGUIにしたいのですがOpenCV純正のGUIは貧弱でこまっていました。なので、今回はQt上で動かせるようにしてGUI作成の自由度向上を図りたいと思います。
環境
- OS: windows 10 64 bit
- Qt: 5.7
- OpenCV: 3.1.0 (※)
※今回、OpenCVはchocolateyというパッケージマネージャを用いて簡単にインストール出来ました!
chocolatey導入法: https://chocolatey.org/install
chocolatey内OpenCV紹介サイト: https://chocolatey.org/packages/OpenCV
注) OpenCVのdllはpathに登録しておくこと!
QtにOpenCVを取り込むための手順
Step1 .proファイルを下記を追記に修正
win32:DEPENDPATH += "C:\tools\opencv\build\include"
win32:INCLUDEPATH += "C:\tools\opencv\build\include"
win32:LIBS += -L"C:\tools\opencv\build\x64\vc14\lib"
win32:LIBS += -lopencv_world310d
注) OpenCV3.1以降からライブラリの大半がopencv_world310[|d].libに統合されています
Step2 qmakeをビルドを実行
こうすればinclude文の挿入時に、opencvやopencv2フォルダが補完対象になります。
Step3 include宣言部に下記を追加
#include "opencv2/world.hpp"
注) headerファイルはworldで全て統合されているわけではないので、ビルド時に不足している場合は適宜追加してください。
Step4 ソースコードにOpenCVの記述をお好みで行う!
例としてカメラ映像を出力するコードを書いてみました。
おまけ) cv::Mat -> QImageの変換
cv::MatとQImageの大きな違いは、RGB値の配置が BGR(cv::Mat) と RGB(QImage) な点。
cv::cvtColorでRGB値の配置変換し、QImageのコンストラクタを下記コード例の様に対応を合わせれば、簡単に変換可能。
cv::Mat src, dst;
// get a cv::Mat data as a camera frame
cam >> src;
// cv::Mat -> QImage
cv::cvtColor(src, dst, CV_RGB2BGR);
QImage cam_frame_qimg((uchar *)dst.data, dst.cols, dst.rows,(int)dst.step, QImage::Format_RGB888);
// set painter
QPainter painter(this);
// refresh image
QPoint draw_point(25,25);
// draw a QImage data with QPainter
painter.drawImage(draw_point,cam_frame_qimg);
まとめ
本当に簡単ですがQt上からOpenCVが叩ける方法を残してみました。皆さんのお役に立てるかわかりませんがお役に立てれば幸いです。
明日12/25は@soramimi_jpさんの "Qtを使った自作アプリの宣伝と開発者募集の告知をします" です。お楽しみに。
成果物
今回作ったコード: https://github.com/AkiEga/QtOpenCV310
参考
Qt 5.7 | QImage http://doc-snapshots.qt.io/qt5-5.7/qimage.html
Qt 5.7 | QPainter http://doc-snapshots.qt.io/qt5-5.7/qpainter.html