Announcement

Collapse
No announcement yet.

Bilderkennung: Zwei getrennte Kreise (als Koordinatencluster) erkennen?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bilderkennung: Zwei getrennte Kreise (als Koordinatencluster) erkennen?!

    moien,

    ich hab mal eine frage zum thema bilderkennung.
    ich habe zwei gretrennte kreise (ausgefüllt) als koordiaten vorliegen und würde gerne in meinem programm, womit ich den mittelpunkt vonkreisen berechnen lasse, gerne dem programm beibringen, dass es sich um zwei getrennte objekte handelt, so dass er nicht versucht den durchschnitt beider mittelpunkte zu berechnen, sondern mittelpunkt 1 und 2.

    ich hab nach bilderkennung schon bei google geguckt, aber ich weiss garnicht wonach ich da genau gucken muss. also bis jetzt fehltes mir da erstmal an den grundlagen, also mathe, weil ich noch keinen einstige gefunden habe wie das funktioniere könnte.

    wenn ich nur einen kreis habe lass ich das dem programm den kreis so finden, dass ich eine abfrage machen,die danach guckt ob der eine koordinatenpunkt weiss ist (ich hab nur hell oder dunkel) und wenn er hell ist ob er entweder oben oder unten einen nachbarn haben der auch weiss ist, oder links oder rechts einen nachbarn der weiss ist haben.

    kann mir da jemand tipps geben, wonach ich gucken muss? dass mir jemand sagt und den code vorpostet verlang ich nicht , aber wenn jemand weiss,nach welcher matheregel das gehen könnte wäre ich für hinweise sehr sehr dankbar.

    grüße,Andreas

    PS: achja,ich hab noch was vergessen. das darf man sich dann so ähnlich wie das her vorstellen
    http://commons.wikimedia.org/wiki/Im...s_PIA04531.jpg nur halt in schwarz weiss,wobei die erde und der mond dann weiss wären.

  • #2
    So könntest Du es machen.
    Die Idee ist, herauszufinden, ob es weisse bildpunkte gibt, die nicht zusammen hängend sind.
    Wenn ein weisser Punkte gefunden wird, gehe von diesem zu allen nachbarn, die auch weiss sind.
    markiere sie nun als besucht.
    gehe nun von allen nachbarn aller nachbarn die weiss sind und markiere sie als besucht.
    setzte dies rekursiv fort, bis keine weissen nachbarn mehr zu finden sind.
    nun hast du alle punkte einer zusammen hängenden fläche (fill-algo).
    gibt es jetzt noch unbesuchte weisse punkte, so gibt es mindestens zwei getrennte flächen.
    (um heraus zu finden, wie viele flächen es gibt, kann man den algo mit einem beliebiegen noch nicht besuchten weissen punkt wiederholen.)

    Comment


    • #3
      moien netguru,

      ich hatte auch einen freund von mir gefragt, der mir etwas gebau hat, was recht gut funktioniert.
      das wollte ich nun erweitern, da ich von den punkteclustern nur die äußeren punkte (also die grenzschicht) brauche. ich hatte das versucht so ähnlich zu machen, wie mein kumpel mir das vorgebaut hatte, aber es gibt da probleme.

      Code:
      Module Main
         Sub Main()
         
              Dim pic_res(10,10) As Integer
             
              pic_res(0,0) = 0
              pic_res(0,1) = 1
              pic_res(0,2) = 1
              pic_res(0,3) = 0
              pic_res(0,4) = 0
              pic_res(0,5) = 0
              pic_res(0,6) = 0
              pic_res(0,7) = 0
             
          '[gekürzt wg forum]
         
           Dim visited(10,10) as Boolean
      
          For x as Integer = 0 to 10
              For y as Integer = 0 to 10
                  visited(x,y) = false
              Next
          Next
      
             Dim objekte_x as New List(of List(of Integer)) ' jedes Element in dieser Liste ist eine Liste mit den X-Koordinaten eines Objektes (aller Punkte die zu einem Objekt gehören)
          Dim objekte_y as New List(of List(of Integer)) 
          Dim tmp_x as List(of Integer) 
          Dim tmp_y as List(of Integer)
      
          Dim objekte_x2 as New List(of List(of Integer))
          Dim objekte_y2 as New List(of List(of Integer))
          Dim cluster_x As List(Of Integer)
          Dim cluster_y As List(Of Integer)
      
          For x as Integer = 0 to 7
              For y as Integer = 0 to 7
                  if pic_res(x,y) = 1 and visited(x,y) = false Then
                      tmp_x = new List(of integer)
                      tmp_y = new List(of integer)
                      Call Neighbours(x,y, tmp_x, tmp_y,pic_res,visited)
                      objekte_x.Add(tmp_x)
                      objekte_y.Add(tmp_y)
                  End If
              Next
          Next
      
            'dim cluster_x, cluster_y as New List(of integer)
          For objekt_zeiger As Integer = 0 To objekte_x.count - 1   
          
              console.WriteLine("Koordinaten von Objekt {0}:",objekt_zeiger)
             
              For i As Integer = 0 To objekte_x(objekt_zeiger).count - 1
                console.WriteLine("({0},{1})",objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i))
             
                  'testanf
                 
                                            
                          If objekte_x(objekt_zeiger)(i) < 1 And objekte_y(objekt_zeiger)(i) < 1 Then
                            
                              'If pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 Then
                              '    cluster_x.Add(objekte_x(objekt_zeiger)(i))
                              '    cluster_y.Add(objekte_y(objekt_zeiger)(i))
                              '
                              '    console.WriteLine("xr{0}, yr{1}",objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i))
                              'End If
                             
                              cluster_x = new List(of integer)
                              cluster_y = new List(of integer)
                              Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                              objekte_x2.Add(cluster_x)
                              objekte_y2.Add(cluster_y)
                             
                          ElseIf objekte_x(objekt_zeiger)(i) < 1 And objekte_y(objekt_zeiger)(i) >= 1 Then
                              '2. wenn die x-koordinate 0 ist, aber y groeßer oder gleich 1, dann darf nur nicht vor x gesucht, sondern nur hinter x,
                              '    aber vor und hinter y. also faelt nur x-1 aus der if-suche aus.
                         
                              'If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)-1) = 0) Then
                              '    cluster_x.Add(objekte_x(objekt_zeiger)(i))
                              '    cluster_y.Add(objekte_y(objekt_zeiger)(i))
                             
                              'End If
                             
                              cluster_x = new List(of integer)
                              cluster_y = new List(of integer)
                              Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                              objekte_x2.Add(cluster_x)
                              objekte_y2.Add(cluster_y)
                             
                          ElseIf objekte_x(objekt_zeiger)(i) >= 1 and objekte_y(objekt_zeiger)(i) < 1 Then
                              
                              'If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i)-1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0) Then
                              '    cluster_x.Add(objekte_x(objekt_zeiger)(i))
                              '    cluster_y.Add(objekte_y(objekt_zeiger)(i))
                              '
                              'End If   
                             
                              cluster_x = new List(of integer)
                              cluster_y = new List(of integer)
                              Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                              objekte_x2.Add(cluster_x)
                              objekte_y2.Add(cluster_y)
                         
                          Else
                              
                              'If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i)-1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)-1) = 0) Then
                              '    cluster_x.Add(objekte_x(objekt_zeiger)(i))
                              '    cluster_y.Add(objekte_y(objekt_zeiger)(i))
                              '
                              'End If
                             
                              cluster_x = new List(of integer)
                              cluster_y = new List(of integer)
                              Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)
                              objekte_x2.Add(cluster_x)
                              objekte_y2.Add(cluster_y)
                             
                          End If
                  'testend
             
              Next
          Next
         
          Console.ReadLine()
      
          End Sub
      
          
          Sub Neighbours(x as Integer, y as Integer, ByRef tmp_x as List(of Integer),ByRef tmp_y as List(of Integer),ByRef pic_res(,) as Integer, visited(,) as Boolean)
              tmp_x.add(x)
              tmp_y.add(y)
              visited(x,y) = true
              
              If pic_res(x+1,y) = 1 And visited(x+1,y) = false Then
                  Call Neighbours(x+1,y,tmp_x,tmp_y,pic_res,visited)
              End If
             
              If pic_res(x+1,y+1) = 1 And visited(x+1,y+1) = false Then
                  Call Neighbours(x+1,y+1,tmp_x,tmp_y,pic_res,visited)
              End If
             
              If pic_res(x,y+1) = 1 And visited(x,y+1) = false Then
                  Call Neighbours(x,y+1,tmp_x,tmp_y,pic_res,visited)
              End If
          End Sub
         
          Sub Surface(i As Integer, objekt_zeiger as Integer, ByRef cluster_x as list(of Integer), ByRef cluster_y as List(of Integer), ByRef objekte_x()() as Integer,ByRef objekte_y()() as Integer, ByRef pic_res(,) as integer)
              cluster_x.Add(objekte_x(objekt_zeiger)(i))
              cluster_y.Add(objekte_y(objekt_zeiger)(i))
                 
              If pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 Then
                  Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                  End If
             
             
              If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)-1) = 0) Then
                  Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                                         
                  End If
             
             
              If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i)-1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0) Then
                  Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                             
                  
              End If
             
              If (pic_res(objekte_x(objekt_zeiger)(i)+1,objekte_y(objekt_zeiger)(i)) = 0 or pic_res(objekte_x(objekt_zeiger)(i)-1,objekte_y(objekt_zeiger)(i)) = 0) or (pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)+1) = 0 or pic_res(objekte_x(objekt_zeiger)(i),objekte_y(objekt_zeiger)(i)-1) = 0) Then
                  Call Surface(i,objekt_zeiger,cluster_x,cluster_y,objekte_x,objekte_y,pic_res)       
                 
                  
              End If
                             
          End Sub
      End Module
      überall, wo ich surface in der main() aufrufe wird mir unter sharp develop das hier angezeigt

      Value of type 'System.Collections.Generic.List(Of System.Collections.Generic.List(Of Integer))' cannot be converted to '1-dimensional array of 1-dimensional array of Integer'. (BC30311) - C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\SharpDevelop Projects\sun_compass_console_1_testbench_3\Main.vb :160
      aber ich raffe nicht wieso. um die variablen in die sub surface zu übegeben müssen die doch genau so sei, wie ich die in der klammer hiner sub surface(...) angebe, und das habe ich genau so gemacht, wie bei der sub neigbours.

      weiss da jemand, was da murks ist?

      oder auch wenn man es nicht weiss, aber dafür eine alternative, dann her damit.

      grüße, Andreas

      Comment

      Working...
      X