VideoAnalyse; Schaust du weiter

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

MEIN CODE PB 3.94

Wie gesagt, ich freue mich auf eure Unterstützung.

Mein Programm funktioniert mit JPEG und BMPs, bei Bedarf auch mit anderen Formaten.

Das Bild kann ein Foto, eine Zeichnung oder irgendwas anderes sein.
Bei folgendem Bild erhalte ich gute Werte:

Bild

Ich hab leider kein anderes bei Google gefunden.
Mein Code ist noch nicht auf Geschwindigkeit optimiert, da er noch nicht
vollständig ist. Jemand müsste ihn so umschreiben, dass sich die Finde-Routine immer um 90° dreht und die Objekte nicht in einem festen Array sondern alle Punkte eines Objektes in einer LinkedList speichert.
Wenn ein Objekt/TeilBild nicht mehr geteilt werden kann, ist es ein Objekt.

Code: Alles auswählen

Enumeration
#HauptFenster
#Sprite
#Ball
#Wand
#Bild
EndEnumeration

Global x.l
Global y.l
Global xmax.l
Global ymax.l

dddd.l

;/ Toleranz für Objekterkennung bei Starkem Rauschen
;OpenConsole()
;PrintN("Gib mal was ein: 0..255 ist sinnvoll.  Bei starkem Rauschen mit dunkelgrau: 150")
;Print("Toleranz, bei meinem Bild 15: ");
;dddd=Val(Input())
;CloseConsole()

dddd=16
  

