Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

gtkmmでの画像表示と動画表示

前回に引き続きgtkmmを用いたGUIアプリで開発についてです。

前回はgtkmmでボタンやlabelを表示した簡単なアプリを作成しました。
elsammit-beginnerblg.hatenablog.com

今回はこちらのGUIアプリに画像や動画を表示させてみたいと思います。

っといっても、すでにサンプルを公開されている方がいらっしゃいましたのでこちらを利用していこうと思います。



サンプルソースの取得と環境構築

まずはサンプルソースであるこちらをgithubからダウンロードしていきます。
https://github.com/doleron/gtk3-opencv3-ux-sampling

git clone https://github.com/doleron/gtk3-opencv3-ux-sampling

成功すれば gtk3-opencv3-ux-sampling という名前のフォルダが生成されるかと思います。
次に、

mkdir gtk3-opencv3-ux-sampling/build
cd gtk3-opencv3-ux-sampling/build
cmake ..
make

を実行してサンプルコードをビルドしていきます。

OpenCVコード修正

先ほどのmakeでエラーなく完了すればよいのですが、
こちらのようにOpenCV系のエラーが発生する場合があります。

camera_image_window.cpp:49:35: error: ‘CV_BGR2RGB’ was not declared in this scope; did you mean ‘CV_RGB’?
   49 |     cv::cvtColor(frameBGR, frame, CV_BGR2RGB);
camera_image_window.cpp:68:14: error: ‘CV_CAP_PROP_FRAME_WIDTH’ was not declared in this scope
   68 |   camera.set(CV_CAP_PROP_FRAME_WIDTH, 640);

どうやら、CV_BGR2RGBやCV_CAP_PROP_FRAME_WIDTHといった定義は古いらしく、
最新のOpenCVでは異なる定義を利用されているようです!!

このため、camera_image_window.cppのコードをこちらのように修正していきます。

#49行目.
cv::cvtColor(frameBGR, frame, cv::COLOR_BGR2RGB);
#68行目~70行目
camera.set(cv::CAP_PROP_FRAME_WIDTH, 640);
camera.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
camera.set(cv::CAP_PROP_FPS, 30);

これで再度

make

を実行すれば成功するかと思います。

■実行してみる

こちらのサンプルコードには画像表示と動画表示の2つが用意されています。

それぞれこちらのように実行すればよいです。

●画像表示

./gtk3_opencv3_ux single-image 画像ファイルパス

●カメラキャプチャ表示

./gtk3_opencv3_ux cam-grabber ビデオデバイス

実行した結果はそれぞれこんな感じです。

●画像表示
f:id:Elsammit:20210109105210p:plain

●カメラキャプチャ表示
f:id:Elsammit:20210109105428g:plain

mp4などの動画表示を行いたい場合には、
camera_image_window.cpp内の

bool result = camera.open(cameraIndex);

を、

bool result = camera.open(ビデオパス);

に置き換えてからmake頂ければOKです。

■最後に

GUIアプリでの動画再生や画像表示について行いました。
ソースの解説は実施していませんでしたが、ざっくりした内容としては、
GUIアプリ表示とカメラキャプチャを別スレッドで動かし、
カメラキャプチャスレッドにてframeバッファへキャプチャ画像を書き込み、
GUIアプリ表示にてframeバッファを逐次表示している形でした。