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 Function
Kysymys 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.