2019・11/17 MRIくんからいくつか修正箇所の指摘を頂いたので修正しました。
持つべきものは良い友ですね。
Gstreamer+OpenCVの環境構築
今回ロボコンの大会に出場することになり、友人のPC上に私と同じ環境を構築する必要が発生したため、大会で使用するプログラムのための環境構築について親愛なるMRI氏のために解説する。
ロボットを遠隔操縦する場合ロボットに搭載されたカメラの映像をネットワーク経由でストリーミングできると便利である。MJPG-streamer等の導入が容易なシステムも存在するが、GstreamerにはOpenCVと容易に連結し画像処理を行うことができ、H264が利用できるためRasberryPiのハードウェアエンコーダを利用したH264による高速高画質なストリーミングが行えるなど多くの利点が存在する。
環境構築
①Gstreamerのインストール
OpenCVをビルドする前にGstreamerをインストールしておく必要がある。これは公式に従いUbuntuであれば次のように実行する。
sudo apt-get update
sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
sudo apt-get install libgstreamer-plugins-base1.0-0
sudo apt-get install gstreamer-video-1.0
sudo apt-get install libgstreamer-plugins-base1.0-dev
②OpenCVのダウンロード
適当なディレクトリにOpenCVをダウンロードする。デバッグを行う際にエラーメッセージ内でOpenCVのライブラリを参照することがあるのでhomeにOpenCVというディレクトリを作っておくと良いかもしれない。今回はOpenCV3.4を利用することにする。
mkdir OpenCV cd OpenCV/ wget https://github.com/opencv/opencv/archive/3.4.5.zip unzip 3.4.5.zip
③OpenCVのcmake
ダウンロードしたOpenCVのzipファイルを解凍し、解凍したディレクトリ内にbuildという名前のディレクトリを作成し中に移動する。
ここからが難関である。Gstreamerと競合するライブラリがあるとGstreamerが上手く動かなくなるので、競合するライブラリをすべて無効化しておく必要がある。
unzip 3.4.5.zip cd opencv-3.4.5/ mkdir build cd build/ cmake -D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_C_EXAMPLES=ON -D WITH_1394=OFF -D WITH_GSTREAMER=ON -D WITH_FFMPEG=OFF -D WITH_QT=ON ..
重要なのは次の3つの項目である。
- WITH_1394=OFF
- WITH_FFMPEG=OFF
- WITH_GSTREAMER=ON
1つ目のWITH_1394はIEEE1394のことらしくカメラのインタフェースに関する項目であるがGstreamerと競合するようなので無効化する。2つ目のWITH_FFMPEGであるがこれはメディアフレームワークでありGstreamerと思いっきりキャラがかぶっているので無効化する。3つめのWITH_GSTREAMERであるが、これを有効化することでGSTREAMERが利用可能になる。
この設定でcmakeを行うと次のようなログが出力されるので確認してほしい。Video I/Oの項目でGstreamer以外にYESが無ければ成功である。もし上記の設定でcmakeを行い、YESの項目が存在すればここにcmakeのオプション一覧があるので、参照してYESになっている項目を無効化する。
-- Video I/O: -- GStreamer: -- base: YES (ver 1.8.3) -- video: YES (ver 1.8.3) -- app: YES (ver 1.8.3) -- riff: YES (ver 1.8.3) -- pbutils: YES (ver 1.8.3) -- libv4l/libv4l2: NO -- v4l/v4l2: linux/videodev2.h -- gPhoto2: NO
使用例
OpenCVにはこのGstreamerを利用するための拡張機能が存在し、VideoCaptureやVideoWriterを使ってGstreamerのパイプラインとOpenCVを連結することが可能である。
使用例としてgstreamerのテスト信号をキャプチャしOpenCVで表示するプログラムを掲載する。
gstreamer_test.cpp
#include <opencv2/opencv.hpp> int main(int argc, char *argv[]) { cv::VideoCapture gstreamer; //gst-launchと同じコマンドを実行することができる。 gstreamer.open("videotestsrc ! appsink"); //カラーバー // gstreamer.open("videotestsrc pattern=ball ! appsink"); //ボール // gstreamer.open("videotestsrc pattern=snow ! appsink"); //じゃみじゃみ if (!gstreamer.isOpened()) { printf("=ERR= fail to open\n"); return -1; } while (1) { cv::Mat GstCap; gstreamer >> GstCap; cv::imshow("Gstreamer test", GstCap); int key = cv::waitKey(1); //’q’で終了 if (key == 'q') { break; } } return 0; }
g++ `pkg-config --cflags opencv` gstreamer_test.cpp -std=c++11 -g `pkg-config --libs opencv`