ImageView
QtでOpenCVの画像を表示させるためのWidget.
OpenCVではcv::imshow("imageName", imageData )
関数を使って簡単に画像を表示できるようになっています.ただ,UI周りの機能があまり充実していないので,UIを色々と使いたいプログラムを書くとなると別のUIライブラリを使用する必要が出てくると思います.
色々な選択肢が考えられると思いますが,このブログでは,主にQtを使ってUIを作成しています.Qtを使ってUIを作成する場合,cv::imshow
で表示されるOpenCVウィンドウではなく,Qt独自のWidgetを使ってOpenCVの画像を表示すると色々なUIと組み合わせることができて便利です.
以下がQtでOpenCVの画像を表示するためのサンプルコードになります.
|
|
ImageViewクラスはQWidgetを継承して作成し,paintEvent関数をオーバーライドしてOpenCVの画像を表示できるようカスタマイズします.実際にOpenCVのレンダリングの画像をレンダリングしたいときは,imageView->renderCVImage(image)
のようにしてレンダリングできるようにしたいと思います.
以下,実装の関連部分になります.
|
|
renderCVImageの実装では,cv::Mat型のimageをQOpenCVImage::CVMatToQImageでQImageに変換し,update関数を呼ぶことにより,その結果paintEventメソッドが呼んでいます.paintEventの中では,単に_qImageに保持しておいた画像をQPainterを使って描画しているだけです.
以下は,QOpenCVImage::CVMatToQImageの実装.
|
|
基本的には,cv::MatのデータをQImageに変換するだけですが,入力のcv::Matデータの型に応じた調整を行う必要があります.この実装では,CV_32FC3, CV_8UC2のようなcv::Mat型を一度CV_8UC3型に揃えてから変換処理を行っています.cv::MatのデータとQImageではビット配列の順番が違うので,rgbSwappedを呼んでデータを修正しています.