[openrtm-staff:1496] 2/5の作業報告(河内)
河内のぶ
n.kawauchi @ aist.go.jp
2018年 2月 5日 (月) 19:37:37 JST
安藤様
河内です
本日の作業内容をお知らせします。
------------
■ミーティング
■Ubuntu17.10 + OpenCV3 + GStreamerの動作確認
・Ubuntu17.04は1月で公式サポートが終了した模様。apt-get updateに失敗
するので17.10環境を構築。
⇒trunkにあるpkg_install_ubuntu.shで問題なくlibtool-binはインストール
される
$ dpkg -l | grep libtool-bin
ii libtool-bin 2.4.6-2
▼OpenCVパッケージインストール動作確認
・Ubuntu17.10はデフォルトでOpenCV3.1.0がインストールされると判明
・インストールしてみる
$ apt-cache search opencv
$ apt-cache show libopencv-dev
:
Version: 3.1.0+dfsg1-1~exp1ubuntu3
$ sudo apt-get install libopencv-dev
・・・3.1.0バージョンインストールOK!
▼GStreamerインストール
$ 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
参考:
https://gstreamer.freedesktop.org/documentation/installing/on-linux.html
▼OpenCVビルド
・gstreamer1.0がインストールされていればOpenCVのcmakeで自動的に有効化
されるとある
・OpenCV3.4のソースをダウンロード・展開する
$ wget https://github.com/opencv/opencv/archive/3.4.0.zip
・cmake実行
$ mkdir build
$ cd build
$ cmake .. -DWITH_GSTREAMER=ON
⇒有効にならない!
下記ページが参考になる。
http://answers.opencv.org/question/95734/cmake-not-picking-gstreamer-on-ubuntu/
・GStreamerの依存で不足しているパッケージを確認する
$ sudo apt-get install apt-file
$ sudo apt-file update
$ apt-file find gstreamer-video
gstreamer1.0-plugins-base-doc: /usr/share/gtk-doc/html/gst-plugins-base-libs-1.0/gstreamer-video.html
libgstreamer-plugins-base1.0-dev: /usr/lib/x86_64-linux-gnu/pkgconfig/gstreamer-video-1.0.pc
tracker-extract: /usr/share/tracker-miners/extract-rules/90-gstreamer-video-generic.rule
valac-0.36-vapi: /usr/share/vala-0.36/vapi/gstreamer-video-0.10.deps
valac-0.36-vapi: /usr/share/vala-0.36/vapi/gstreamer-video-0.10.vapi
valac-0.36-vapi: /usr/share/vala-0.36/vapi/gstreamer-video-1.0.deps
valac-0.36-vapi: /usr/share/vala-0.36/vapi/gstreamer-video-1.0.vapi
・この結果からlibgstreamer-plugins-base1.0-devをインストールする
$ sudo apt-get install libgstreamer-plugins-base1.0-dev
・cmake確認 ・・・OK!
$ cmake .. -DWITH_GSTREAMER=ON
:
-- GStreamer:
-- base: YES (ver 1.12.3)
-- video: YES (ver 1.12.3)
-- app: YES (ver 1.12.3)
-- riff: YES (ver 1.12.3)
-- pbutils: YES (ver 1.12.3)
・OpenCV3.4をインストールするのでパッケージでインストールしたものは
アンインストールしておく
$ sudo apt-get purge libopencv*
・あらためてOpenCV3.4のcmakeをオプションを指定して実行
・gstreamerバックエンドを使うということでffmpegを無効にしてしまう
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
-DWITH_GSTREAMER=ON -DWITH_FFMPEG=OFF ..
$ make
$ sudo make install
$ sudo ldconfig
▼サンプルソース動作
・VirtualBox上のUbuntu17.10でロジクールカメラが使えないため
サンプルを拾って試してみたが、やはりVideoCaptureのisOpened()で
エラーになるという状況は変わらずだった
・実行結果を見ると、cap_gstreamer.cppに問題があるように思えます
・下記ソースをsample2.cppとして保存し実行した結果
$ g++ sample2.cpp -o sample2 `pkg-config --libs --cflags opencv`
$ ./sample2
OpenCV Error: Unspecified error (GStreamer: unable to start pipeline
) in cvCaptureFromCAM_GStreamer, file /home/openrtm/src/opencv-3.4.0/modules/videoio/src/cap_gstreamer.cpp, line 890
VIDEOIO(cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)): raised OpenCV exception:
/home/openrtm/src/opencv-3.4.0/modules/videoio/src/cap_gstreamer.cpp:890: error: (-2) GStreamer: unable to start pipeline
in function cvCaptureFromCAM_GStreamer
=ERR= can't create video capture
----- sample2.cpp ソース
// Compile with: $ g++ opencv_gst.cpp -o opencv_gst `pkg-config --cflags --libs opencv`
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv) {
// Original gstreamer pipeline:
// == Sender ==
// gst-launch-1.0 v4l2src
// ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB
// ! videoconvert
// ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4
// ! mpegtsmux
// ! udpsink host=localhost port=5000
//
// == Receiver ==
// gst-launch-1.0 -ve udpsrc port=5000
// ! tsparse ! tsdemux
// ! h264parse ! avdec_h264
// ! videoconvert
// ! ximagesink sync=false
// first part of sender pipeline
cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
if (!cap.isOpened()) {
printf("=ERR= can't create video capture\n");
return -1;
}
// second part of sender pipeline
cv::VideoWriter writer;
writer.open("appsrc ! videoconvert ! x264enc noise-reduction=10000 tune=zerolatency byte-stream=true threads=4 ! mpegtsmux ! udpsink host=localhost port=9999"
, 0, (double)30, cv::Size(640, 480), true);
if (!writer.isOpened()) {
printf("=ERR= can't create video writer\n");
return -1;
}
cv::Mat frame;
int key;
while (true) {
cap >> frame;
if (frame.empty())
break;
/* Process the frame here */
writer << frame;
key = cv::waitKey( 30 );
}
}
------
以上です。
---------------------------------------------------
河内 のぶ n.kawauchi @ aist.go.jp
産業技術総合研究所 ロボットイノベーション研究センター
ロボットソフトウエアプラットフォーム研究チーム
テクニカルスタッフ
More information about the openrtm-staff
mailing list