Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Motion tracking

tesmu [15.10.2010 18:31:00]

#

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ä.

tesmu [18.10.2010 16:02:20]

#

Eikö kukaan osaa vastata :-O

neau33 [18.10.2010 17:55:41]

#

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

tesmu [18.10.2010 18:23:10]

#

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.

neau33 [18.10.2010 18:34:50]

#

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!

tesmu [18.10.2010 19:12:07]

#

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ä.

neau33 [18.10.2010 20:50:33]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta