[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