OpenCVを利用する

SkyWay Linux®︎ SDK (以下、Linux SDK ) では、v2.0.0からOpenCVを利用した映像の送受信が行えます。

本ドキュメント以外にOpenCVを利用したサンプルコードも公開しています。

注意 本ドキュメントはクイックスタートに実施済みの方を対象としております。

環境構築

Linux SDKでOpenCVを利用する場合、別途パッケージのインストールが必要になります。

apt update apt install libswscale-dev

利用するOpenCVのバージョンは4.6.0を想定しています。 Ubuntu24.04の場合はaptを利用してinstallしてください。

apt install libopencv-dev

それ以外のOSの場合は下記のOpenCV公式チュートリアルを参考にOpenCV 4.6.0をインストールしてください。 https://docs.opencv.org/4.6.0/d7/d9f/tutorial_linux_install.html

以下はOpenCV 4.6.0のビルド例です。

sudo apt update && sudo apt install -y cmake g++ wget unzip libgtk2.0-dev # Download and unpack sources wget -O opencv.zip https://github.com/opencv/opencv/archive/4.6.0.zip unzip opencv.zip # Create build directory mkdir -p build && cd build # Configure cmake ../opencv-4.6.0 # Build cmake --build . # Install sudo make install

CMakeLists.txtに追加

クイックスタートでは、examples/CMakeLists.txtを利用しているため、ビルド時に以下のフラグを追加するだけでOpenCVの機能を利用できるようになります。

cmake -DENABLE_OPENCV_EXAMPLE=true -B build cd build make -j

もし、上記のexamples/CMakeLists.txtを使わずに独自に実装する場合は、以下の例を参考にCMakeLists.txtを作成してください。

# 各パッケージ、ライブラリを利用します。 find_package(OpenCV 4.6.0 REQUIRED) find_library(AVUTIL_LIBRARY avutil) find_library(SWSCALE_LIBRARY swscale) # target_compile_definitionsにて、既存のSkyWayの定義に加え、SKYWAY_ENABLE_OPENCV=1を追加してください。 # target_include_directoriesにて、既存のSkyWayの定義に加え、${OpenCV_INCLUDE_DIRS} ${AVUTIL_INCLUDE_DIR} ${SWSCALE_INCLUDE_DIR}を追加してください。 # target_link_librariesにて、 ${OpenCV_LIBRARIES} ${AVUTIL_LIBRARY} ${SWSCALE_LIBRARY}を追加してください。

送信方法

以下のコードでは、OpenCVCapturerVideoSourceを作成し、Publishすることでcv::Mat型の画像を送信します。

// OpenCVCapturerVideoSourceを使った映像のPublish auto is_leaving = false; auto capturer = std::make_shared<skyway::media::opencv::OpenCVCapturerVideoSource>(); auto video_stream = skyway::media::StreamFactory::CreateVideoStream(capturer); cv::Mat cvmat = cv::Mat::zeros(cv::Size(640, 480), CV_8UC3); capturer->Render(cvmat); // cv::Mat形式の映像を描画(送信)する。更新の都度Renderを呼び出してください。 skyway::room::interface::LocalRoomMember::PublicationOptions publication_options {}; auto publication = room_member_->Publish(video_stream, publication_options);

画像ではなく映像としてcv::Mat型のデータを送る場合は、都度OpenCVCapturerVideoSourceRenderメソッドを呼び出してください。 映像として送る例はサンプルコードを参照してください。

受信方法

OpenCVVideoRenderer::Listenerを継承したクラスをOpenCVVideoRendererRegisterListenerで登録することによって、OnFrameイベントでcv::Mat形式のデータを受け取ることができるようになります。 下記のコードはOpenCVVideoRenderer::Listenerを継承する例です。

class ExampleClass : public skyway::media::opencv::OpenCVVideoRenderer::Listener { // 省略 void OnFrame(cv::Mat mat) { // 受信した映像をそのまま表示します。 cv::imshow("OpenCVVideoRenderer", mat); cv::waitKey(1); } }

下記のコードはOpenCVVideoRenderer::Listenerを継承したクラス内でOpenCVVideoRendererRegisterListenerを呼び出す例です。 複数のSubscriptionを別々にOnFrameイベントで取得したい場合には、別途クラスを作成し、それぞれをRegisterListenerで登録してください。

// Subscribeした映像をOpenCVVideoRendererで受け取れるようにする skyway::room::interface::LocalRoomMember::SubscriptionOptions subscription_options {}; auto subscription = room_member_->Subscribe(publication->Id(), subscription_options); if (!subscription) { return false; } auto stream = std::dynamic_pointer_cast<skyway::core::stream::remote::RemoteVideoStream>( subscription->Stream()); // OpenCVを利用して映像を表示するようにします。 auto renderer = std::make_unique<skyway::media::opencv::OpenCVVideoRenderer>(); renderer->RegisterListener(this); // OpenCVVideoRenderer::Listenerを継承したクラス内のメソッドで実装する例 renderer->Render(stream);

商標

Linux®︎は、米国およびその他の国における Linus Torvalds の登録商標です。