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 installCMakeLists.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型のデータを送る場合は、都度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 の登録商標です。