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ファイルで試したらそれなりに動いてる感じ
このサンプルとやりた事は多分ちょっと違うと思うけど・・・