HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0411
HSP2年生USB WEBカメラで動体検知9解決


HSP2年生

リンク

2007/4/11(Wed) 21:14:12|NO.7277

USB WEBカメラで動体検知プログラムを作りたいのですが以下のような大雑把な処理ルーチン
を考えました。

1.WEBカメラを起動する。
2.描画中の画像で検知する範囲を指定する。
3.その範囲の画像をキャプチャーする。
4.キャプチャーした画像が前の画像と比べて変化したかを調べる。
5.変化があれば→処理Aへ、無ければ3.へLoop。

この構想をHSPで実現するためWEBで色々探しましたが良いサンプルが見つかりません。
まず1.のWEBカメラを起動する方法がわかりません。
2.は全くお手上げです。3.はスクリーンキャプチャのサンプルは見つかるのですがWEBカメラ
の画像はキャプチャできません。キャプチャできればその後はなんとかなると思っています。

このような状況なのですがどのようなコマンドを使えば良いか或いはプラグイン、DLLなど
上記実現のためのアドバイスを願い致します。



この記事に返信する


ふほ

リンク

2007/4/12(Thu) 09:22:05|NO.7307

興味のある話題なので調べ始めました。

全く知識の無い所から、スタートです。

どうやら
http://mobiquitous.com/programming/usbcamera.html
様によると、

「Video for Windowsを利用する方法とDirect Showを利用する方法」
の二通りがあるようです。サンプルもあるようですが、C#のようですね。

HSPのプラグインは1分程度ググった所では、見つかりませんでした。
よく探せば有るのかもしれませんが、見つからなかった以上無いものとして話を続けます。

