Module-LLMでソースからビルドしたOpenCV-Mobileを使ってみる

## 目的
opencv mobileにhttp streamingのプルリクがあることを見つけました。
 
 ~~jpg-streamingで先行実装されており、ブランチをクローンすれば使えることが分かったため、http streamingをお試しするために、ソースからビルドしたOpenCV-Mobileを使ってみることにしました。~~
 Commit 8b1a95dでopencv mobileに導入されました。


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">opencv mobileにhttp streamingのプルリクが！これは実装されて欲しいなー <a href="https://t.co/fXgSYsVWkU">https://t.co/fXgSYsVWkU</a></p>&mdash; nnn (@nnn112358) <a href="https://twitter.com/nnn112358/status/1863908948056953233?ref_src=twsrc%5Etfw">December 3, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## OpenCV-Mobileとは
　OpenCV-Mobileは、モバイルデバイスや組み込みシステムなど、リソースが限られた環境でのコンピュータビジョン機能の実装を行うためのOpenCVです。Android, iOS やARM Linuxなどに対応しています。
　ディープラーニングのフレームワークncnnの開発者として知られるnihui氏によって、開発されています。

https://github.com/nihui/opencv-mobile

## 注意

OpenCV-Mobileをそのまま使う場合は、releasesにあるzipファイルをダウンロードして解凍することで、ビルドすることなく、すぐに使うことが可能です。

https://github.com/nihui/opencv-mobile/releases




## 環境

```
$  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
```

こちらのスクリプトをダウンロードして、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
$ ./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を行うためのバイナリが生成されます。

```bash
$ mkdir build
$ cd build
$ cmake ..
$ make 
```

ファイル構造は以下のようになっています。

```
.
├── CMakeLists.txt
├── cv_main.cpp
└──  build
```


```cv_main.cpp
#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;
}

```



```CMakeLists.txt
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})
```