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.
Blitzer
Beiträge: 97
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Fertige DLL's nutzen

Beitrag von Blitzer »

Hallo,

für die Bildverarbeitung und Mustererkennung gibt es bei http://sourceforge.net hundete von Einträgen bei der Suche nach Begriffen wie z.B. "recognition".

Es wäre Interessant, wenn jemand mit viel Zeit dort passende DLL's für PureBasic finden könnte.

Leider sind dort auch Programme gelistet, die unter die Rubrik "Bildbearbeitung" und nicht "Bildverarbeitung" gehören.

Blitzer
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ich hab keine ahnung vom arbeiten mit DLLs. (programmiere in PureBasic erst seit 3 monaten und hab vorher auch noch keine benutzt)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Wenn ihr DLLs nehmt ... wie sieht es dann mit der Kompatibilität zu MacOS und Linux aus?

Mich stört's nicht wirklich, weil ich Windows nutze. Aber für die Tragweite unserer Arbeit wäre es schon ganz gut zu wissen, wie portierbar unser Ergebnis sein wird.

Danke, dass ihr noch aktiv dran mit wirkt. Ich bin ja in letzer Zeit weniger eine Hilfe gewesen, aber wenn beruflich und privat der Stress wieder etwas nachgelassen hat und der Sommer sich dem Ende neigt, ist wieder mit vollem Einsatz von mir zu rechnen.

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

Tja, wie es aussieht, macht das Projekt wohl

Beitrag von Xaby »

Sommerpause.

Na hier? Auch alle im WM-Fieber? Mir ist es zum Glück nicht so wichtig.
Gegen die Hitze hab ich mir gestern erstmal einen fetten Radiator zugelegt.
Mit Fernbedienung. Ist schon geil. Man kann ihn genau so einstellen wie man will und braucht nicht aufstehen.

Schön leise ist er und hatte mein Zimmer von knapp 30 Grad in unter fünf Minuten auf knapp 20 Grad runtergekühlt.

Naja, war mehr so ein Empfinden. Aber ist schon schön gewesen.

Aber bevor ich wieder Kritik ernte, weil ich über Luftzeugs und Sommer rede, schreib ich wohl lieber zum Thema.

Ab Mitte Juli hau ich wieder richtig rein, da geht's bei mir etwas entspannter zu.

Ich will nicht zu viel versprechen, aber ich hab schon einige Ideen.

Frischen luftigen Gruß an alle. Euer euch allen sympatischer Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

> Schön leise ist er und hatte mein Zimmer von knapp 30 Grad in unter fünf Minuten auf knapp 20 Grad runtergekühlt.
Das ist genau das, was ich brauche :shock:. Kannst du unser einer
vielleicht sagen, wo du das Gerät gekauft hast?
Bild
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

ein paar einfache geometrische grundfiguren werden jetzt zum teil identifiziert, auch wenn er manchmal unmögliche dinge für solche hält. wenn sie mathematisch perfekt sind geht's aber eigentlich problemlos. macht fast nur mit "flood-find_0" sinn.
man kann dateinamen (bmp/jpg) auch als parameter an die exe übergeben (oder an ne verknüpfung), bzw das prog per drag'n'drop starten...

http://www.wannabephoenix.de/PB/ImageRecognition.zip
Zuletzt geändert von #NULL am 01.02.2017 17:58, insgesamt 1-mal geändert.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Videoanalyse Reloaded

Beitrag von Xaby »

Hallo Fans,

nach langer Zeit des Wartens mal wieder ein Beitrag von mir zum Thema.

Diesmal mit neuem Ansatz. ... Ich kann euch die Tür nur zeigen, hindurch gehen müsst ihr selbst /:->

Ansatz:

Eigentlich wollte ich mal schauen wie gut oder schlecht die Filme auf der Festplatte so sind, weil es mich aufgeregt hat, immer wieder schlechte Filme zu sehen. ...
Aber die Filme zu sortieren wollte ich nicht per Hand. Vor allem, wenn man jemanden kennt, der einen kennt, der schon mal davon gehört hat ...
Wir reden hier von gut einem Terrabye Filme aus den verschiedensten Kathegorien und in unterschiedlichster Qualität.

