一応動体検知サンプル
どの程度変化があったら動いた事にするかとか
色を捨ててるから暗い所も同じしきい値を使うと変化を検知しにくいとか
これから考える事は多いだろう・・・
#include "hspdsc.as"
screen 0,ginfo_dispx,ginfo_dispy,2
title "DirectShow キャプチャデバイス表示 サンプル(1つのみ) "
width 320,240
dsc_Init // 初期化を必ずする!
gsel 0,1
// バッファのサイズ取得し sdim で 確保
sdim devlist, dsc_GetDeviceListSize()
dsc_GetDeviceList devlist // 利用可能なデバイス一覧取得
if stat = 0 : dialog "デバイスが見つかりません" : end
objsize 300, 20
combox id, 100, devlist
objsize 150,20
button "デバイスを再生",*play
Threshold=30 //しきい値
input Threshold,32,20
onexit *exit
stop
*play
// 操作ID 0 指定(デフォルトでは0が指定されているため書かなくてもOK)
dsc_SetActiveSel 0
dsc_Stop
dsc_Close
// デバイスのオープン
dsc_Open id, 6, 0, 0, 0 //表示なしでオープン
if stat < 0 : dialog "エラーが発生しました\nstat = " + stat, 1, "DEVICE-ERROR" : stop
gsel 0, 1
width dsc_CapX, dsc_CapY
wx2=ginfo_wx2
wy1=ginfo_wy1
dsc_Play hwnd
if stat < 0 : dialog "エラーが発生しました\nstat = " + stat,1,"CAPTURE-ERROR" : stop
//比較用にパレットモードのウインドウを用意
screen 10,dsc_CapX/4,dsc_CapY/4,1+4+8,wx2,wy1 //動体検知用の表示ウィンドウに実サイズの4分の1
mref vramA,66
winx=ginfo_winx
winym=ginfo_winy-1//一番上のライン
winx2=((winx+3)&-4) //VRAM横1ラインのサイズ
//パレットを黒から白にグラデーションセット
repeat 256
palette cnt,cnt,cnt,cnt,(cnt=255)
loop
//このウィンドウにコピーすれば勝手にグレースケールになる
//完全に黒なのにパレット0にならなかったりするが・・・
buffer 11,dsc_CapX/4, dsc_CapY/4,1 //比較する前回のフレーム用
mref vramB,66
repeat 256
palette cnt,cnt,cnt,cnt,(cnt=255)
loop
gsel 0, 1
color
boxf
repeat//キャプチャして画像が更新されるまでループ
wait 10
dsc_GetImage hdc, 0, 0, dsc_CapX, dsc_CapY
redraw 1
pget dsc_CapX/2,dsc_CapY/2 //中心部分の色を取得して、黒い外ならキャプチャ開始されとしてループを抜ける
if (ginfo_r+ginfo_g+ginfo_b) {break}
loop
gsel 11 //比較用前回のフレームとして縮小コピー
gmode 0
pos 0,0
gzoom dsc_CapX/4,dsc_CapY/4,0,0,0,dsc_CapX, dsc_CapY,0
repeat
gsel 0
redraw 0
dsc_GetImage hdc, 0, 0, dsc_CapX, dsc_CapY
gsel 10 //比較用今回のフレームとして縮小コピー
redraw 0
pos 0,0
gzoom dsc_CapX/4,dsc_CapY/4,0,0,0,dsc_CapX, dsc_CapY,0
redraw 1
md=0
py=0
gsel 0
color 255
repeat winym //縦
loopy=(winym-cnt)*winx2
repeat winx //横
if abs(peek(vramA,loopy+cnt)-peek(vramB,loopy+cnt)) > Threshold {//ウィンドウバッファを直接参照してパレットナンバーを比較してThresholdより差があれば変化したと判定
boxf cnt*4,py,cnt*4+2,py+2 //ちゃんと検知出来てるか確認用に表示(検知用のウィンドウは4分の1のサイズなので座標を4倍してる)
md++
}
loop
py+4
loop
title "変化したドット数="+md
redraw 1
await 100
gsel 11 //今回のフレームを次回比較用のフレームとしてコピー
gmode 0
pos 0,0
gcopy 10,0,0,dsc_CapX/4,dsc_CapY/4
loop
stop
*exit
// クローズ
dsc_Stop
dsc_Close
end