2016.9に発売したArmadillo-X1で、OpenCVを使った画像処理を試してみました。
1. 構成
今回はArmadillo-X1にUSBカメラを接続して評価してみます。 今回利用したUSBカメラは家電量販店などで購入した以下の製品になります。
2. OpenCVのライブラリをインストール
Armadillo-X1の標準のユーザーランドには、OpenCVのライブラリがインストールされていません。 今回は、サンプルソースコードのビルドもArmadillo-X1上で行うこととしますので、開発用パッケージを以下のようにインストールします。
root@armadillo:~# apt-get install libopencv-dev
なお、Armadillo-X1のユーザーランドであるDebian GNU/Linux 8(jessie)で用意されているOpenCVのパッケージは、2.4.9になります。
3. サンプルソースコードをビルド
サンプルとして使ったソースコードは、過去に公開したArmadillo-810の以下のHowToのソースコードに、OpenCVの各APIの処理速度の計測できるようにしたものを使うことにします。
Howto : Armadillo-810でOpenCVを用いた画像処理
サンプルソース
ネットワーク/USBメモリ経由などで上記サンプルソースをArmadillo-X1上にコピーしたあと、以下のようにビルドしてください。
root@armadillo:~# ls
edge-detection-yuyv-v4l2.tar.gz
root@armadillo:~# tar zxvf edge-detection-yuyv-v4l2.tar.gz
edge-detection-yuyv-v4l2/
edge-detection-yuyv-v4l2/edge-detection.o
edge-detection-yuyv-v4l2/Makefile
edge-detection-yuyv-v4l2/edge-detection.c
edge-detection-yuyv-v4l2/edge-detection
root@armadillo:~# cd edge-detection-yuyv-v4l2/
root@armadillo:~/edge-detection-yuyv-v4l2# make
cc -c -o edge-detection.o edge-detection.c
cc -o edge-detection edge-detection.o -lopencv_core -lopencv_highgui -lopencv_imgproc -lm
4. サンプルを実行
今回のサンプルはキャプチャを20回連続で繰り返した後、最後にキャプチャした画像を、グレースケール→エッジ検出するというものです。 また最後のキャプチャの処理時間と、グレースケール変換、エッジ検出の処理時間を標準出力に表示し、以下の画像をbmp形式で保存します。
- 元画像
- グレースケース画像
- エッジ画像
サンプルは以下の様に、第一パラメータにUSBカメラのデバイス番号を指定します。
root@armadillo:~/edge-detection-yuyv-opencv# ./edge-detection 0
capture time : 48.3950 msec
color conversion time: 7.4749 msec
edge-detection time: 48.7759 msec
5. 性能比較
同じサンプルアプリを、Armadillo-840+USBカメラの構成で動かしてみて、性能比較をしてみました。 以下は、10回サンプルアプリを実行した平均値になります。
Armadillo-840 | Armadillo-X1 | |
---|---|---|
キャプチャ(cvQueryFrame) | 47.6204 ms | 48.3312 ms |
グレースケール変換(cvCvtColor) | 14.64647 ms | 7.4383 ms |
エッジ検出(cvCanny) | 49.36608 ms | 46.194 ms |
キャプチャ/エッジ検出はほぼ差がありませんでしたが、グレースケール変換は、X1が840の約半分になっています。 ただ、Armadillo-840のOpenCVライブラリは2.3.1なので、もしかするとOpenCVのライブラリが2.4.9で最適化されている影響かも知れません。
そのうち、また他の比較も試してみたいと思います。
以上