Also wie auch immer.

Mein Anastz:
Bild

Ich nehme mir eine beliebige (festlegbar und einstellbar) Anzahl von Bildern aus dem Video/Film (der Videodatei) und analysiere die Bilder.
Die Bilder werden zufällig über aus der ganzen Länge gewählt.
Je nach dem, wie genau man die Analyse betreiben will, nimmt man mehr oder weniger Bilder ... (Nicht dass man durch Zufall genau ein sehr schlechtes Bild genau vor dem nächsten I-Frame aufgreift)
Oder das Bild einfach mal wegen Szenewechsel schwarz war oder man hat den Abspann bzw. Vospann erwischt.

::: Ich hab also nun Bilder zu analysieren.

Sicherlich ist die Dimension schon entscheident, aber es gibt ja auch gut gerippte (hab ich gehört, das es sowas geben soll) SVCDs / MDVDs oder eben schlecht aufgenommene (illegal) abgefilmte Videos bei gleicher Auflösung.

....

Was ist Qualität?

Ich würde sagen Filme, die nicht zu hell und nicht zu dunkel sind. Filme, die nicht blau oder rot stichig sind. Also alles in allem gut ausgewogene Farben haben. >> Einen grpßen Dynamikbereich :o

-----------------------------------------------------------------------

Mein Programm macht nichts weiter als ein Histogramm.

Also noch nichts wildes. Zieht einfach mal verschiedene Bilder auf die Exe.
(zweites Fenster kann neben her geöffnet werden)

Verändert ruhig mit einem Bildbearbeitungsprogramm den Kontrast oder Färbt es ein oder setzt es auf Schwarzweiß. Spielt ein bisschen mit der Gradiation und der Helligkeit und auch der Sättigung.

