Howto

Armadillo-810上でのOpenCVの画像処理結果を確認する

Armadillo-810は、小型CMOSセンサとARM Cortex-A9搭載CPUボードを一体化させ、柔軟な画像処理を行う事の出来るインテリジェントカメラプラットフォームです。 OpenCV等による画像処理の結果を確認したい場合、標準ではディスプレイ環境が備わっていないため、PCでの開発時のようにOpenCVのcvShowImage関数等を利用して処理結果を逐次確認する事が出来ません。

そこで、本HowToではArmadillo-810上での画像処理状況を逐次確認するための方法をご紹介します。 本手法は、OpenCVアプリケーションにて画像処理結果をjpegファイルとして保存、保存したjpegファイルをmjpg-streamerを用いてネットワーク経由で送信し、PC等のブラウザで閲覧することで実現できます。

以下に動作手順を示します。

1. OpenCVアプリケーションの準備
2. Armadillo-810のネットワーク設定
3. Armadillo-810でmjpg-streamerを起動
4. OpenCV アプリケーション実行
5. PC側でブラウザを立ち上げてArmadillo-810に接続

前提条件

本Howtoでは、Armadillo-810でOpenCVの動作経験のある方を対象としています。 もし経験の無い方は Howto: Armadillo-810でOpenCVを用いた画像処理をまずはじめにご参照ください。

開発環境

動作確認に使用した環境は以下の通りです。

ユーザーランドatmark-dist-20130704 Linuxカーネルlinux-3.4-at5 ATDEatde5-i386-20130710 -->

ハードウェア

Armadillo-810 Armadillo-810 カメラモデル開発セット
USB-Ether 変換アダプタ IO-DATA ETG2-US2

ソフトウェア

ユーザーランド atmark-dist-20130704
Linuxカーネル linux-3.4-at5
ATDE atde5-i386-20130710

OpenCVアプリケーションの準備

Armadillo-810上での画面処理状況を逐次確認するために、まず既存のOpenCVアプリケーションに、jpegファイルを書き出すループを追加します。

以下は、jpegファイルを出力するためのコードの一例です。cvSaveImage関数の出力ファイル名の拡張子を.jpgと指定することにより容易に実現できます。

下記コードをビルドし、Howto: Armadillo-810でOpenCVを用いた画像処理と同様の手順で本アプリをユーザーランドに組み込み、フラッシュに書き込んだ後、Armadillo-810を起動してください。ここでは、ビルドしたアプリ名をsample_convert_jpgとします。

#include<stdio.h>                          
#include<opencv/cv.h>
#include<opencv/highgui.h>

int main(int argc, char **argv)
{
        CvCapture *capture;
        IplImage *src_img, *gray_img, *edge_img;
        int ret = 0;
    
        if (argc != 2) {
                printf("Usage: sample_convert_jpg <v4l2_device_index> \n");
                return -1;
        }   
    
        /* CvCapture構造体の初期化、:引数で使用するカメラを指定する。 */
        if ((capture = cvCreateCameraCapture(atoi(argv[1]))) == NULL) {
                fprintf(stderr, "No camera device detected. \n");
                return -1;
        }
        
        /* カメラからの入力画素数の設定。 */
        cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);
        cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
        
        /* カメラからの画像取得、及び8bit,1chの画像領域を生成 */
        if ((src_img = cvQueryFrame(capture)) == NULL) {  
                fprintf(stderr, "Failed to get the frame from camera \n");
                cvReleaseCapture(&capture);
                return -1;
        }   

        gray_img = cvCreateImage(cvGetSize(src_img),IPL_DEPTH_8U,1);
        edge_img = cvCreateImage(cvGetSize(src_img),IPL_DEPTH_8U,1);

        /* 画像処理のループ */
        while (1) {
                /* カメラからの画像取得 */
                if ((src_img = cvQueryFrame(capture)) == NULL) {
                        fprintf(stderr, "Failed to get the frame from camera \n");
                        ret = -1;
                        break;
                }
                /* グレースケールへ変換 */
                cvCvtColor(src_img, gray_img, CV_BGR2GRAY);

                /* エッジ画像へ変換 */
                cvCanny(gray_img, edge_img, 50.0, 200.0, 3);
        
                /* 画像処理後の画像の保存(jpeg) */
                cvSaveImage("/var/tmp/edge_img.jpg", edge_img, NULL);
        }
        
        /* 終了処理 */
        cvReleaseCapture(&capture);
        cvReleaseImage(&gray_img);
        cvReleaseImage(&edge_img);

        return ret;
}

Armadillo-810のネットワーク設定

Armadillo-810 カメラモデル開発セットでは、有線LANや無線LANといったネットワークがありません。市販のUSB-Ether変換アダプタ※1や、ATB-A810LAN, ATB-A810WLAN といったネットワーク対応拡張ボードを利用する等、Armadillo-810がネットワークにつながる環境を構築しておく必要あります。
※1 Armadillo-810で動作確認がとれたデバイスは「関連製品(他社製)」メニューから検索してください。

本Howtoでは、ETG2-US2 を利用します。 ドライバは標準カーネルイメージにすでに組み込まれているので、カーネルをコンフィグし直す必要はありません。 Armadillo-810起動後、以下のようにeth0を有効にします。

[armadillo ~]# ifup eth0 

Armadillo-810でmjpg-streamerを起動

Armadillo-810のデフォルトイメージではユーザーランドにmjpg_streamerが含まれています。mjpg_streamerを使うと、Armadillo-810内にある画像ファイルを、ネットワーク接続されたPCのブラウザ経由で表示することが可能です。

一例として、以下のようにする事で/var/tmp/以下に存在するjpegファイルをブラウザに出力させる事が可能です。

[armadillo ~]# LD_LIBRARY_PATH=/usr/lib/mjpg_streamer/ mjpg_streamer -i "input_file.so -f /var/tmp" -o "output_http.so -w /usr/lib/mjpg_streamer/www -p 8080" &

OpenCV アプリケーション実行

Howto: Armadillo-810でOpenCVを用いた画像処理 と同様の理由で、まずuvc-gadgetのプロセスを終了させる必要があります。ここでは、killallコマンドを利用してuvc-gadgetプロセスを終了させます。

[armadillo ~]# killall uvc-gadget

アプリケーションを実行します。

[armadillo ~]# sample_convert_jpg 1

PC側でブラウザを立ち上げてArmadillo-810に接続

PC側のブラウザを立ち上げて以下のURLにアクセスする事で、Armadillo-810よりストリーミング配信されたjpeg画像を見る事が出来ます。

http://(※Armadillo-810のアドレス):8080/?action=stream

うまくjpeg画像が表示されない場合は、

  • /var/tmp/以下にjpegファイルがダンプされているか
  • PCとArmadillo-810の間でpingが通るか

をまず確認してみてください。

複数の画像処理結果を確認するには

複数の画像処理結果を確認したい場合は、以下のように、jpegの保存先ディレクトリとポート番号を変更した別プロセスのmjpeg_streamerを起動することで実現できます。OpenCVアプリのjpeg画像出力パス、PC側のブラウザに設定するポート番号も適宜変更してください。

[armadillo ~]#LD_LIBRARY_PATH=/usr/lib/mjpg_streamer/ mjpg_streamer -i "input_file.so -f /var/tmp_alt/" -o "output_http.so -w /usr/lib/mjpg_streamer/www -p 8081" &