Intel EdisonでUSBカメラを使ってみる

hardware

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回書いたIntel EdisonをUSBオーディオで喋らせるで、EdisonではUSBデバイスも簡単に使えることがわかりました。で、この記事の中で

USBカメラなども繋げてみると楽しそうですね。今度チャレンジしてみたいと思います。

と書きましたので、有言実行!やってみました!

やってみた

デバイス

僕の机の引き出しの奥深くに埃まみれで転がっていたELECOMのUCAM-DLF30MというUSBカメラを繋いでみました。6年前の製品で、なんと30万画素です。タカラトミーのデコパレットでさえ200万画素だというのに...

IMG_0654

Intel Edisonに認識させる

特に難しいことなく、USBポートに接続したらそのまま認識しました。以下dmesgの内容です。

[  113.319202] usb 1-1: new high-speed USB device number 2 using dwc3-host
[  113.418181] usb 1-1: New USB device found, idVendor=056e, idProduct=7001
[  113.418213] usb 1-1: New USB device strings: Mfr=16, Product=96, SerialNumber=0
[  113.418235] usb 1-1: Product: USB2.0 PC Camera
[  113.418254] usb 1-1: Manufacturer: PixArt Imaging Inc.
[  113.525628] uvcvideo: Found UVC 1.00 device USB2.0 PC Camera (056e:7001)
[  113.535225] input: USB2.0 PC Camera as /devices/pci0000:00/0000:00:11.0/dwc3-host.2/usb1/1-1/1-1:1.0/input/input2
[  113.535842] usbcore: registered new interface driver uvcvideo
[  113.535862] USB Video Class driver (1.1.1)

Intel Edisonで使うためのパッケージをインストールする

CUIからUSBカメラを使うためのパッケージはいろんな種類があるのですが、今回は一番お手軽なfswebcamを使いました。opkgコマンドでさくっとインストールします。

# opkg list | grep fswebcam
fswebcam - 20140113-r0 - fswebcam version 20140113-r0  Small and simple webcam software for *nix
fswebcam-dbg - 20140113-r0 - fswebcam version 20140113-r0 - Debugging files  Small and simple webcam
fswebcam-dev - 20140113-r0 - fswebcam version 20140113-r0 - Development files  Small and simple webcam
fswebcam-doc - 20140113-r0 - fswebcam version 20140113-r0 - Documentation files  Small and simple

# opkg install fswebcam

Go言語でWebアプリを作る

Webアプリ、と言っても大したものでは無く、HTTPでアクセスしたらfswebcamで作成したJPG画像を表示する、というだけです。アクセスするたびに実行されるので、Webブラウザのリロードによって最新の映像が表示されます。

package main

import (
	"net/http"
	"os/exec"
)

func handler(w http.ResponseWriter, r *http.Request) {
	cmd := exec.Command("fswebcam")
	cmd.Args = []string{"fswebcam", "./webcam.jpg"}
	cmd.Dir = "."
	err := cmd.Run()
	if err != nil {
		panic(err)
	}
	http.ServeFile(w, r, "webcam.jpg")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

go buildして作成されたバイナリファイルをscpでIntel Edisonに転送し、CUIから実行します。

実行結果

Webブラウザでhttp://<Intel EdisonのIPアドレス>:8080/にアクセスすると、以下のようにJPG画像が表示されます。

192_168_3_14__352×288_

何度かリロードしたらこんな感じになります。モデルはうちの三男(犬)。さすが30万画素、ちょっと暗がりだと映像が荒くてさっぱりわかりませんが、とりあえずちゃんと撮影できてます。

1424152054z03sNykrpZAr5NA1424152052

さいごに

高解像度のUSBカメラを繋げれば、監視カメラ的な使い方はできそうです。顔認識が出来るともっと面白いですね。今度はその辺をやってみたいと思います!