四畳半テクノポリス

コロナのストレスで気が狂い、D進した院生

Gstreamer + OpenCVの環境構築

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つの項目である。

  1. WITH_1394=OFF
  2. WITH_FFMPEG=OFF
  3. 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のビルド

 OpenCVのビルドとインストールを行う。makeのスレッド数はコア数の倍程度が好ましいとされているが、RasberryPi3の場合は -j 4 程度にしておいたほうが無難である。

make -j 8 #8スレッド
sudo make install


以上で環境構築は終わりである。

使用例

 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`