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
型のデータを送る場合は、都度OpenCVCapturerVideoSource
のRender
メソッドを呼び出してください。
映像として送る例はサンプルコードを参照してください。
受信方法
OpenCVVideoRenderer::Listener
を継承したクラスをOpenCVVideoRenderer
のRegisterListener
で登録することによって、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
を継承したクラス内でOpenCVVideoRenderer
のRegisterListener
を呼び出す例です。
複数の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 の登録商標です。