最終的には、HSP本体に機能が無い以上、もうプラグイン自作しか無い気がします(笑
HSPにはCOMオブジェクト操作命令と言うのもあるみたいですが、私はそちらはよく知りません。

自作に当たっては、
http://www.ecoop.net/coop/vfw/aviapi.html
様、
http://www.geekpage.jp/programming/directshow/
様が参考になりそうです。

後者の方などは、
>ビデオ入力デバイスからの映像を表示する
とか、
>ビデオ入力デバイスからの映像をAVIに保存する
等、なんともおあつらえ向きの項目もばっちりありますね。

取りあえず、10分ほど調べた所では、こんな所でしょうか。


目指す結果を得られるか否かは、一重に、HSP2年生様の努力と根性に掛かっている物と思います。
頑張ってくださいね。



ザコ

リンク

2007/4/12(Thu) 12:26:54|NO.7313

3.1ベータ8に新しいDLLが付いた様だが
それで出来るのかな。



不如帰

リンク

2007/4/12(Thu) 13:52:34|NO.7317

HSPCVのことですか?



ふほ

リンク

2007/4/12(Thu) 17:34:04|NO.7324

オッノウ〜!
灯台モトクラシー!(笑



KIMU

リンク

2007/4/12(Thu) 18:52:16|NO.7330

3.1b8のhspcvで目的の殆んどが解決しそう

USB WEBカメラを持って無いのでカメラキャプチャは出来てるかは分かりません。

#include "hspcv.as" #define linebox(%1,%2,%3=checksizx,%4=checksizy) repeat 4:line (%1)+((%3)*((cnt+1)\4>1)),(%2)+(%4)*(cnt>1),(%1)+(%3)*(cnt<2),(%2)+((%4)*((cnt+1)\4>1)):loop matching=200 ;マッチング検査の範囲 screen 1,matching,matching,8,0,200 ;マッチング先の画像表示用 screen 2,50,50,8,0,0 ;マッチング元の画像表示用 cvbuffer 1,matching,matching ;マッチング先用のCVバッファ1(負荷軽減の為にmatching*matchingの領域だけ取り出して利用) cvbuffer 2,50,50 ;マッチング元用のCVバッファ2 gsel 0,1:pos 8,8:objsize 150,24,24:button "AVI動画",*avi:button "USB カメラキャプチャ",*cam:stop *avi clrobj:dialog "avi",16,"動画ファイル":fname=refstr:if stat=0 {end} CAPTYP=0 cvopenavi fname,0 ;aviファイル取得の開始 CVバッファ0 (使えるのは古いタイプのAVIだけみたい) cvgetavi ;CVバッファ0に画像収得 goto *main *cam CV_CAP=CV_CAP_ANY,CV_CAP_MIL ,CV_CAP_VFW,CV_CAP_IEEE1394 clrobj:pos 8,10:input cid,24,16,2:pos 32,8:mes "カメラID(複数有る場合)" pos 16,32:listbox camtyp,48,"利用可能なデバイスすべて\nMatrox Imaging Library\nVideo for Windows\nIEEE1394" button "キャプチャ開始",*capst stop *capst CAPTYP=1 cvcapture CV_CAP(camtyp)+cid,0 ;カメラキャプチャの開始 CVバッファ0 cvgetcapture ;CVバッファ0に画像キャプチャー *main cvgetinfo mainsx, 0, CVOBJ_INFO_SIZEX if mainsx<0{clrobj:onexit *exit:mes "キャプチャの開始が出来ませんでした。":wait 200:goto *exit} cvgetinfo mainsy, 0, CVOBJ_INFO_SIZEY screen 0,mainsx,mainsy,0,matching+16,100 ;メインウィンドウ onexit *exit repeat cvgetimg 0,0 ;cvbuffer 0をメインウィンドウにコピー stick ky,$ffff //右クリック(mov=1 ターゲットの移動に合わせてマッチング先&元領域を移動) if (ky&512)!kyold and (ky&512)>0 {mov^1} kyold=(ky&512) //左クリック「ドラッグで範囲指定」(マッチング元(ターゲット)領域指定) if ky&256{mx=mousex:my=mousey:gosub *check} if ky&128{break} if chakon{ cvarea cmx,cmy,matching,matching ;選択領域を含むサイズmatching*matchingを取り出す設定 cvcopy 0,0,0,1,0 ;マッチング先用CVバッファにコピー gsel 1:cvgetimg 1,0 ;マッチング先の画像を表示(デバッグ用) gsel 0:color 200*mov,200-100*mov,200:linebox cmx,cmy,matching,matching ;マッチング先の領域を囲む color 0,255,0:linebox mx,my ;ターゲット決定時の領域を囲む cvmatch x,y,CV_TM_SQDIFF,2,1 ;画像のマッチング検査 x+cmx:y+cmy ;マッチング先の座標をメインウィンドウ用の座標に変換 color 255,0,0:linebox x,y ;ターゲットの領域を囲む(元画像に似ている画像がある場所) movx=x-mx:movy=y-my title "動いた量 横["+movx+"] 縦["+movy+"]" color 255,100,255 if (abs(movx)+abs(movy))>2{pos 0,0:mes "ターゲット動きあり"} if abs(movx)>=((matching-checksizx)/2) or abs(movy)>=((matching-checksizy)/2){pos 0,32:mes "ターゲットロスト?"} if (abs(movx)>5 or abs(movy)>5) and mov=1 {mx=limit(x,0,mainsx-checksizx):my=limit(y,0,mainsy-checksizy):gosub *check2} } await 200 if CAPTYP=0{cvgetavi}else{cvgetcapture} ;画像キャプチャー loop goto *exit *check repeat checksizx=limit(mousex-mx,10,matching-50) checksizy=limit(mousey-my,10,matching-50) mx=limit(mousex-checksizx,0,mainsx-checksizx) my=limit(mousey-checksizy,0,mainsy-checksizy) color 0,255,0:linebox mx,my stick ky,$ffff if (ky&256)=0{cvresize checksizx,checksizy,2:screen 2,checksizx,checksizy,8,0,0:gsel 0,1:break} await 10 cvgetimg 0,0 loop *check2 gsel 2 cvarea mx,my,checksizx,checksizy ;クリックされたところからchecksiz分取り出す設定 cvcopy 0,0,0,2,0 ;マッチング元用のバッファにコピー cvgetimg 2,0 ;マッチング元の画像を表示(デバッグ用) gsel 0 chakon=1 cmx=limit(mx-(matching-checksizx)/2,0,mainsx-matching) ;マッチング先に使用する画像の左上の座標 cmy=limit(my-(matching-checksizy)/2,0,mainsy-matching) return *exit if CAPTYP=0{cvcloseavi}else{cvendcapture} ;終了処理 end
cvopenavi で扱えるAVIファイルで試したらそれなりに動いてる感じ
このサンプルとやりた事は多分ちょっと違うと思うけど・・・



HSP2年生

リンク

2007/4/12(Thu) 20:33:47|NO.7334

ふほ まなさん情報ありがとうございます。
やはりDirectX、DirectShowを理解しないといけないですかね。HSP2年生では敷居が高いです。

試行錯誤の結果、現在次のような状況です。
zgpsw103というプラグインを使うと一応USBカメラを起動できることが分かりました。

ちょくとさんのページ
http://yokohama.cool.ne.jp/chokuto/advanced/index.html
のウィンドウキャプチャサンプルを試してみたのですが動画再生中の画面をキャプチャすると
真っ黒な画面になってしまいます。

偶然分かったのですがタスクマネージャーを一度起動させると正常にキャプチャできるように
なることが分かりました。
タスクマネージャーは最初から起動しているとダメでHSPを実行してから起動するとOKです。
一度OKになるとタスクマネージャーを終了してもOKです。

これはどのように考えたらよいのでしょう?

KIMUさんありがとうございます。
さっそくサンプルスクリプトを研究してやってみます。
やっと先が見えてきたかな?結果をまた報告します。



HSP2年生

リンク

2007/4/14(Sat) 16:24:07|NO.7444

KIMU さんありがとうございます。

私の要求をほぼ完璧に網羅しています。HSPCVで簡単にWEBカメラをキャプチャーできるのですね。
キャプチャーできるプラグインをあっちこっち探したあげくの質問でしたがHSP3.1βでできるとは
まさに「灯台下暗し」でした。公開されたのが4月7日ですからもう少し早くオフィシャルページを
覗くべきでした。でも質問したおかげで大変良いサンプルに出会えました。スクリプトの書き方も
大変勉強になります。

ただcvcapture→cvgetcapture→cvgetimgではキャプチャー画像が180度反転して表示されます。
これはcvrotate 180で解決できるので問題ないですがHSPCVの仕様なのかな?

それにしてもたった半日でこんなスクリプト書けるなんて敬服致します。(移動したターッゲットを
赤枠が追いかけるなんて・・・すごい!)

また何かありましたら質問させていただきます。
ありがとうございました。



KIMU

リンク

2007/4/14(Sat) 17:56:45|NO.7449

>私の要求をほぼ完璧に網羅しています。HSPCVで簡単にWEBカメラをキャプチャーできるのですね。
おぉ、あれで出来てたのかぁ
WEBカメラおもしろそう・・・

>ただcvcapture→cvgetcapture→cvgetimgではキャプチャー画像が180度反転して表示されます。
書き忘れてたけど、AVIでも上下反転してました(^^;
自分も仕様かバグか自分の持ってるデータが元々反転してるデータなのか
判断できなかったので、反転させずに、そのまま表示させました。

>赤枠が追いかけるなんて・・・すごい!)
HSPCVの命令が、それを簡単に実現できるようになってるだけだったり(笑)



HSP2年生

リンク

2007/4/14(Sat) 22:03:20|NO.7460

ここまで来ると欲が出てFPSとかFORMAT変更のDEVICE DRIVERプロパティーを呼び出せると
良いのですがHSPCVはまだ対応していないようです。
更なるバージョンアップを期待しています。



ONION software Copyright 1997-2021(c) All rights reserved.