Tinker Board でOpenCV＋GStreamer

#目次
[1.目的](#1-目的)
[2.基本情報](#2-基本情報)
[3.ここでハマった](#3-ここでハマった)
[4.opencvビルドと実行](#4-opencvビルドと実行)
[5.おわりに](#5-おわりに)

# 1. 目的
- 手持ちのTinker Board 2SでMIPIカメラビデオキャプチャする
    - MIPIカメラはメーカ非公認だけど動くと言えば動く
- お仕事がらみで情報収集をする
    - TinkerOSの基本的な使い方
    - カメラを用いたソリューション事例をつくってみる
    - 社内向けでもあるが一般情報なのでこちらで公開します
- せっかく与えられたので動かしたい


# 2. 基本情報

## TinkerBoardについて簡単に確認

https://tinker-board.asus.com/jp/product/tinker-board-2s.html

- 開封の儀のあとざっくり見てみました
    - Jetson Nanoや Raspberry Piのようなシングルボードコンピュータ
    - ArmコアCPUにArmのGPU Mali-T860搭載
    - ラズパイ互換のIOとかついていて使えるものが結構ありそう
    - USB 3.2 Gen 1搭載 
    - Tinker用ですがAndroid11が使用可能
    - TinkerOS（Debian系）も準備されています

- 簡単に手持ち競合製品を比べてみました
    - 各製品のCPUなどは各製品のサイトを参照下さい（スイマセン）
    - Tinker Board 2 DebianはここではTinkerOSとします（名前が長い）
    - 簡易表示はターミナルからコマンドを実行した場合になります
     
| 項目/製品　 | Tinker Board 2S | Raspberry Pi 4B | Jetson Nano |
|:------------:|:-------------:|:------------:|:------------:
|　OS  　   |  TinkerOS     |  Raspberry Pi OS  | JetPack(Ubuntu)  |
| メモリ      | 2GB/4GB       | 4GB/8GB       |2GB/4GB         |
| CSIコネクタ | 　　有り　　　 | 　　有り　　　 | 　　有り　　　 |
| ラズパイMIPIカメラ | 表示可能 | 表示可能 | 表示可能 |
| Python3    |    3.7.3   |    3.9.2   |     3.6.9    |
| V4L       | 可能       | 可能       | 可能         |
| GStreamer    | 可能     | 可能   |可能  |
| 簡易表示1   | gst-launch | gst-launch |gst-launch  |
| 簡易表示2    | - | libcamera-〇〇      |     nvgstcapture   |

:::note info
補足
- 共通
    - テストに使用したMIPIカメラはTinker Boardはカメラメーカとしては非対応です
    - カメラはラズパイ、Jetsonで標準で動くIMX219センサのものを使用しました
    
- Raspberry Pi 4B
    - OSはbullseyeを使用しています
    - ターミナルコマンドは拙作のページまたは公式・上級者のいいサイトをご覧ください
- Jetson Nano
    - OSはJetPack4.6を使用しています
    - ターミナルコマンドは拙作のページまたは公式・上級者のいいサイトをご覧ください

:::

https://qiita.com/Manyan3/items/0b6dc29014e704d9ba34


# 3. ここでハマった

- pythonで簡単なコードを実行・・・？動かない

## 失敗の原因と模索
- opencv-pythonをインストール
    - 開発用のUbuntuは基本的にこのコマンドでやっていました
    - PCなので、そこまで深く考えていませんでした…

- 24時間ダイヤルに電話(中国)
    - 購入証明をといわれて準備していなかった・・・ので話にならず

- テクニカルサポートのアドバイス
    - GStreamerのパイプラインの間違い指摘がありました  (autovideosink--＞appsink)  
    - その後、追加のアドバイスが無かったので、自己解決した旨伝えようと思います
- テクニカルサポートに提供したコード

```
import cv2

src = "gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! videoconvert ! autovideosink"

# autovideosinkがpythonコードないではappsink

cap=cv2.VideoCapture(src, cv2.CAP_GSTREAMER)
    
while cap.isOpened():
    ret, frame_read = cap.read()
    cv2.imshow('Read',frame_read)
    cv2.waitKey(30)
cap.release()


```

:::note info
インフォメーション
- 上記項目では３コアまでで、４コア指定だと落ちると書きましたが、どうも尼のマーケットプレイスから来たこの製品のACが容量不足(12V2A）だった製の模様。
- 公式では19Vの45Wまで対応なので口の合うノートPCのアダプタ接続でまともに使える様になりました。

:::

## 関連ライブラリインストール(22/12/23追記)

```ラズパイ:ターミナル
sudo apt install gstreamer1.0-omx gstreamer1.0-tools gstreamer1.0-plugins-*
sudo apt install libatlas-base-dev
sudo apt install libjasper-dev
    
```

- V4lがなければ・・・

```ラズパイ:ターミナル

sudo apt install v4l-utils
    
```



# 4. opencvビルドと実行
0. GStreamerのインストール(インストールしていない場合)

```ラズパイ:ターミナル

sudo apt-get install libx264-dev libjpeg-dev

sudo apt-get install libgstreamer1.0-dev \
     libgstreamer-plugins-base1.0-dev \
     libgstreamer-plugins-bad1.0-dev \
     gstreamer1.0-plugins-ugly \
     gstreamer1.0-tools \
     gstreamer1.0-gl \
     gstreamer1.0-gtk3

sudo apt-get install gstreamer1.0-qt5
sudo apt-get install gstreamer1.0-pulseaudio


```

1. インストール済みのopencv-pythonの情報を確認
    - GStreamer の項目がみごとにNOでした。
    

    ```ラズパイ:ターミナル
    python3

    import cv2

    print(cv2.getBuildInformation())

    ```
 2. opencv-pythonをアンインストールします

    ```

    pip3 uninstall opencv-python

    ```

 3. opencv をGitHubよりクローンして、ビルドしていきます

    ```ラズパイ:ターミナル

    #解凍するフォルダを選んでおくなどしておきます
    #私はDownloadフォルダで実行しました
    
    git clone https://github.com/opencv/opencv.git
    #ダウンロード方法によってはフォルダ名が異なる場合もあります
    cd opencv
    mkdir build && cd build
    #設定項目は一例です。必要な記載をしてください
        
     cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D WITH_GTK=ON -D WITH_GSTREAMER=ON -D WITH_FFMPEG=OFF -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..

    #4コア以上で実行するとどうしても途中で落ちてしまうので以下の設定で行いました    

    make -j3
    #2時間以上放置・・・
    #完了後にインストール
    sudo make install
        
    ```

 4. 今度は確認するとGStreamerがYESになっていました
 5. 実行してみます

![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/699cd745-2ebb-f91a-31ed-109997f3f553.jpeg)


- ようやく目的のビデオキャプチャができました


# 5. おわりに
- Jetsonやラズパイではこのような苦労をした記憶がなかったのですが、ビルドすればきちんと動作することは分かりました
- Android11ではMIPIカメラでも難なくアイコンクリックで表示されました
    - 手を加えるスキルが無かったので、深追いはしていません
- これからTinker Boardを利用される方のお役に立てれば幸いです

:::note info
2022/9/2 追加
- ほとんどの方には必要ないかと思いますが、テスト用の簡単なコードをGithubに載せました。
- 何はともあれ、IMX219以外の動作はちょっと難しいかなぁとは思います。

:::

https://github.com/mi-kaneyon/TinkerboardOpencv/tree/main