Bei nachträglicher Kontrastastveränderung kann man das zum Beispiel am Histogramm erkennen. Denn da sind wie bei MP3 zu WAVE ...
Kleine Zacken in der Kurve. (Kaum sichtbar für's Auge)

>>>>>>>>>>>>>>>>>>>>>>>>>

Was hab ich vor (mit eurer Unterstützung)?

Das Programm kann erkennen, ob ein Bild gut oder schlecht aussieht.
Und Spekulationen machen, was drauf zu sehen ist.
Webcam-Aufnahme, High-Key/Low-Key, Amateur-Foto, Profifoto, Gegenlichtaufnahme, Tag oder Nachtaufnahme, ...
Schwarzweiß-Aufnahme ...
Bild wurde nachträglich bearbeitet ... wenn ja wie ...

Vielleicht kann man auch bei bestimmten Häufigkeiten auf bestimmte Motive schließen:
Blaues Wasser, Weißer Schnee, grüne Wiese, viel nackte Haut, ...

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Wenn man danach noch die Schärfe eines Bildes ermitteln kann
(ähnlich wie bei vorrübergehendem Code ... )
dürfte einer halbwegs einfachen, schnellen und guten Videoanalyse nichts im Wege stehen und man kann wenigstens sagen:
Gute Qualität oder Miese Qualität

Und mit Kombination der Objekterkennung kann man vielleicht sogar schon genaueres sagen, worum es im Film gehen könnte.

Vielleicht um leicht bekleidete Mädels am Wasser oder im Wald :mrgreen:

PURE BASIC V.4.x

Code: Alles auswählen

; Folker Linstedt, 22.08.2006, Farbfilter

#Image=1
#Datei=2
#Fenster=3
#Bild=4
#Histogramm=5

UseJPEGImageDecoder()

Procedure RefreshWindow(NewSizeW,ThumbH)
  StartDrawing(WindowOutput(#Fenster))
  DrawImage(ImageID(#Image),10,10,NewSizeW,ThumbH)
  DrawImage(ImageID(#Histogramm),10,ThumbH+20)
  StopDrawing()
EndProcedure

OpenWindow(#Fenster,10,10,400,550,":: FL BildANALyse :: > Histogramm RGB <",#PB_Window_SystemMenu)

;Inpu.s=Input()
;Eingabe.l=Val(Inpu)


Anzahl=CountProgramParameters()


For Index = 0 To Anzahl-1

  Dim F.l(2,255)
  Dim S.l(2,255)
  
;CreateGadgetList(WindowID(#Fenster))

LoadImage(#Image,ProgramParameter(Index))
;ImageGadget(#Bild,10,10,80,80,ImageID(#Image))  

ScaleH=200
CreateImage(#Histogramm,256,ScaleH)

ThumbH.l=160
NewSizeW.l=Round((ImageWidth(#Image)/ImageHeight(#Image)*ThumbH),0)

RefreshWindow(NewSizeW,ThumbH)

StartDrawing(ImageOutput(#Image))

For y=0 To ImageHeight(#Image)-1 ; Erstellt Histogramm
  For x=0 To (ImageWidth(#Image)-1)
    
    RR.l : GG.l : BB.l : p.l : R.l : G.l : B.l : Z.l
    
    p=Point(x,y) ; Später ersetzen durch Buffer
    
    R=Red(p)
    G=Green(p)
    B=Blue(p)
    
    F(0,R)+1
    F(1,G)+1
    F(2,B)+1
    
    Next 
 Next

StopDrawing()

For t=0 To 255 ; Erstellt Kopie vom Histogramm
  S(0,t)=F(0,t)
  S(1,t)=F(1,t)
  S(2,t)=F(2,t)
Next

SortArray(S(),1)

MaxH=Round(S(0,0)/ScaleH,0)



StartDrawing(ImageOutput(#Histogramm))
For t=0 To 255
  ;PH=Round((F(0,t)+F(1,t)+F(2,t))/3/MaxH,0)
  LineXY(t,ScaleH-1,t,Round(ScaleH-F(0,t)/MaxH,0),RGB(255,0,0))
  LineXY(t,ScaleH-1,t,Round(ScaleH-F(1,t)/MaxH,0),RGB(0,255,0))
  LineXY(t,ScaleH-1,t,Round(ScaleH-F(2,t)/MaxH,0),RGB(0,0,255))
  
Next

StopDrawing()


Next


Repeat
  RefreshWindow(NewSizeW,ThumbH)
  Event=WaitWindowEvent()
  
  
Until Event = #PB_Event_CloseWindow

CloseWindow(#Fenster)
http://de.wikipedia.org/wiki/Histogramm


Freue mich auf eure Unterstützung, vielleicht gibt es ja auch schon sowas in besser oder sogar als PB-Code.

Schreibt ruhig mal den Link. Danke, Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Was ich noch erwähnen wollte

Beitrag von Xaby »

Denkbar wäre ja so eine Art Datenbank für ein Neurales-Netz-Dingli.

Also ein Histogramm egal für welches Bild (Größe oder Inhalt)

ist bei 24 Bit Farbtiefe immer 3072 Byte groß.

3 (Farben RGB) * 256 (Helligkeiten) * 4 (Byte für LongInt)

Man könnte jedes Bild, was man dem Programm gezeigt hat etwas zuweisen. ...
Das Programm fragt also: Was sehe ich und wie gut ist das Bild.

Bei was sehe ich könnte die Antwort sein:
Gesicht, Mensch, Auto, Landaschaft, Apfel, Haus ...

Nicht zu genau und nicht zu allgemein.

Bei der Qualität ins Stufen: ... 1 bis 10 (oder mega mies bis ultra top)

:::

Das Programm bekommt natürlich Grundkenntnisse wie oben angegeben bzw. wie aus dem Wiki-Link erkenn bar.

Das Programm rät anfangs natürlich noch und liegt oft daneben.
Aber mit der Zeit entwickelt es dann seinen eigenen Allgotithmus oder muss immer die Datenbank durchforsten, um ähnliche Proben zu finden.
Mit gewissen tolleranzen

... Und am Ende sollte es in der Lage sein, wenigstens gute Spekulationen über den Bildinhalt machen zu können.

Und in Verbindung mit der Objekterkennung ... wäre da sicherlich ne Menge drin.

Ich selbst bin eher der Typ mit Ideen, aber zu wenig Zeit für's Umsetzen.

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

Kleine Änderung

Beitrag von Xaby »

Damit man das Histogram ein bisschen besser sehen kann und vor allem die kleinen Löcher (Bei Kontrasterhöhung) besser wahrnimmt ...

Code: Alles auswählen

; Folker Linstedt, 22.08.2006, Farbfilter

#Image=1
#Datei=2
#Fenster=3
#Bild=4
#Histogramm=5

UseJPEGImageDecoder()

Procedure RefreshWindow(NewSizeW,ThumbH)
  StartDrawing(WindowOutput(#Fenster))
  DrawImage(ImageID(#Image),10,10,NewSizeW,ThumbH)
  DrawImage(ImageID(#Histogramm),10,ThumbH+20)
  StopDrawing()
EndProcedure

OpenWindow(#Fenster,10,10,600,550,":: FL BildANALyse :: > Histogramm RGB <",#PB_Window_SystemMenu)
;Inpu.s=Input()
;Eingabe.l=Val(Inpu)

Anzahl=CountProgramParameters()

For Index = 0 To Anzahl-1

  Dim F.l(2,255)
  Dim S.l(2,255)
  
;CreateGadgetList(WindowID(#Fenster))
LoadImage(#Image,ProgramParameter(Index))
;ImageGadget(#Bild,10,10,80,80,ImageID(#Image))  

ScaleH=200
CreateImage(#Histogramm,512,ScaleH)

ThumbH.l=160
NewSizeW.l=Round((ImageWidth(#Image)/ImageHeight(#Image)*ThumbH),0)

RefreshWindow(NewSizeW,ThumbH)

StartDrawing(ImageOutput(#Image))

For y=0 To ImageHeight(#Image)-1 ; Erstellt Histogramm
  For x=0 To (ImageWidth(#Image)-1)
   RR.l : GG.l : BB.l : p.l : R.l : G.l : B.l : Z.l
    p=Point(x,y) ; Später ersetzen durch Buffer
    
    R=Red(p)
    G=Green(p)
    B=Blue(p)
   
    F(0,R)+1
    F(1,G)+1
    F(2,B)+1
    
    Next 
 Next

StopDrawing()

For t=0 To 255 ; Erstellt Kopie vom Histogramm
  S(0,t)=F(0,t)
  S(1,t)=F(1,t)
  S(2,t)=F(2,t)
Next

SortArray(S(),1)

MaxH=Round(S(0,0)/ScaleH,0)

StartDrawing(ImageOutput(#Histogramm))
For d=0 To 1
For t=0 To 255
  ;PH=Round((F(0,t)+F(1,t)+F(2,t))/3/MaxH,0)
  LineXY(t*2+d,ScaleH-1,t*2+d,Round(ScaleH-F(0,t)/MaxH,0),RGB(255,0,0))
  LineXY(t*2+d,ScaleH-1,t*2+d,Round(ScaleH-F(1,t)/MaxH,0),RGB(0,255,0))
  LineXY(t*2+d,ScaleH-1,t*2+d,Round(ScaleH-F(2,t)/MaxH,0),RGB(0,0,255))
Next  
Next

StopDrawing()
Next

Repeat
  RefreshWindow(NewSizeW,ThumbH)
  Event=WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

CloseWindow(#Fenster)
:allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Alves
Beiträge: 1208
Registriert: 19.04.2006 18:24
Kontaktdaten:

Beitrag von Alves »

Könntest du das mal für die 3.94er mal kompilieren?
Antworten