OpenCVを利用する

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

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

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

環境構築

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

sudo apt update sudo apt install libswscale-dev

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

sudo 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 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 . --parallel $(nproc) # Install sudo make install

CMakeLists.txtに追加

OpenCVを利用するためには、必要なライブラリをビルドターゲットに追加する等の必要があります。

クイックスタートで作成したCMakeLists.txtを利用する場合は examples/CMakeLists.txt に下記を追記した上で、ビルド時にフラグを追加してください。

# Enable opencv examples if(ENABLE_OPENCV_EXAMPLE) # Find package/library find_package(OpenCV 4.6.0 REQUIRED) find_library(AVUTIL_LIBRARY avutil) find_library(SWSCALE_LIBRARY swscale) # Add opencv definitions set( SKYWAY_LINUX_DEFINITIONS ${SKYWAY_LINUX_DEFINITIONS} SKYWAY_ENABLE_OPENCV=1) # Add opencv libs set( SKYWAY_LINUX_LIBS ${SKYWAY_LINUX_LIBS} ${OpenCV_LIBRARIES} ${AVUTIL_LIBRARY} ${SWSCALE_LIBRARY}) # Add opencv includes set( SKYWAY_LINUX_INCLUDES ${SKYWAY_LINUX_INCLUDES} ${OpenCV_INCLUDE_DIRS} ${AVUTIL_INCLUDE_DIR} ${SWSCALE_INCLUDE_DIR}) add_subdirectory("opencv") endif()
cmake -DENABLE_OPENCV_EXAMPLE=true -B build cd build make -j

独自に 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 を作成し、 CreateVideoStream に渡すことで cv::Mat 型のデータを元にStreamを作成することが出来ます。

下記のコードは静的画像を送信する例です。

// 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 の登録商標です。