Procedure MachFenster() 
  hWnd=OpenWindow(#HauptFenster, 0, 0, 410, 310,  #PB_Window_SystemMenu | #PB_Window_WindowCentered | #PB_Window_SizeGadget | #PB_Window_TitleBar , "(c) Folker Linstedt 2006 :::: Best View 1024 x 768 and higher") 
EndProcedure 

;{/ initZeugs


;}/
;sprite$="C:\Sicher\Bild\Neu Bitmap.bmp"


;UsePNGImageDecoder()
UseJPEGImageDecoder()
;UseTGAImageDecoder()
;UseTIFFImageDecoder()


sprite$=OpenFileRequester("Bild auswählen","c:\","BildDaten|*.bmp;*.png;*.jpg;*.jpeg;*.tif;*.tga",-1) 


MachFenster() 
;OpenWindowedScreen(WindowID(),0,0,1000,700,0,0,0)

LoadImage(1,sprite$)
If IsImage(1)=0
  CreateImage(1,400,300)
EndIf

Procedure.l LineSearchS(xx.l,yy.l,l.l)
  
  Ereignis=0
  
  For i=0 To l-2
   Punkt=Point(xx,yy+i) ; Punkt/Farbe könnte hier später gleich gespeichert werden
   ;  Plot(x,y+i,RGB(0,0,255))
     
   If Punkt=0 
      Ereignis=0
    Else
      Ereignis=yy+i ; Also hier mein ich
      Break
    EndIf
  Next
  

  ProcedureReturn Ereignis
EndProcedure



Dim Dinglis(100,1)
Global Anz.l


#Pic=17

Procedure KantenFinden(d.l)
CreateImage(#Pic,400,300)  
  p0.l
  p1.l
  
  ;d=150
  
  For i=0 To 399
  StartDrawing(WindowOutput())  
    p0=Point(i,0)
  StopDrawing()
    For u=1 To 298
      StartDrawing(WindowOutput())
        p1=Point(i,u+0) 
      StopDrawing()
        
      
      If (Red(p0)-d>Red(p1)) Or (Red(p0)+d<Red(p1)) Or (Green(p0)-d>Green(p1)) Or (Green(p0)+d<Green(p1))Or(Blue(p0)-d>Blue(p1)) Or (Blue(p0)+d<Blue(p1))
        StartDrawing(ImageOutput()) 
          Plot(i,u,RGB(255,255,255))
        StopDrawing()
      EndIf
       
      p0=p1
      
    Next
    
  Next
  
EndProcedure  



Procedure FindDenScheisz()

StartDrawing(WindowOutput())
LineSearchS(x,y,ymax)
While s=0 And x<xmax
  x+1
  s=LineSearchS(x,y,ymax)
  
Wend
  ; Erster Punkt des Objektes x,s
  If x<xmax
  Circle(x+2,s,2,RGB(0,255,0))
  Dinglis(Anz*2,  0)=x
  Dinglis(Anz*2,  1)=s
  Dinglis(Anz*2+1,1)=s
  EndIf 
 
Repeat
  x+1
  s=LineSearchS(x+1,y,ymax)
  ; Ausdehnung des Rechtecks soweit wie möglich, einzelne schräge Linien eignen sich am besten
  ; einzelne Kreise werden knapp halbiert
  If s>Dinglis(Anz*2+1,1) : Dinglis(Anz*2+1,1)=s : EndIf
  If s<>0 : If s<Dinglis(Anz*2  ,1) : Dinglis(Anz*2,1)=s : EndIf : EndIf
  
  ; jedes X, S müsste in eine Liste gespeichert werden
  ; anschließend muss die Methode noch waagerecht angewandt werden
  ; zusammenhängende Objekte werden dadurch geteilt ...
  ; dies muss so oft wiederholt werden, bis kein Objekt mehr teilbar ist
  
  ; Zurzeit findet nur ein Durchlauf statt von oben nach unten.
  ; die Durchläufe könnten so optimiert sein, dass kein Punkt doppelt abgefragt werden müsste
  

Until s=0 Or x+1>xmax
  s=LineSearchS(x,y,ymax)
  ; Letzter Punkt des Objekts
  If x+1<xmax
    Circle(x-2,s,2,RGB(255,0,0))
    Dinglis(Anz*2+1,0)=x
    
    Anz+1 
    
  EndIf
  
StopDrawing()
EndProcedure


xmax=399 ; Bildgröße  X 400
ymax=299 ; Bildgröße  Y 300
x=0
y=0
Anz=0

StartDrawing(WindowOutput()) ; geht wohl nicht, keine Ahnung
DrawImage(UseImage(1),0,0)
StopDrawing()

KantenFinden(dddd)
StartDrawing(WindowOutput())
DrawImage(UseImage(17),0,0)
StopDrawing()

While x<xmax
  FindDenScheisz() 
Wend
 
 Procedure Rectangle(x1.l,y1.l,x2.l,y2.l,f.l)
   LineXY(x1,y1,x1,y2,f)
   LineXY(x1,y2,x2,y2,f)
   LineXY(x2,y2,x2,y1,f)
   LineXY(x2,y1,x1,y1,f)
EndProcedure

;/ Pause, damit man das KantenGefundeneBild mit den roten und grünen Punkten sehen kann
Delay(2000)
 
UseImage(1)
StartDrawing(ImageOutput())
For i=0 To Anz-1
  If Dinglis(i*2,0)+5<Dinglis(i*2+1,0) ; Krümel werden nicht umrandet
    Rectangle(Dinglis(i*2,0),Dinglis(i*2,1),Dinglis(i*2+1,0),Dinglis(i*2+1,1),RGB(255,255,255))
  EndIf
Next
StopDrawing()
 
 
Repeat
  Event = WaitWindowEvent() 

  StartDrawing(WindowOutput())
  DrawImage(UseImage(1),0,0)
  StopDrawing() 
  
  Delay(10)
Until Event=#PB_Event_CloseWindow
Könnt gern selbst Bilder malen. Objekte werden nur erkannt, wenn sie neben einander liegen, weil wie oben erwähnt der Code noch nicht vollständig ist. Aber versucht auch ruhig solche Bilder.

Schreibt ruhig, wie ihr es findet. Das es noch nicht fertig ist, ist mir auch klar. Mit euer Unterstützung würde es schneller gehen können.

!!! Ich würde gern für später noch Rauschunterdrückung einführen. Ist das Bild nämlich mit kleinen Punkten überzogen, wird mit meiner Methode zurzeit noch alles als ein Objekt erkannt. Sicherlich wird das nicht mehr der Fall sein, wenn die Routine wie oben erwähnt erweitert wird, aber ich würde eine zusätzliche Rauschunterdrückung nicht schlecht finden.

Ich würde gern folgenden Filter haben wollen :roll:
Serif PhotoPlus Version 6.03 (Freeware) ::
Im Menü oben >> Image / Noise / Median Cut

Kennt den jemand, weiß jemand, wie der als Code aussehen könnte?
Würd mich freuen, wenn sich jemand erbarmt und ihn hier vorstellt.

Vielen Dank. :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Der Code ist schon nicht schlecht. Ich könnte ihn noch optimieren.

Zum Project:
Ich find die Idee gut. Das könnte man noch optimieren und in einem Interface oder in einer Lib herstellen.
Ich würd das dann auch mit Schrift-Erkennung machen, so das man einen Text einschreibt und dieser mit diesem Programm ausgelesen werden kann. Sehr nützlich wird dies dann, wenn das Programm Scannen kann. Damit kann man dan Texte einscennen und erkennen lassen.

Dies sollte aber nicht in den vordergrund geraten. Ich versuch (wenn ich wieder daheim bin) mal an dem Programm herumzuschrauben.

Noch eine Idee wäre das erkennen von Schatten / von (3D-)Objecten.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

!!! Ich würde gern für später noch Rauschunterdrückung einführen. Ist das Bild nämlich mit kleinen Punkten überzogen, wird mit meiner Methode zurzeit noch alles als ein Objekt erkannt.

www.avisynth.org
Dort die sources runterladen und mal nach der routine für "spatialSoften" nachsehen.
Bei temporalem entrauschen 3D, was im Videobereich viel verwendet wird, wird der Bildinhalt zudem mit dem der nachfolgenden frames verglichen, was einem zusätzlich noise-erkennung ermöglicht.

Spatiales also 2D entrauschen bei EINEM Bild ist ziemlich schwierig, wenn du nicht neben der erkannten "noise" auch feinere "richtige" Details killen möchtest.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Die beste Rauschunterdrückung, die ich kenne:
http://www.neatimage.net/

Das beste Schärfeverfahren, das ich kenne:
http://www.focusmagic.com/

Aus verschiedenen Aufnahmen was scharfes machen:
http://helicon.com.ua/pages/


Mein ursprüngliches Ziel ist ja sowas:
http://www.cv.iit.nrc.ca/research/Nouse/index2.html
oder
http://ls7-www.informatik.uni-dortmund. ... re/zyklop/
(was mich an unseren User ZeHa erinnert :? )

Später soll die Erkennung ja mit einer Spracherkennungssoftware und einer Textanalyse, einer riesigen Datenbank verknüpft werden.

Und es soll ein Roboter-Mensch-Kontakter entstehen.

Aber ich wollte erst einmal eins nach dem anderen machen /:->

Freue mich auf eure Hilfe, bin gespannt auf die Ergebnisse. :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Einfach mal schauen, was es so gibt ...

http://www.fraunhofer.de/fhg/fair/2006/ ... jsp?View=2

:o Und nicht sagen, das ist doch nicht möglich. Das es nicht von einer Person allein zu schaffen ist, dürfte uns ja klar sein.

:roll:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Am Ende so das rauskommen:

Es soll auf der Cebit folgendes gegeben haben:


Ein Tisch aus Glas, unter dem eine Kamera positioniert war.
Auf dem Tisch standen drei Objekte :| :( :mrgreen:
Daneben war ein Monitor, dieser hat die drei Objeke :| :( :mrgreen: in 3D dargestellt.
Hat man eines der Objekte gedreht, hat sich auch das 3D-Model auf dem Monitor gedreht.

Auf den Objekten :| :( :mrgreen: waren auf der Unterseite Symbole.
Die Kamera hat diese durch den Glastisch sehen können.

Gelingt es uns, einfache geometrische Formen :| :( :mrgreen: zu erkennen, deren Drehung eindeutig bestimmbar ist, so dürfte es kein Problem sein, so ein Spielzeug selbst zu Hause zu haben.

Die anschließende 3D-Projektion dürfte mit Pure kein Problem darstellen.

- mehrere Objekte
- deren Position
- deren (genauen) Drehwinkel
- Echtzeitdarstellung >> setzt Echtzeit Position/Winkel-Ermittlung voraus

:oops:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

/:->
Ich würde gern ein Foto in geometrische Formen bringen.
In eine Art gezeichnetes Bild, bei dem man aber weiß, woraus es besteht.
So dass am Ende der Computer beim Betrachten eines Bildes sagen kann: Da ist ein Mann drauf zu sehen
Ein Mann besteht aus einem Kopf, der aussieht wie ein Kreis, Armen, Beinen, die aussehen wie gedrehte Rechtecke ;-)

Mein Programm soll so ungefähr das können, was ein Kind kann bevor es in den Kindergarten kommt. :o


Bild

:roll:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Ich sehe mir ja Deine Beiträge nun schon länger an...
...und dabei komme ich zu den Schluss:

Du brauchst erst mal einen Versuchsaufbau!

Male ein Viereck.
Das Programm soll das Viereck erkennen!

Male einen Kreis
Das Programm soll einen Kreis erkennen!

Male ein Oval
Das Programm soll ein Oval erkennen!

...usw...


Ich hoffe ich habe Dich in die richitige Richtung geschubst...
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

http://a7www.igd.fhg.de/projects/erso/erso_e.html

Ich glaub zwar, dass du dir deinen Beitrag hättest sparen können und das eigentliche Problem nicht siehst, aber ich nehm es dir nicht krum.

Ich bin noch dabei die Objekte zu erfassen, bevor ich sie analysieren kann. Du brauchst mir also nicht sagen, was noch fehlt, sondern könntest hilfreich zur Seite stehen und auch mal deinen Code zum Besten geben.

:allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Das eine hat mit dem anderen (Erfassen/Erkennen) zunächst mal nichts zu tun!
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Antworten