Eli minulla on tälläinen webcamcontrol.ocx (itse tehty) jota käytän tässä projektissa.
Olen tehnyt liikkeen tunnistamiseen tälläisen koodin
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Type pointapi
x As Integer
y As Integer
End Type
Private Sub Picture1_Click()
End Sub
Private Sub tref_Timer()
Static i As Integer
wb.Refresh
i = i + 1
Select Case i
Case 1
wb.GetImage pic
Case 2
wb.GetImage pic2
DoEvents
Diff
i = 0
End Select
End Sub
Public Function Diff()
Dim x As Integer
Dim y As Integer
Dim sCol As Long
Dim tCol As Long
Dim r As Integer
Dim g As Integer
Dim b As Integer
Dim cnt As Long
Dim Stepped As Integer
Dim Mot As Integer
Dim UL As pointapi
Dim UR As pointapi
Dim DL As pointapi
Dim DR As pointapi
UL.x = -1
UL.y = -1
Dim r2 As Integer
Dim g2 As Integer
Dim b2 As Integer
Dim ThreS As Integer
ThreS = 25
mvAr.Cls
wb.GetImage shPic
cnt = 0
Stepped = 3
For x = 1 To pic.Width Step Stepped
For y = 1 To pic.Height Step Stepped
sCol = GetPixel(pic.hdc, x, y)
tCol = GetPixel(pic2.hdc, x, y)
ColorCodeToRGB sCol, r, g, b
ColorCodeToRGB tCol, r2, g2, b2
If r2 > r - ThreS And r2 < r + ThreS Then
Else
If UL.x = -1 And UL.y = -1 Then
UL.x = x
UL.y = y
End If
'shPic.PSet (x, y), RGB(255, 0, 0)
mvAr.PSet (x, y), sCol
cnt = cnt + 1
DR.x = x
DR.y = y
End If
If g2 > g - ThreS And g2 < g + ThreS Then
Else
If UL.x = -1 And UL.y = -1 Then
UL.x = x
UL.y = y
End If
'shPic.PSet (x, y), RGB(0, 255, 0)
mvAr.PSet (x, y), sCol
cnt = cnt + 1
DR.x = x
DR.y = y
End If
If b2 > b - ThreS And b2 < b + ThreS Then
Else
If UL.x = -1 And UL.y = -1 Then
UL.x = x
UL.y = y
End If
'shPic.PSet (x, y), RGB(0, 0, 255)
mvAr.PSet (x, y), sCol
cnt = cnt + 1
DR.x = x
DR.y = y
End If
DoEvents
Next y
DoEvents
Next x
DL.x = UL.x
DL.y = DR.y
UR.x = DR.x
UR.y = UL.y
Mot = Int((((cnt / 3) / ((pic.Height / Stepped) * (pic.Width / Stepped))) * 100))
If Mot >= 5 Then
shPic.Line (UL.x, UL.y)-(DL.x, DL.y), RGB(25, 25, 255)
shPic.Line (UR.x, UR.y)-(DR.x, DR.y), RGB(25, 25, 255)
shPic.Line (UL.x, UL.y)-(UR.x, UR.y), RGB(25, 25, 255)
shPic.Line (DL.x, DL.y)-(DR.x, DR.y), RGB(25, 25, 255)
End If
Me.Caption = "Motion " & Mot & "%"
End Function
Public Function ColorCodeToRGB(lColorCode As Long, iRed As Integer, iGreen As Integer, iBlue As Integer) As Boolean
Dim lColor As Long
lColor = lColorCode
iRed = lColor Mod &H100
lColor = lColor \ &H100
iGreen = lColor Mod &H100
lColor = lColor \ &H100
iBlue = lColor Mod &H100
ColorCodeToRGB = True
End FunctionKysymys kuuluukin, miten saan tuon neliön oikeaan paikkaan? Se heittelee ihan päin hel*** ja ei ole ollenkaan liikkeen ympärillä.
Eikö kukaan osaa vastata :-O
Moi tesmu!
Mikäli mitään käsitin niin nappaat tolla timer-jutskalla parit imaget, joita sitten vertaat tossa diff-funkkarissa. Elikä miksi nappaat vielä kolmannen imagen (shPic), johon sitten piirtelet neliötäsi. Homma on nimittäin siinä viheessa jo aika pahasti myöhässä. Toisin sanoen, tee kopio pic2 ja jos liikettä on havaittavissa niin piirtele siihen kopioon ja näyttele sitä (pientä viivettä tulee väkisinkin)...
Oikeastaan sun ei tarvitsis ottaa toi pic1 kun yhden kerran ja aina kun vertailu on tehty funkkarissa niin kopioit pic2:sta uuden vertailupohjan eli pic1:sen
Eli siis, timerillä nappaan ekalla kierroksella 1 imagen (pic1) ja sitten toisella kierroksella uuden imagen eri lodjuun (pic2), nämä siis ovat aikasempi frame ja tuore frame. Näitä vertailen siis keskenään. Tämän jälkeen diff funktio vertailee niitä. Miksi shPic on? Noh siihen on selityksenä: Siihen ensinnäkin tulee kuva, pic ja pic2 kuvia en voi käyttää näihin piirteilyihin koska sitten seuraavalla kerralla ohjelma havaitsee neliöt ja sensellaset liikkeenä. Tai pisteet mitkä siinä on. shPicciin siis piirretään kuva ja siinä olevat liikkeet... Ongelmana nyt siis on se, että diff funktio ottaa ensimmäisen pisteen jossa on havaittu liikettä ja viimeisen pisteen, jonka perusteella se yrittää luoda neliön. Tämä neliö kuitenkin menee aivan metsään ja ei näy oikeassa paikassa.
ps. Timerillä on erittäin pieni interval jollon viivettä ei pääse niin paljoa kasvamaan.
Moi taas tesmu!
Justka on nyt niin, että siirryt timer-juskastasi toisella kierroksella (i = 2) vertailufunkkariin jossa otat kolmannen kuvan johon piirtelet. Jos on liikettä niin se kolmas kuva on ihan varmasti eri, kuin se jonka pohjalta vertaat (pic2) elikä ei ole mitenkään ihmeellistä jos menee metsään. Eli vielä kerran: otat pic2:sta joka kerta kopion johon piirtelet! ja swappaat vielä lopuksi funkkarissa pic2:en pic1:ksi jolloin sinulla koko ajan olemassa oleva vertailupohja!
Juu noh tein näin että pic2:sta otin kopion (minulla on myös debuggausta varten tyhjä kuva mvAr johon piirtelen vain pisteet joissa on liikettä) Tämä kuva näyttää juuri oikeat pisteet missä näkyy liikettä mutta silti neliö on päin mäntyä.
Moi taas tesmu!
laatikon piirto: (oletan, että UL = UpperLeft ja DR = DownRight)
pic2kopio.Line(UL.x, UL.y)-(DR.x, DR.y), RGB(25, 25, 255), B
ja disabloi se timer kunnes vertailu-funkkari on suoritettu
Aihe on jo aika vanha, joten et voi enää vastata siihen.