|
ページ更新: 2005-12-23 (金) (1715日前)
(2002.02.24 作成) (2005-04-18 リンク追加、目次の追加) Che-ez! babeでWebカメラ デジカメ「Che-ez! babe」でWeb Cameraします。 Che-ez! babe 目次 [編集]情報源 #[編集]カメラ #「Che-ez!」など低価格デジカメのNHJが自己破産 -2005/08/09 ドライバ #SourceForge Project Info - linux-stv0680-usb-support
ソフト #
pencam/pensnap - linux-stv0680-usb-support 他にもいろいろあるだろうが(特に動体検知)、あまり探してない。 (当時、UNIX USER誌(だと思う)のKylixの連載で動体検知があり、自分でも作ってみようと思ってたので……) [編集]導入記 #
Linux + Che-wz! SPY(Z)でストリーミング配信 (日替わり実験室) 2005-04-18 以下、wikiの「リンク元」から見つけたページ Che-ez!spyz (stv680) (Mc.N Homepage SDK) 長編技術レポート(備忘録) : Che-ez! SPYZをLinuxのWebカメラにするゾ! (IburiWorks) LinuxとWebカメラ (FrontPage - Ryutaroh) ウェブカメラ(webcam)の部屋 (赤坂さんの家のページ) Linux + Che-ez! SPY(Z)でストリーミング配信(ハードウェア編) (日替わり実験室) 玄箱+USBカメラ=WEBカメラサーバ (.h2o2のお気楽日記) 複数端末を想定したシステム構成および,商品撮影時のカメラ制御について (mikilab-top page) [編集]手順 #[編集]ドライバのコンパイルの準備 #kernel 2.4 が既に入っているとします。 modconf ではこういう階層にある kernel/drivers/media/video videodev kernel/usb/ usbcore usb-ohci /proc/usb ... がなかったので直して、 $ cat /etc/fstab | grep usb none /proc/bus/usb usbdevfs defaaults 0 0 $ kerhen-headers を入れて(一部のヘッダが kernel-source にはなかったので)、シンボリックリンクを貼って、(コレでいいのか?) # apt-get install kernel-headers-2.4.17-k6 # cd /usr/src # ln -s kernel-headers-2.4.17-k6 linux[編集] ドライバのコンパイルと試し #SourceForge Project Info - linux-stv0680-usb-support から stv680 driver 0.25 を入手し、展開し、コンパイル、insmod する。 $ tar zxvf stv680-0.25.tar.gz $ cd stv680-0.25 $ make gcc -D__KERNEL__ -I/usr/src/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i586 -malign-functions=4 -fno-strict-aliasing -DMODULE -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -c stv680.c -o stv680.o stv680.c: In function `stv680_start_stream': stv680.c:816: warning: implicit declaration of function `usb_fill_bulk_urb' # su # insmod ./stv680.o ./stv680.o: unresolved symbol usb_fill_bulk_urb kernel 2.4.17 を使っているので、stv680.c の stv680_start_stream() の次の場所を変更して回避した。本来はkernelを確かめて必要なら再構築すべきだが。 $ diff stv680.c.old stv680.c 815c815 < #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 16) --- > #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 4, 17) $ make gcc -D__KERNEL__ -I/usr/src/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i586 -malign-functions=4 -fno-strict-aliasing -DMODULE -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -c stv680.c -o stv680.o $ su # insmod ./stv680.o # make install する。 # make install `stv680.o' -> `/lib/modules/2.4.17-k6/kernel/drivers/usb/stv680.o' depmod -a # insmod stv680 Using /lib/modules/2.4.17-k6/kernel/drivers/usb/stv680.o #[編集] ドライバの動作確認、デバイスの作成、USBの挙動の確認 #/var/log/syslog を監視しながら、USBに挿す $ tail -f /var/log/syslog Feb 17 21:57:08 koca kernel: hub.c: USB new device connect on bus1/1, assigned device number 4 Feb 17 21:57:08 koca kernel: stv680.c: [stv680_probe:1576] STV(i): STV0680 camera found. Feb 17 21:57:08 koca kernel: stv680.c: [stv680_probe:1604] STV(i): registered new video device: video0 Feb 17 21:57:08 koca usbmgr[834]: vendor:0x553 product:0x202 Feb 17 21:57:08 koca usbmgr[834]: class:0xff subclass:0x0 protocol:0x0 Feb 17 21:57:08 koca usbmgr[834]: USB device isn't matched the configuration /dev/video0 と /dev/video を作って、 # mknod /dev/video0 c 81 0 # cd /dev # ln -s video0 video # chown root:video video0 # chown root:video video カメラを繋いで、lsusb の結果を見る。 # lsusb
(以下、カメラの情報のみ抜粋)
Bus 001 Device 007: ID 0553:0202 VLSI Vision Ltd.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0553 VLSI Vision Ltd.
idProduct 0x0202
bcdDevice 0.00
iManufacturer 1 STMicroelectronics
iProduct 2 USB Dual-mode Camera
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 34
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
Remote Wakeup
MaxPower 70mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type none
wMaxPacketSize 64
bInterval 0
Language IDs: (length=14)
0409 English(US)
040c French(French)
0407 German(German)
0410 Italian(Italian)
0c0a Spanish(Modern)
0416 Po rtugese(Portugese)
カメラを繋いで、/proc/vide/stv680/video0 を見てみる。 $ cat /proc/video/stv680/video0 driver_version : v0.25 model : STV0680 in use : no streaming : no num_frames : 2 Current size : 0x0 swapRGB : (auto) off Palette : 0 Frames total : 0 Frames read : 0 Packets dropped : 0 Decoding Errors : 0[編集] キャプチャ #動作確認のために、手頃なキャプチャ用ソフトを探して、入れる。(vgrabbj、motion) # apt-cache search webcam came - Rewrite of xawtv webcam app using imlib2 camstream - collection of tools for webcams and other video-devices cqcam - Color QuickCam (PC/Parallel) control program feh - imlib2 based image viewer gkrellkam - GKrellM plugin that displays a periodically updating image gqcam - GTK Webcam control motion - V4L Capture Program supporting Movement Detection qce-source - source code for QuickCam Express kernel module vgrabbj - grabs a image from a camera and puts it in jpg/png format webcam - capture and upload images # apt-get install webcam vgrabbj motion vgrabbj はこういう風に使う。-S はSwitch BGR colormap to RGB colormap (try if colors are odd) だそうだ。 $ vgrabbj -S -f test.jpeg[編集] CGIで画像を転送する #まずは、手元のLinux機(Che-ez! babeを繋ぐ) で画像を提供できるようにする。 /etc/groups の video に www-data を足して、grpconv (addgrpあたりでできたっけ?) # grep video /etc/group video:x:44:www-data # grpconv vgrabbj を呼ぶcgiを作って……これでブラウザから表示できるようになる。 #!/usr/bin/perl
use strict;
use FileHandle;
my $temp= "./camera.$$.jpeg";
system "/usr/bin/vgrabbj -S -f $temp > /dev/null 2>&1";
if( open JPEG, $temp ) {
my $buffer;
print "Content-Length: ", -s JPEG, "\n";
print "Content-Type: image/jpeg\n";
print "Pragma: nocache\n";
print "Refresh: 15\n";
print "\n";
print $buffer while read JPEG, $buffer, 4096;
close JPEG;
}
close STDOUT;
unlink $temp if -e $temp;
exit;
(2002.09.02補足。vgrabbj 0.9.1-1(debian testing) の場合、/etc/vgrabbj.conf に設定あり。タイムスタンプ設定は UseTimeStamp On、書式は man strftimeすれば判る) 次に、discypus.jp からこのCGIにアクセスするようにする。こちらもCGI。これでdiscypus.jpで画像を表示できる。 #!/usr/bin/perl use strict; use LWP::Simple; use FileHandle; my $page = get 'カメラを繋いだPCのURIをココに書く'; print "Content-Length: ", length $page, "\n"; print "Content-Type: image/jpeg\n"; print "Pragma: nocache\n"; print "Refresh: 15\n"; print "\n"; print $page; exit; なお、運用時にはCGIじゃなくてcronで定期的に処理する予定。 pencam/pensnap を入れてみる (作成中) #SourceForge Project Info - linux-stv0680-usb-support のpencam/pensnap で遊んでみる。 pencam2-0.65 $ make
gcc -g -O2 -I/usr/include -Wall -c pencam2.c -o pencam2.o
gcc -g -O2 -I/usr/include -Wall -c pencam2-misc.c -o pencam2-misc.o
pencam2-misc.c: In function `common_do_function':
pencam2-misc.c:700: warning: use of `l' length character with `f' type character
pencam2-misc.c:708: warning: use of `l' length character with `f' type character
gcc -g -O2 -I/usr/include -Wall -c pensnap2.c -o pensnap2.o
gcc -g -O2 -I/usr/include -Wall -c bayer.c -o bayer.o
gcc -g -O2 -I/usr/include -Wall -c unsharp.c -o unsharp.o
gcc -g -O2 -I/usr/include -Wall -c sharpen.c -o sharpen.o
gcc -g -O2 -I/usr/include -Wall -c saturate.c -o saturate.o
gcc -g -O2 -I/usr/include -Wall *.o -o pencam2 -L/usr/lib -lusb -lm
# ./pencam2
usb_claim_interface error
usb_claim_interface error
* * * * * PENCAM2 ver 0.65 for STV0680 usb cameras * * * * *
STV Camera @ Camera Pictures Firmware ASIC rev Sensor ID
001:034 0 1.00 7.60 410.6
* * * * * * * * * * * * * * * * * * * * * * * * *
Supported formats: CIF (352x288) QCIF (176x144)
* * * * * * * * * * * * * * * * * * * * * * * * *
YOUR CHOICES ARE: (NOTE: choices are case sensitive)
NOTE: /root/.pencam2rc file is NOT present.
Press 'w' to create file now.
C = PenCam functions and settings
S = PenSnap functions and settings
D = Load default values
q = Quit.
Enter your choice:
pensnap-0.21 $ make gcc -g -O2 -I/usr/include -Wall -c pensnap.c -o pensnap.o gcc -g -O2 -I/usr/include -Wall -c bayer.c -o bayer.o gcc -g -O2 -I/usr/include -Wall -c sharpen.c -o sharpen.o gcc -g -O2 -I/usr/include -Wall -c saturate.c -o saturate.o gcc -g -O2 -I/usr/include -Wall pensnap.o bayer.o sharpen.o saturate.o -o pensna p -L/usr/local/lib -lusb -lm # ./pensnap usb_claim_interface error usb_claim_interface error * * * * * PENSNAP ver 0.21 for STV0680 usb cameras * * * * STV Camera @ Camera Pictures Firmware ASIC rev Sensor ID 001:037 0 1.00 7.60 410.6 * * * * * * * * * * * * * * * * * * * * * * * * Supported formats: CIF (352x288) QCIF (176x144) * * * * * * * * * * * * * * * * * * * * * * * * YOUR CHOICES ARE: p = Change the path name (/root/) f = Change the filename (snapshot) l = Toggle Gamma correction-White balance (Auto Select) c = Toggle picture format (CIF) b = Decrease brightness (1.00) t = Toggle sharpening filter (ON @ 66%) g = Change sharpen percent s = Toggle saturate filter (ON @ 50%) m = Change saturate percent d = Change the time delay ( 60 sec) i = Toggle camera beep (ON) q = quit. z = start autosnap x = stop autosnap. Enter your choice: Press 'q' again to confirm: |