2014年4月5日土曜日

BeagleBoneBlackでWebカメラ

広角のUSBカメラを購入

iBUFFALO マイク内蔵200万画素WEBカメラ 120°広角ガラスレンズ搭載モデル BSW20KM11BK


2014.4.14 下記でいろいろやったが、結局、
httpd側:
 1. request 受信
 2. flagファイルにシーケンス番号書き込み
 3. udpでファイル保存通知待ち
 4. response送信
capture側:
 1. usbからキャプチャするたびにflagファイルを確認して、更新されていたらファイル保存
 2. udpでファイル保存を通知
とした。
これでファイルの破壊や、ハングがなくなった。

ただし、無線LANもUSBを使っているので画像はVGAではなくQVGAとした。
これでなんとか3fpsくらいで更新している。

    2014.4.16 追記
     # cpufreq-set --min 1G
     とするとVGAでも動いた
      (それまでは300MHzだった。負荷が断続的なのでCPU速度が切り変わらなかった?)

また、無線LANでもセキュリティを有効にしているとパフォーマンスが落ちる。
(Ad-HocモードでiPhoneと直につなげた場合は、10fps近くでる)

ubuntu@ubuntu-armhf:~$ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
Index       : 0
Type        : Video Capture
Pixel Format: 'YUYV'
Name        : YUV 4:2:2 (YUYV)

Index       : 1
Type        : Video Capture
Pixel Format: 'MJPG' (compressed)
Name        : MJPEG

ubuntu@ubuntu-armhf:~$ lsusb
Bus 001 Device 004: ID 0789:0170 Logitec Corp. LAN-W300AN/U2 Wireless LAN Adapter
Bus 001 Device 003: ID 0458:708c KYE Systems Corp. (Mouse Systems) 
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ubuntu@ubuntu-armhf:~$ v4l2-ctl --all       
Driver Info (not using libv4l2):
Driver name   : uvcvideo
Card type     : USB_Camera
Bus info      : usb-musb-hdrc.1.auto-1.2
Driver version: 3.8.13
Capabilities  : 0x84000001
Video Capture
Streaming
Device Capabilities
Device Caps   : 0x04000001
Video Capture
Streaming
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height  : 640/480
Pixel Format  : 'YUYV'
Field         : None
Bytes per Line: 1280
Size Image    : 614400
Colorspace    : SRGB
Crop Capability Video Capture:
Bounds      : Left 0, Top 0, Width 640, Height 480
Default     : Left 0, Top 0, Width 640, Height 480
Pixel Aspect: 1/1
Streaming Parameters Video Capture:
Capabilities     : timeperframe
Frames per second: 30.000 (30/1)
Read buffers     : 0
                     brightness (int)    : min=-64 max=64 step=1 default=0 value=0
                       contrast (int)    : min=0 max=95 step=1 default=32 value=32
                     saturation (int)    : min=0 max=100 step=1 default=55 value=55
                            hue (int)    : min=-2000 max=2000 step=1 default=0 value=0
 white_balance_temperature_auto (bool)   : default=1 value=1
                          gamma (int)    : min=100 max=300 step=1 default=165 value=165
           power_line_frequency (menu)   : min=0 max=2 default=1 value=1
      white_balance_temperature (int)    : min=2800 max=6500 step=10 default=4600 value=4600 flags=inactive
                      sharpness (int)    : min=1 max=7 step=1 default=2 value=2
         backlight_compensation (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute (int)    : min=50 max=10000 step=1 default=166 value=166 flags=inactive

opencvで取り込むとQVGA YUYVで2fpsが限度な感じ。

<http://derekmolloy.ie/udp-video-streaming-beaglebone-black/>

あたりを参考にすると、mjpegを使うのが良さそう。

上記のリンク先のcapture.cを修正して
mjpeg VGAで取り込んでファイルに保存させた。
webサーバー側はCGIでもいいが簡単に済ませたかっので
<http://www.geekpage.jp/programming/linux-network/http-server.php>
を参考になんちゃってサーバーを立てた。

で、以下のhtmlをlighttpdから見えるところに置いて
キャプチャープログラムとなんちゃってWebサーバーを起動。

============
<html>
<head>
<script type="text/javascript">
function loadImage()
{
    var date = new Date();
    var name = "http://192.168.111.2:8088/cap.jpg?id=" + date.toString() + " " + date.getMilliseconds().toString();
    document.getElementById("name").innerHTML = name;
    document.getElementById("camera").src = name;
//alert(name);
}
function load()
{
    loadImage();
    var img = document.getElementById("camera");
    img.onload = function(){
        setTimeout("loadImage()", 100);
    };
    img.onerror = function(){
        setTimeout("loadImage()", 1000);
    }
};
</script>
</head>
<body onload="load();">
<script type="text/javascript">
//setInterval("loadImage()", 500);
</script>
<div><img  src="http://192.168.111.2:8088/cap.jpg" id="camera" /></div>
<div id="name"></div>
</body>
</html>
============

ブラウザでページを開くと4fpsくらいで表示されました。

javascriptでのwaitの100msecを短くすれば早くなりましたが、ハングしたりで不安定になったので100msecとしました。

jpegをudpで垂れ流すようにして受信プログラムを作ればいいのですがブラウザでで表示したいのでパス。

websocketは使えるのかな?

あと、mjpeg-steamerとか使えそうですが試していません。
<http://sourceforge.net/projects/mjpg-streamer/>
<http://www.acmesystems.it/video_streaming>

なんちゃってWebサーバーで
multipart/x-mixed-replace;boundary=<boundary-name> 
<http://en.m.wikipedia.org/wiki/Motion_JPEG#M-JPEG_over_HTTP>
を試したが、レスポンス、安定性、iOSでの表示ともにいまいちだった。

Bus 001 Device 001:  1d6b:0002 Linux Foundation 

0 件のコメント:

コメントを投稿