目的
opencv mobileにhttp streamingのプルリクがあることを見つけました。
jpg-streamingで先行実装されており、ブランチをクローンすれば使えることが分かったため、http streamingをお試しするために、ソースからビルドしたOpenCV-Mobileを使ってみることにしました。
opencv mobileにhttp streamingのプルリクが!これは実装されて欲しいなー https://t.co/fXgSYsVWkU
— nnn (@nnn112358) December 3, 2024
OpenCV-Mobileとは
OpenCV-Mobileは、モバイルデバイスや組み込みシステムなど、リソースが限られた環境でのコンピュータビジョン機能の実装を行うためのOpenCVです。Android, iOS やARM Linuxなどに対応しています。
ディープラーニングのフレームワークncnnの開発者として知られるnihui氏によって、開発されています。
注意
OpenCV-Mobileをそのまま使う場合は、releasesにあるzipファイルをダウンロードして解凍することで、ビルドすることなく、すぐに使うことが可能です。
環境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.4 LTS
Release: 22.04
Codename: jammy
opencv-mobileのビルド
opencv-mobileのjpg-streamingのブランチをダウンロードします。
$ git clone https://github.com/nihui/opencv-mobile.git -b jpg-streaming
こちらのスクリプトをダウンロードして、OpenCVにパッチを当てます。
$ cd opencv-mobile
$ curl -O https://raw.githubusercontent.com/nnn112358/opencv-mobile_jpg-streaming_test/main/opencv-mobile-build.sh
$ chmod +x opencv-mobile-build.sh
今回はModule-LLMで使うため、aarch64向けにopencv-mobileのクロスコンパイルを行うことにしました。
$ cd opencv-mobile-4.10.0
$ cmake -B build/x64 -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake \
`cat ./options.txt` -DBUILD_opencv_world=OFF .
$ cmake --build build/x64
$ cmake --install build/x64 --prefix install/aarch64
install/aarch64ディレクトリにOpenCVのライブラリがビルドできていることを確認しました。
install/aarch64
├── bin
│ └── setup_vars_opencv4.sh
├── include
│ └── opencv4
│ └── opencv2
│ ├── core
├── lib
│ ├── cmake
│ │ └── opencv4
│ │ ├── OpenCVConfig-version.cmake
│ │ ├── OpenCVConfig.cmake
│ │ ├── OpenCVModules-release.cmake
│ │ └── OpenCVModules.cmake
│ ├── libopencv_core.a
│ ├── libopencv_features2d.a
│ ├── libopencv_highgui.a
│ ├── libopencv_imgproc.a
│ ├── libopencv_photo.a
│ └── libopencv_video.a
└── share
└── licenses
次に、C++でjpg-streamingを行うためのソースコードとCMakefilesを作成します。
cmakeでビルドを行うと、jpg-streamingを行うためのバイナリが生成されます。
$ mkdir build
$ cd build
$ cmake ..
$ make
ファイル構造は以下のようになっています。
.
├── CMakeLists.txt
├── cv_main.cpp
└── build
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{
cv::VideoCapture cap;
cap.open(0);
cv::VideoWriter http;
http.open(7766);
cv::Mat bgr;
while (1)
{
cap >> bgr;
http << bgr;
}
return 0;
}
cmake_minimum_required(VERSION 3.5)
project(opencv_jpeg_stream)
# コンパイラの設定
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
# ビルドタイプとフラグの設定
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -Wall")
# OpenCVの設定(環境にあわせて書き換え)
set(OpenCV_DIR /xxx/xxx/opencv-mobile-4.10.0/install/aarch64/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
# インクルードディレクトリの設定
include_directories(
${OpenCV_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
)
# 実行ファイルの設定
add_executable(opencv_jpeg_stream cv_main.cpp)
target_link_libraries(opencv_jpeg_stream ${OpenCV_LIBRARIES})