PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bilder einer Webcam / DV-Cam analysieren



nux
17.07.2004, 18:20
Hallo,

Ich versuche zur Zeit eine Bilderkennung mit Visual Basic 6 zu programmieren. Für den Anfang würde es Reichen, wenn ich
in einem Bild mal Farben finden würde und diese Grafisch
darstellen kann. Als Kamera stehen eine Standard Webcam mit einer
Auflösung von 640x480 interpoliert, oder eine SONY DV-Camera mit
Firewire und eine Auflösung von ~720x600 bereit.

Mein Ansatz war, dass ich die Abfrage max. 4x in der Sekunde mache.
Ich zeige das Entsprechende Bild in einer PictureBox an und überprüfe
jedes 5 Pixel auf seine Farbe. Finde ich eines das den Kriterien entspricht, suche ich im Umkreis weiter. Dann muss ich Irgendwie das Zentrum des Farbkfleckes Erkennen und somit die Bewegung einer Farbe erfassen.

Wenn das mal einigermaßen funktioniert, würde ich gerne eine Einfache
Objekterkennung mittels einer Kantenerkennung realisiere. Doch darüber
habe ich noch keinerlei brauchbare Informationen gefunden, die das
ausführlich erläutern.

Die Antworten müssen nicht auf Visual Basic bezogen sein, sondern
können gerne auch allgemein gehalten werden.

Ich freue mich über jede Hilfe.

Grüße
... nux ...

Javik
17.07.2004, 18:27
Also, ich wei ja nicht, aber wie du des beschreibst, wird des nciht sehr schnell werden... Es wäre wohl am schnellsten , wenn du des Bild nicht erst anzeigen würdest und es dann mit der lamen point Methode machst, sondern man müsste die Signale der Webcam gleich ohne des langsame anzeigen abfragen... Wie des allerdings gehen soll, da kann ich dir net helfen ^^ Vlt gibts ja irgendeine API die dies schaft...
Gruß Javik

17.07.2004, 18:31
So was in etwa hatten wir schon mal im Gespräch, damals haben wir ein Programm gefunden, womit das erfassen eines Bildes von einer Webcam möglich war.
Ich habs ma angehängt. Vielleicht kannsts ja was mit anfangen, ich hab mir das noch nich so wirklich angeguckt, weil ich gar keine Webcam hab 8-[

mfg God

God
17.07.2004, 18:32
Arrg, der Beitrag oben is von mir.

mfg

robotxy
17.07.2004, 18:41
Hi!
Ich bin auch gerade dabei sowas zu schreiben(in VB).
Aber selbst das auslesen jedes einzelnen Pixel dauert auf einem 3 GHZ Rechner mit der API ungefähr eine halbe Sekunde.
Das finden des hellsten Punkt dauert nochmals 0,3 S(Auflösung 320 * 240).
Vielleicht gibt es ja noch eine schnellere Methode in VB.
Wäre auch dran interessiert.
MFG
Rasmus

God
17.07.2004, 19:01
Hi!

Ich glaub ne andere Möglichkeit wäre noch das Bild von der Webcam in ner PictureBox reinzusetzen, wie es das Programm ja schon macht und dann einfach die einzelnen Pixel abfragen, oder hast du das scho so gemacht?

mfg God

robotxy
17.07.2004, 19:08
Ich habe den Videostream mit der API empfangen und danach mit einer APIfunktion den RGB Wert jedes einzelnen Pixels ausgelesen.
Danach habe ich die Farbwerte Verglichen und den hellsten Punkt definiert.
Das ganze hat ungefähr 1S gedauert.
MFG
Rasmus

Trabukh
17.07.2004, 19:08
Es gibt ne API names GetPixel. Ist glaub ich in der GDI32-DLL enthalten, das weiß ich jetzt nicht so genau. Diese API kann im Prinzip genau das selbe wie Point, ist aber um etwa 30% schneller.

Gruß, Trabukh

robotxy
17.07.2004, 19:11
@Trabukh
Ja das stimmt, aber so wie ich das mache geht es noch um einiges schneller.
MFG
Rasmus

NumberFive
20.07.2004, 19:51
robotxy so mache ich es auch aber bei mir geht es unter ein sekund für den vor gang brauch ich 250 msec. wieviel punkte verarbeitest du ?

hast du ausdem hellsten punkt noch was programmiert ?

https://www.roboternetz.de/phpBB2/viewtopic.php?t=1256&postdays=0&postorder=asc&start=0

hier kannst du mein erfolge nicht erfolge ansehen

robotxy
20.07.2004, 21:16
@Numberfive
Das Programm zeigt in dem einen Fenster den Livestream an.
Davon macht er jede Sekunde einen Screenshot.
Bei diesem ließt er jedes Pixel ein(320 *240).
Danach sucht er den hellsten Punkt.
Das ganze dauert 834ms.
Ohne die Livebildübertragung von der Cam im Hintergrund,
würde das ganze bestimmt um einiges schneller gehen.
Als nächstes kommt das Erkennen der Bewegungsrichtung des Fahrzeuges.
Wie gut funktioniert es schon bei dir?
MFG
Rasmus

NumberFive
20.07.2004, 21:40
Hallo Rasmus,

die Technik ist sehr änlich bzw. gleich selbe grösse.
nur das ich das bild direckt im direcktX treiber abhole
und so mit in der stream paralle anzeigen kann fast
kein zeit verlust duch den stream. Habe auch nur ein amd 1000.

Das was du da vorhast hört sich gut an und wenn ich mir dazu dein alter ansehe werde ich rot.

Also bei mir funktioniert die Bewungserkunng in so weit das weiß wenn
sich was vor der cam bewegt. habe dann mit mit der kanten erkennung
angefangen was zwar langsam ist aber ber kontrast reichen bilder funktioniert.(ca. 800 msec)
Da ist jetzt die Software stehen auch geblieben kam irgend wie nicht dazu weiter machen.
Da ich gefrustet war und auch im geschäft ziemlich eingebungen.

Hast du dir mal die bilder in den anderen thread angekuckt da kann ziemlich viel erkennen finde ich.

wie willst du die richtung erkennung machen ehrlich gesagt ich habe es bis jetzt nicht hin bekommen.

Vielleicht können wir ja zusammen arbeiten ?

Gruß

robotxy
21.07.2004, 17:00
Naja, nach dem ich mir das nochmal überlegt habe,
werde ich doch mit der Kantenerkennung anfangen.
Bei dir funktioniert es ja schon richtig gut.
Gibt es nicht eine Möglichkeit aus den Ergebnissen eine 3D Karte zu zeichnen?
Du hast doch in C++ programmiert oder?
Werde mich in den nächsten Tagen mal an die Kantenerkennung setzen.
MFG
Rasmus

NumberFive
21.07.2004, 19:23
Ja ich habe mit c++ programmiert aber das ist doch fast egal weil der
algorytmus muß tuen und schnell sein damit ist die programmier
sprach fast egal. kann vb gut gelesen ich weiß ja nicht wie du C code lesen kannst. ich male die erkannten kannten ein fach mit setpixel
auf ein fenster neben dem viedeo bil so kann ich erkennen was der
algorytmus macht. da man das ergebnis eh speichern muß dami man
nachher vergleichen kann ist das nicht so schlimm ausdem ist im debug die geschwindig keit nicht ganz so tragisch kann man im release dann wieder ausschlaten bzw. in vb kann sachen mit debug ausgabe oder ohne.

Mein problem zur zeit:

00000000
01111110
01000010
01000010
01111110

wie erkennt man daraus das es ein viereck ist ?
oder ein kreis oder so.
bzw ist das in der mitte oder rechts oder links

die zahlen bedeuten nur 1 = kante 0 = keine Kante

ich hoffe du kannst mir folgen

robotxy
21.07.2004, 19:30
Ja, ich kann dir folgen.
Mein Problem ist das die SetPixel Funktion nur im Form und nicht in einer Leeren PictureBox funktioniert.
Man müsste doch die 90° Winkel erkennen können, oder ?
MFG
Rasmus

robotxy
21.07.2004, 20:57
Mein Kantenerkennungs Algo funktioniert schon gar nicht so schlecht.
Ich habe mal einen Screenshot gemacht.

Javik
22.07.2004, 13:42
So ich hab jetzt auchmal sowas gemacht :)
Hat 5 Minuten gebraucht, is deshalb no net so gut, aber ich werde es noch verbessern.... Des Bild is noch von ner älteren Version, aber viel besser hab ichs noch nicht hinbekommen...
Zu dem Problem mit der erkennung von kästchen hab ich noch keine lösung, aber ich werde auch mal überlegen !

robotxy
22.07.2004, 14:08
Das gefällt mir auch sehr gut, bloß wird es bei dir nicht ganz einfach mit der Erkennung eines Viereckes, da die Linien sehr Ungleichmäßig sind.
Bin schon gespannt auf die Nächsten Ergebnisse.
MFG
Rasmus

Involut
23.07.2004, 00:02
...also meinen absoluten Respekt für jeden der sowas hin kriegt!..nur so nebenbei.... :-)

robotxy
23.07.2004, 15:15
Ich habe schnell noch einen Algo geproggt ein Kreuz erkennt, bevor ich weg fahre. Er erkennt große als auch kleine Kreuze.
Aber leider erkennt er sie bis jetzt nur, wenn sie sich vom Untergrund abheben(also nicht schwarze auf grauem Untergrund).
Die Farbe, des zu erkennenden Kreuzes muss vorher eingestellt werden.
Mit mit dem Einlesen der Pixel dauert das ganze 141ms.
Habt ihr noch Ideen?
MFG
Rasmus

Xeus
24.07.2004, 12:15
Die Sache mit der Pixelerkennung ist echt genial. Aber leider hab ich nur delphi und kein VB habt ihr da ne kostenlose Lösung für mich

gruß

Xeus

Javik
24.07.2004, 12:41
Ähm ? Was stellts du dir vor ?
Du kannst es dir doch auch in Delphi Programmieren ?!

Xeus
24.07.2004, 12:57
Aber ich trau mir das nicht zu wenn ich ehrlich bin wär halt cool wenns da schon was gäb.

24.07.2004, 15:54
Du meinst du willst diese Kantenprogramm ? Des is zwar net schwer aber ok... Wenn ichs dir gebe bringts dir auch nix, weil du mit dem Programm nichts anfangen kannst. Des bringt dir nur was wennst des irgendwo einbinden kannst und dazu musst du des individuel anpassen

Xeus
24.07.2004, 17:06
Ich werds versuchen, hab zwar noch keine AHNUNG wie aber es ist noch kein Meister vom Himmel gefallen.

zefram
24.07.2004, 19:39
Hallo,

erstmal finde ich es toll, dass sich hier einige an die Bildverarbeitung heranwagen. =D>
Vielleicht könnt ihr ja die von euch verwendeten Algorithmen (z.Bsp. zur Kantenerkennung) ein wenig erläutern, damit alle etwas davon haben.
Evntl kann man dann gemeinsam den Code etwas optimieren und bessere Laufzeiten erreichen (800ms für die Kantenerkennung ist schon ne Menge, das lässt sich sicher auf einen Bruchteil reduzieren).

Javik
25.07.2004, 08:52
Ich glaub du stellst dir des etzwas zu einfach vor den code zu verlkeinern... Ich werde des Prograsmm jetzt mal in VB.Net machen, vlt is des da schneller...
Ich denke wenn man sich hinzetzt und es wirklich will dann bekommt mans auch selber raus ^^
Wo ein Wille ist ist auch ein Weg....
Ihr schaft dass schon ;) Einfach mal überlegen wo kannten sein könnten. Vlt sind se ja da wo eine farbe in eine andere übrgeht ?!?! ALso jetzt isses ja wirklich nimmer schwer ^^

Johannes
25.07.2004, 09:50
Moin,
da ich gestern erst aus dem Urlaub wiedergekommen bin, habe ich jetzt erst diesen Thread gesehen.

Mal eine Frage: Was wollt ihr mit der Kantenerkennung anfangen? So wie ich das sehe, fragt ihr Pixel für Pixel ab, ob er an einer Kante liegt. Und wenn das so ist, zeichnet ihr einen Punkt, wodurch dann ein Bild entsteht, dass die Konturen des Bildes zeigt. Was aber noch fehlt, und ohne das kann der Roboter damit wohl nie was anfangen, ist die Umwandlung in Pfade. Schwarze Punkte, die nebeneinander liegen, machen unser Auge zwar automatisch zu einer Linie, der Rechner tut das aber nicht so einfach. Überlegt mal, wie man die Punkt-Matrix zu einer Ansammlung von Linien macht. Und dann wird es auch nicht mehr so schwierig sein, ein Quadrat von einem Kreis zu unterscheiden.

Gruß
Johannes

zefram
25.07.2004, 10:59
Ich glaub du stellst dir des etzwas zu einfach vor den code zu verlkeinern...
Ich weiß nicht, mein Versuch zur Kantenerkennug braucht auf nem Duron 700 bei einem 640x480 Bild ganze 80ms ...

Man kann das Problem auf verschiedene Arten lösen. Einfach suchen, wo sich die Farben ändern oder eben einen effizienten Algorithmus verwenden, der im Prinzip das gleiche macht, aber eben effizienter. Darauf will ich hinaus.
Das Forum heißt schließlich "... Algorithmen ...", also sollten wir hier nicht nur die Ergebnisse pärsentieren, sondern auch mal das Wie ansprechen.

Johannes hat natürlich recht, dass mit den Kanten allein noch nix gewonnen ist, hier muß sich zum Beispiel noch eine Bildsegmentierung anschließen, aber das is dann wieder eine andere Geschichte.

Javik
25.07.2004, 17:08
Genau das was Johannes anspricht versuche ich im moment...

Zerram , bist du dir sicher das des stimmt ?? Ich hab in Vb auch den hauseigenen timer mitlaufen lassen der hat mir 67 ms angezeigt... aber der genauere Timer einer API hat dann eben 700ms angezeigt.... Ich willd deine Programmierkünnste nicht in frgae stellen aber für mich hört sich das sehrt unwarscheinlich an...

Johannes
25.07.2004, 17:34
Warum postet Ihr denn nicht einfach eure Codes? Oder wenigstens die Algos, wie zefram schon gesagt hat. Das würde vieles um Einiges einfacher machen.

Gruß
Johannes

25.07.2004, 18:21
Also ok, unter www.tu-chemnitz.de/~niko/biber gibts die .exe und ein paar Testbilder.

Bitte beachten: Das Prog schluckt im Moment nur .bmp mit 256 Graustufen.

Der C++ Algorithmus zur Kantenerkennung:


/************************************************** ************************
* Methode: sobel_kombiniert *
* Sichtbarkeit: public *
* Parameter: schwelle *
* *
* *
* Funktion: führt eine Faltung mit dem beiden *
* Sobel-Operatoren aus (Gradientenverfahren), *
* benutzt den in 'schwelle' übergebenen Wert zur *
* Binearisierung des Bildes *
************************************************** *************************/
bool TbiberImage::sobel_kombiniert(TbiberPix schwelle,TbiberPix *oldPix)
{TbiberPix kern1[3][3]={ {1,0,-1},
{2,0,-2},
{1,0,-1}};
TbiberPix kern2[3][3]={ {1,2,1},
{0,0,0},
{-1,-2,-1}};
int summe=0,s1=0,s2=0;
int x,y;
TbiberPix* newPix;
int *ykoord, y1,y2,y0;

if (!(newPix=(TbiberPix*)calloc(TbiberImage::size,siz eof(TbiberPix)))) return false;
if (!(ykoord=(int*)calloc(width,sizeof(int)))) return false;
if (oldPix) memcpy(oldPix,pixels,TbiberImage::size*sizeof(Tbib erPix));


for (y=0;y<height;y++) ykoord[y]=y*width;

for (y=1;y<height-1;y++)
{ y0=ykoord[y];
y1=ykoord[y+1];
y2=ykoord[y-1];
for (x=1;x<width-1;x++)
{ s1=-getPix(y2+x-1)+getPix(y2+x+1)-2*getPix(y0+x-1)+2*getPix(y0+x+1)-getPix(y1+x-1)+getPix(y1+x+1);
s2=-getPix(y2+x-1)-2*getPix(y2+x)-getPix(y2+x+1)+getPix(y1+x-1)+2*getPix(y1+x)+getPix(y1+x+1);

// summe=sqrt(pow(s1,2)+pow(s2,2));
summe=(abs(s1)+abs(s2)) /2;

if (schwelle)
{ if (summe<schwelle) summe=0;
else summe=255;
}
else if (summe>255) summe=255;

newPix[y*width+x]=(TbiberPix)summe;
}
}

memcpy(pixels,newPix,TbiberImage::size*sizeof(Tbib erPix));
free(newPix);

return true;
}


... ist eine Faltung mit dem horizontalen und vertikalen Sobel-Operator.

zefram
25.07.2004, 18:24
Das letzte Posting war von mir, sorry.

Noch was zu dem Programm: Lade mal das bild rechtecke2.bmp und wähle dann im Menü Segmentierung das Zeilenkoinzidenzverfahren. In der drop-down Liste kann man dann alle gefundenen Objekte durchgehen und unten wird angezeigt, ob es als Rechteck, Sechseck usw. erkannt wurde.
Dafür wird die Datei "objekte.dat" benötigt.

Baumrinde
26.07.2004, 12:11
Hi!

Ich habe auch letztens mit graphischer Bearbeitung angefangen.
Nur habe ich als einzige Lösung, dass ich jeden Pixel einzelln auslese und die RGB werte Checke.
Dafür brauche ich dann pro Bild etwa 3s!!!!

Wenn ich mit mal eure Zeiten so angucke, naja!

Könnt ihr mit mal bitte posten, welche API's ihr benutzt und vieleicht noch ein bissele Code?
Wär echt net.

Mit freundlichen Grüßen
Baumrinde

Ach ja: Ich Code natürlich auch in VB!

Javik
26.07.2004, 12:40
Ich hab eigentlich keine APIs benutzt nur eine um die Zeit zu stoppen...

Baumrinde
26.07.2004, 14:13
Wie bearbeitet ihr denn sonst die Bilder?

26.07.2004, 14:52
Ihr solltet die Bilder auf keinen Fall innerhalb irgendeiner PictureBox oder wie immer sich das Steuerelement unter VB nennt, bearbeiten. Kopiert euch die Pixel in ein großes Array im Speicher und führt eure Operationen dort aus. Die Zugriffe auf die einzelnen Pixel über die Steuerelement-Methoden zu machen, erzeugt eine ganze Menge Overhead, den man nicht braucht.

(VB ist vielleicht auch nicht unbedingt die beste Wahl für zeitkritische Operationen, aber das ist prinzipiell erstmal egal.)

Quellcode: Den Anfang hab ich gemacht, das Prog steht auch online, vielleicht zieht jemand nach ...

Johannes
26.07.2004, 15:02
Ich denke du bist zefram?

Ich habe mir deine Sachen kurz angeschaut, aber vielleicht kannst du nochmal eine kurze Anleitung geben. Leider habe ich im Moment keine Zeit, selbst an dem Thema zu arbeiten. Ich verfolge den Thread aber trotzdem weiter.

Gruß
Johannes

zefram
27.07.2004, 20:58
Hallo,

ich habe mal eben ein kurzes Tutorial zum Thema Kantenerkennung geschrieben. Es geht nicht auf die Umsetzung in eines Programmiersprache um, sondern zeigt allein den Algorithmus.

Das Tutorial gibts hier als PDF unter www.tu-chemnitz.de/~niko/biber/tutorial/tutorial.pdf .

Bei entsprechendem Feedback bin ich auch gern bereit, das Tutorial weiter auszubauen und weitere Themen darzustellen. Das aber natürlich nur, wenn sich auch jemand ernsthaft für solche Sachen interessiert und es dann auch liest :)

nux
27.07.2004, 21:09
Hallo zefram,

Ich habe das Tutorial gelesen und freue mich wirklich, dass ich nun
etwas handfestes habe auf dem ich meine Kantenerkennung aufbauen
kann. Wenn sich noch weiter Personen für dieses Projekt begeistern
könnten, würde ich mich über eine Fortsetzung des Tutorials sehr freuen.

Vielen Dank, Grüße nux

Javik
28.07.2004, 05:55
Tja da hast du wohl einen kleinen Vorteil :) ich will auch studieren, des wird allerdings ncoh ein bischen dauern ;)

Des Tutorial find ich SUPER hab alles verstanden :) Danke !
Ich wäre auch an einer weiterführing interessiert ;)

gruß Javik

NumberFive
30.07.2004, 10:28
Ok das Tutorial habe ich noch nicht durch gearbeitet aber sieht echt gut aus. Bei meiner zeit messung gibt es ein fehler von 18,5 sltel sekunde ist halt in windows so. Die zeit von 800 ms ist mit graustufen wandlung und mal der ergbnisse auf dem bildschirm deshalb dachte ich eigendlich das die nicht so schlecht sind. meinen code werde ich mal überarbeiten und auch zu Verfügung stellen. aber zu zeit habe ich ein nerven entzündung im arm und bin so mit etwas sehr langsam im tippen.

zefram wie machst du die um rechnung in graustufen ?

habe bei mir noch ein gausfilter rein gemacht damit ich die unterschiedlichen licht verhälnisse ein bisschen ausgleichen kann.

für die Kanten erkennug(pfade) wollte ich den canny algo nehmen
aber entweder kann ich den nicht programmieren oder der ist zu langsam.

Also was für mich im moment das wirklich größte probleme sind:
1. die erkennung der pfade das heist ich habe ein bild wo die kannten sauber raus gearbeitet sind. aber wie erkenne ich jetzt das muster.
2. Wie automatisiere ich die erkennung der pixel unterschiede bei verschinden licht verhältnissen. Auf meiner software ist im moment ein schiebe regler mit dem man das level ein stellen kann aber das währe
ja blöde wenn man das von hand ein stellen müsste noch da zu können sich ja die lich verhältnisse ändern. während der laufzeit.

also so stelle ich mir das vor.

Erste stufe:

Der robi ist in einem Raum es gibt keine hindernisse alle wände sind weiß.
irgend wo an der wand ist ein kreuz mit kreis drum. da soll de robi hinfahren. Das Kreuz ist in der höhe der cam so das keine Nick bewegungen der Cam nötig sind.

Das währe mein erstes ziel.
Ich weiß die vostellung ist optimiert aber ich denke mal sollte klein anfangen.

So ich hoffe der text ist einiger massen zu verstehen.

Gruß

Johannes
30.07.2004, 13:15
Das Tutorial ist wirklich gut. Habs mir gestern durchgelesen.

Zur Pfaderkennung: Numberfive, kannst du mal kurz deine Vorgehensweise erläutern?

Gruß
Johannes:

P.S. Bist du irgendwie im Urlaub? Habe lange nichts mehr von dir gehört. Meine MC ist auf gutem Wege...

zefram
01.08.2004, 20:15
Hallo,

habe das Tutorial mal aktualisiert und noch ein Kapitel über die Umrechnung in Graustufen (sprich: HSV Farbraum) angefügt sowie das Kapitel über die Kantenerkennung ein bisschen ergänzt.

Bin nächste Woche nicht da, daher gibts erst danach was Neues. Vielleicht was über die Frage was man mit den gefundenen Kanten machen kann.

Numberfive: Canny-Operator ist interessant, wäre klasse wenn du mal deine Ergebnisse posten kannst, wenn es funzt. (Und den Algorithmus natürlich ;) )

Bis dann.

Involut
03.08.2004, 08:30
Hi Zefram,
Tutorial ist vom Inhalt und Aufbau sehr Gut!
Gibt nicht so viele die sich so reinhängen für ein bisschen Anerkennung.
Mach bitte weiter so.
mfg

Involut

Involut
03.08.2004, 08:44
Hi,


Ihr solltet die Bilder auf keinen Fall innerhalb irgendeiner PictureBox oder wie immer sich das Steuerelement unter VB nennt, bearbeiten. Kopiert euch die Pixel in ein großes Array im Speicher und führt eure Operationen dort aus. Die Zugriffe auf die einzelnen Pixel über die Steuerelement-Methoden zu machen, erzeugt eine ganze Menge Overhead, den man nicht braucht.

Wenn Du für die oben beschriebene Operationen einen VB Code hast(sorry ich bin mir nicht sicher ob du jetzt nur C machst),und diesen Posten würdest.
Könnten und würden bestimmt ne Menge Leute damit rumexpierimentieren bzw dein Tutorial ausprobieren.
Ich denke das gerade ein Bild ins Array zu bekommen für die meisten die grösste Hürde ist.Und desto mehr daran rumbasteln desto besser,sag ich immer.

mfg

Involut

Trabukh
04.08.2004, 09:09
Ich hab mir das zwar noch nicht komplett reingezogen, aber das klingt schon sehr interessant, zumahl da auch auf das Speichern eines Bildes in einem Array eingegangen wird: http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tutorial/tutorial003.shtml

Gruß, Trabukh

EDIT: Den Anfang kann man getrost überspringen, ab "Pointer" wird interessant...

Trabukh
04.08.2004, 10:22
Der Artikel hier ist noch besser: http://www.activevb.de/tipps/vb6tipps/tipp0255.html

Involut
04.08.2004, 19:01
Ich hab mir das zwar noch nicht komplett reingezogen, aber das klingt schon sehr interessant, zumahl da auch auf das Speichern eines Bildes in einem Array eingegangen wird: http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tutorial/tutorial003.shtml


link will nich

Gruß, Trabukh

EDIT: Den Anfang kann man getrost überspringen, ab "Pointer" wird interessant...

Involut
04.08.2004, 19:01
also de rlink will nicht...sorry verklikt

Involut
04.08.2004, 19:55
habs gefunden ;-)

NumberFive
05.08.2004, 18:49
Numberfive: Canny-Operator ist interessant, wäre klasse wenn du mal deine Ergebnisse posten kannst, wenn es funzt. (Und den Algorithmus natürlich )


leider tut er ja nich das ist das problem da er bei linen dir nur ein pxiel breit sind sin zu lange im kreis dreht bis er die richtung findet (sehr einfach ausdrückt).



Zur Pfaderkennung: Numberfive, kannst du mal kurz deine Vorgehensweise erläutern?


Ich möcht so was erreichen wie ein beschreibung der form so das ich sieh in verschiedene großen wieder erkennen kann.

Eigndlich so weit wie ich das verstanden habe macht das auch der
canny so aber leider dauert das zu lange.

Also ich möcht mir nicht ein quadart merken sonder ein teil das vier rechte winkel hat und vier geleiche seiten ist ein quardart.

erkennung:
4 Ecken -> OK
vier seiten gleich lang -> OK
ziel gefunden daruf los fahren

zefram
06.08.2004, 16:56
Hallo,



Ich möcht so was erreichen wie ein beschreibung der form so das ich sieh in verschiedene großen wieder erkennen kann.


Das ist natuerlich nicht mehr ganz so einfach. Stichwoerter: Fourier-Koeffizienten, Momente.
Besonders schwer ist eben, dass die Merkmale sich nicht aendern sollen, wenn das gesuchte Objekt groesser oder kleiner oder gedreht im Bild erscheint.



Eigndlich so weit wie ich das verstanden habe macht das auch der
canny so aber leider dauert das zu lange.


Soweit ich mich erinnere, dient der Canny-Operator nur zur Kantenerkennung.



4 Ecken -> OK
vier seiten gleich lang -> OK
ziel gefunden daruf los fahren

Bist du denn schon soweit, dass du die (evntl. nicht zusammenhaengenden) Kanten zu "Objekten" zusammenfassen kannst? Wenn ja, versuch doch mal das Verhaeltniss von Umfang zu Flaeche zu bestimmen. Je nach Form (Kreis ... Rechteck ... Quadrat) erhaelt man unterschiedliche Werte, die auch recht aussagekraeftig sein koennen.

PS: Sorry fuer die fehlenden Umlaute :-$

18.08.2004, 12:32
servus,


also erst mal ALLE ACHTUNG...

RESPEKT ...

Ich habe was ähnliches vor, allerdings auf uC basierend ...

Was ich mir vorstelle eine CCD Kammera, die ein FBAS Signal liefert (RGB währe mier lieber ...) dieses wird vom 1. uC in ein "lesbares" Format gebracht und in den RAM geschrieben, danach Kantenerkennung, Ergebnis speichern ...

Evntl. habe ich daran dedacht das Bild durch verschiedene Algorhytmen laufen zu lassen ...

Kann da jemand helfen ? Kann mir evntl. ein paar hilfreiche links bzw. Algorhytmen posten ?


Danke

Chrstian

cwallukat at hotmail punkt com

Trabukh
21.08.2004, 19:26
Ich hab jetzt auch mal was gebastelt, das linke Bild ist 640x480 groß, aber ich musste den Screenshot schrumpfen, weil ich es sonst nicht hochgeladen bekam.
https://www.roboternetz.de/phpBB2/images/nickpage/24601093112612.jpg
Das ist nach dem Algorithmus aus dem Tutorial, allerdings habe ich auf die Umrechnung von RGB nach HSV verzichtet, da das Ergebnis einfach nur be...scheiden aussah!

toffa
31.08.2004, 15:04
hallo,

ich will auch anfangen, eine Bildverarbeitung zu machen in Linux. Ich will das ganze mit C++ programmieren und zur Unterstützung die Bibliothek OpenCV von Intel benutzen. Ich weiss erstmal nicht, was für eine Kamera ich da benutzen soll. Eine mit analogausgang und TV Karte dürfte wegen Software schwieriger sein als direkt vielleicht auf USB oder Firewire zuzugreifen und die Werte der Pixel in eine Datei schreiben zu lassen ? Von Hardware Progrmmierung hab ich im moment noch keine Ahnung.
Vielleicht ist ja eine Standard Webcam besser als z.B die CMUCam ?
hmmm naja was meint ihr was ich für ne Kamera brauchen könnte :)

gruß

robotxy
31.08.2004, 15:11
Ich habe eine total normale USBWebcam.
Es funktioniert super.
Die gibt es billig bei Ebay.
Was will man mehr ?
MFG
Rasmus

toffa
01.09.2004, 10:13
hab jetzt was gefunden womit ich die die daten der kamera bekomme:
dann geht es tatsächlich mit na normalen webcam werd ich wohl auch billig bei ebay holen.

http://antonym.org/?q=node/view/20

robotxy
06.10.2004, 15:16
Welche Webcam willst du dir kaufen?
MFG
Rasmus

toffa
17.10.2004, 10:12
Ich hab jetzt ausgeliehen ne Logitech Quickcam Express. Hat zwar ne bescheidene Auflösung, aber am Anfang reicht mir sowas. Bevor ich mich aber an die Cam mache will ich noch eine Servo Ansteuerung hinbekommen zum Nachschwenken der Kamera. Das dürfte aber bald passiert sein.

Gruß

silvl
26.10.2004, 09:01
Hi zusammen,

hier hat irgendjemand mal geschrieben, das er "nur" Delphi hat, beim suchen wie ich mit C++ Bildbearbeitung machen kann bin ich auf das gestossen:
http://delphi.pjh2.de/articles/multimedia/avicap.php
vielleicht hilfts ja was ;-)

/greets silvL

zefram
02.11.2004, 11:58
Na ihr Bildverarbeiter,

ich will den Thread mal wieder aufwaermen :).

Gibts denn bei euch was neues? Hat jemand den Schritt von der Kantenerkennung zur Objekterkennung versucht?

26.11.2004, 08:52
So ein witz ich scheiter schon dabei die Bilder automatisch auf meinen rechner zu übertragen. Wie schafft ihr es von der Webcam die bilder in einen Ordner zu legen?

robotxy
26.11.2004, 14:30
Mit folgendem Code(VB) geht es super:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=1933
MfG
Rasmus

pebisoft
11.12.2004, 18:30
hallo, ich kann nur von visual abraten. dies ist eine anfängersprache und sehr langsam. versuch es mit delphi. solche projekte wie ihr sie vor habt können nicht in einerakzeptablen zeit analysiert werden durch visual. dies wäre ein schritt zurück. ausserdem schleppt visual soviel unnützen code mit sich rum, was die geschwindigkeit auch bremst.
mfg pebisoft

Johannes
11.12.2004, 18:51
Im Prinzip hast du Recht, aber ich wäre nicht sicher, ob Delphi wesentlich besser ist als VB.

MJA
15.12.2004, 09:45
Also ich persönlich würde zu Java raten. Schnell, plattformübergreifend und objektorientiert. Allerdings kann ich dir in Sachen Bildverarbeitung auch nicht echt weiterhelfen. Aber da kannst du dich vielleicht an Johannes wenden?

MfG
Jan

Johannes
15.12.2004, 16:21
Also ich programmiere zwar auch Java, aber für Bildverarbeitung würde ich nicht zu Java raten, dafür ist es einfach zu langsam. Aber mit Visual Basic oder Delphi lassen sich bestimmt auch zumindest einfache Dinge realisieren.

Pascal
15.12.2004, 17:45
mit VB lässt sich auf jeden Fall was realisieren, wir haben unser Jufo-Projekt im Moment auch noch in VB, dabei wird ein Bild, auf dem Puzzleteile zu sehen sind, analysiert, Eigenschaften der Puzzleteile ermittelt und dann verglichen, welche Puzzleteile zusammengehören
für ein Bild mit ein paar Teilen braucht das Programm so um die 30 Sekunden(könnte inzwischen auch weniger sein), allerdings ist das auch ne recht hohe Auflösung, also nicht von einer einfachen webcam...
aber, wie schon gesagt wurde, ist das doch recht langsam, dsewegen wirds noch in C/C++ umgeschrieben

zefram
17.12.2004, 09:02
Eigenschaften der Puzzleteile ermittelt und dann verglichen, welche Puzzleteile zusammengehören

Das ist doch mal ein interessantes Projekt. Geht das soweit, dass das Programm alle Teile selbst zusammenpuzzelt?
Kannst du einige genauere Informationen geben, welche Verfahren und Algorithmen ihr anwendet oder ist das noch top secret, wegen Jufo?

Johannes
17.12.2004, 13:18
Jo, das mit den Puzzle-Teilen finde ich auch interessant, würde auch mal gerne mehr darüber erfahren. Auf jeden Fall wünsche ich euch viel Erfolg bei Jufo, ich war in diesem Jahr dabei :-)

Das Zusammensetzen der Teile könnte man ja auch ohne Hardware-Interface machen und nur die Bildausschnitte drehen und zusammensetzen.

Gruß
Johannes

Pascal
17.12.2004, 16:02
ich kann schon ein wenig dazu sagen, das wird zwar nicht soweit gehen, dass ich Code poste, aber einen Überblick kann ich auf jeden Fall geben

als Erstes mal vorweg, wir haben keine fertigen Algorithmen oder Verfahren verwendet, sondern alles selbst überlegt

das hat mehrere Gründe, zum Einen kannten wir uns bei Beginn des Projekts überhaupt nicht mit bestehenden Verfahren aus und zum Anderen haben unsere Verfahren für unsere Anwendung auch kleine Vorteile gegenüber den bestehenden (allerdings nur für dieses Projekt, bei anderen hätten sie keine Chance, sie sind halt speziell für diesen Fall)

nun zu einem Überblick über die Funktionen...
als Erstes(nachdem ein Bild der Puzzleteile angefertigt wurde) wird zwischen Hintergrund und Puzzleteilen unterschieden(wie das genau funktioniert kann ich gern mal erklären, nur würde das länger dauern)

dann werden die Kantenpixel der Puzzleteile ermittelt, die Puzzleteile sind aufgrund des letzten Schrittes schwarz und der Hintergrund weiß, deshalb wird hier nach Pixeln gesucht, bei denen sich die Farbe ändert

im nächsten Schritt werden die Pixel zu Puzzleteilen zusammengefasst und die meisten fehlerhaften Randpixel verworfen
nun werden die Ecken der Puzzleteile ermittelt und für jede Kante charakteristische Eigenschaften, anhand derer die Kanten miteinander verglichen werden können
zum Schluss werden die Puzzleteile virtuell zusammengesetzt (bei diesem Schritt sind wir im Moment auch) und die nötigen Werte berechnet, die dann an den Roboter geschickt werden, der dann das Puzzle zusammenbaut (wenn alles funktioniert... O:) )

diesen Roboter haben wir allerdings größtenteils nicht selbst gebaut, sondern von ein Firma ausgeliehen, das war auch nötig, denn wir haben uns vorher eingehend mit diesem Thema auseinander gesetzt, Motorsteuerung usw. war testweise schon gebaut, allerdings haben wir dann eingesehen, dass mit unserem Wissen und vorallem Budget kein Roboter gebaut werden kann, der Puzzleteile auf weniger als einen Millimeter genau legen kann
wir sind dann durch viel Glück auf diese Firma gestoßen, die uns einen Roboterarm mit xyz-Bewegung ausgeliehen haben, an den wir nur noch die Kamera und eine Halte- und Drehvorrichtung für die Puzzleteile bauen müssen

man muss aber auch noch dazu sagen, dass wir uns nur in Mathe/Info angemeldet haben bei Jufo, wir behaupten also nicht, wir hätten das komplett selbst genaut O:)

NumberFive
19.12.2004, 16:21
Respeckt das ihr so weit seid. wenn das projekt veröffendlich hätte ich gerne den link auch wenn ihr nicht alles selbst gebaut habt.

Gruß

gunfire
16.01.2005, 11:59
@numberfive

du hast ganz am anfang des thread geschrieben:
"nur das ich das bild direckt im direcktX treiber abhole und so mit in der stream paralle anzeigen kann fast kein zeit verlust duch den stream"2

kannst du mir dazu nen tip geben? wie holt man das bild direkt im treiber ab? wie sieht das dann im graphen aus? ich schaffs bisher nur ne videosource mit nem render treiber zu verbinden und das in der picturebox darzustellen, würde es aber auch gerne direkt machen da ich 4 kameras ansteuern will

NumberFive
17.01.2005, 06:14
hallo gunfire,

es gibt doch die moglich kein einige Grapper an DirectX zu übergeben.
das ist ein ComObjekt. Vorsicht dieses Comobjeckt läuft dann im treiber kontext. Also gilt nicht das sdk sonder das ddk.

hier ist ist der code derdas bild klaut:

STDMETHODIMP BufferCB( double SampleTime, BYTE * pBuffer, long BufferSize )
{

if(g_bWantBimap)
{

CBitmapData* pBitmapData = new CBitmapData;
if (!pBuffer)
return E_POINTER;

if( pBitmapData->lBufferSize < BufferSize)
{
if (pBitmapData->pBuffer)
{
delete [] pBitmapData->pBuffer;
}
pBitmapData->pBuffer = NULL;
pBitmapData->lBufferSize = 0;
}

// Since we can't access Windows API functions in this callback, just
// copy the bitmap data to a global structure for later reference.
pBitmapData->dblSampleTime = SampleTime;

// If we haven't yet allocated the data buffer, do it now.
// Just allocate what we need to store the new bitmap.
if (!pBitmapData->pBuffer)
{
pBitmapData->pBuffer = new BYTE[BufferSize];
pBitmapData->lBufferSize = BufferSize;
}

if( !pBitmapData->pBuffer )
{
pBitmapData->lBufferSize = 0;
return E_OUTOFMEMORY;
}

// Copy the bitmap data into our global buffer
memcpy(pBitmapData->pBuffer, pBuffer, BufferSize);

// Post a message to our application, telling it to come back
// and write the saved data to a bitmap file on the user's disk.
PostThreadMessage(m_pRoboControlThreadId, WM_CAPTURE_BITMAP, NULL, (long)pBitmapData);

g_bWantBimap = FALSE;

}
return S_OK;


guck dir doch mal den link bei projekt an vielleicht können wir was zu sammen machen

Gruß

gunfire
17.01.2005, 19:43
danke für deine antwort,
leider kann ich damit noch gar nichts anfangen das zu integrieren, muss wohl erstmal mehr grundlagen zu com lernen...
oder hast du zufällig ein kleines fertiges projekt oder sowas wo das integriert ist, dass man das mal anschauen kann, aus beispielen lernt man am besten.

NumberFive
17.01.2005, 21:18
ehrlich gesagt wie bist du dann so weit gekommen ?
DirectX ist doch alles Com ?

mit was programierst du ?


// NOTE that we try to render the interleaved pin before the video pin, because
// if BOTH exist, it's a DV filter and the only way to get the audio is to use
// the interleaved pin. Using the Video pin on a DV filter is only useful if
// you don't want the audio.

// Jetzt den Framegrapper auf bauen

if (!m_pGrabber)
{
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
}

CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );

CMediaType VideoType;
VideoType.SetType( &MEDIATYPE_Video );
VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 );
hr = m_pGrabber->SetMediaType( &VideoType ); // shouldn't fail

hr = pFg->AddFilter( pGrabBase, L"Grabber" );

// ende

if( fMPEG2 )
{


Das ist der Code der den Grapper lädt der nachher die Bilder Klaut.

Hast du das SDK von Microsoft da sind Beispiele drin

17.01.2005, 22:16
oh alles klar, ich dachte weil es im treiber kontext läuft ist da irgendwas anders, aber so ists klar denk ich,
ich hab halt erst vor 2 wochen mit windows angefangen, bin eigentlich unter linux zuhause... aber da ist halt sowas doof zu machen

NumberFive
17.01.2005, 22:33
das problem ist nur das diese funktion vom treiber auf gerufen wird.

das meine ich damit damit gilt in der Funktion nicht di programm ubgebung sondern die treiber umgebung.

in halb vom kernel oder drüber.

jetzt klar ?

gunfire
18.01.2005, 00:00
ich denk schon ja, muss morgen mal genauer anschauen, thx auf jedenfall mal

Sommer
06.03.2005, 12:09
Hi Leut´s,

hat da schon jemand weiter gemacht?
Hat jemand etwas Quellcode in VB6 um zu spielen, hätte gerade etwas lust dazu :-)

by Ulli

NumberFive
12.03.2005, 15:53
was heist den weiter gemacht ?

bei mir ist das bild holen und so fertig leider fehlt die Analyse *g*

12.03.2005, 16:01
ja bild holen tut bei mir jetzt auch, auch mit mehrern cams,
leider hab ich grosse probleme mit der Synchronisation der Callbackfunktionen, kennt sich da jmd aus? man startet ja den anderen Thread mit SetCallback, aber wie oft und wann der callback stattfindet kann man nicht festlegen oder? leider ist es so, dass der callback des ersten Graphen immer ca. doppelt so schnell ist wie der des 2... any ideas?

gunfire
12.03.2005, 16:02
der beitrag ist von mir

NumberFive
12.03.2005, 16:22
ich denke das die callback immer dann auf gerufen werden wenn ein frame fertig gerendert ist. wie kommst du auf das es die häfte währe ?
was willst snycronisieren ?

gunfire
12.03.2005, 17:08
ich will von 2 cameras immer gleichzeitig ein frame. bsp. 5 pro sekunde, die aber synchron.
das mit der hälfte ist geschätzt, ich hab testweise 2 callbacks gemacht (für jede cam eine,) und die jeweils 1 sek laufenlassen. in dem callback wird ein counter hochgezählt, der erste ist bei ca. 25 der zweite bei 12.
es wär halt cool wenn man den callback selber aufrufen könnte oder halt steuern könnte wann und wie oft, mit frames hat es wohl nix zu tun, 25fps hab ich nicht, nur 15 krieg aber 25 callbacks.

NumberFive
12.03.2005, 19:55
Hallo Gunfire,

arbeitest du mit SetCallback ?

http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/isamplegrabberinterface.asp

dann ist klar warum es so unterschiedlich ist.
den die callback blockieren sich gegen seitig.

du hast recht in ein live stream kann man die häufigkeit nicht steuern
in der der Grapper auf gerufen wird.

Hast du mal probier wenn du ein PostMessage in die BufferCB machst ?

wie oft möchtest du den ein bild bzw wie viel schafst du in der Sek ?
setz dir doch einfach mal eine bool variable und nur wenn die Ture ist
postest du dir ein nachricht so wie in meinen beispiel oben.

gruß

gunfire
12.03.2005, 20:02
ja das mit der variablen hab ich schon gemacht, dann bekomm ich wenigstens von jeder camera gleichviel, allerdings halt zeitlich versetzt.

"die callback blockieren sich gegen seitig.": heisst das die können nie gleichzeitig aufgerufen werden? Auch wenn ich 2 Callbacks habe, also 2 Klassen mit verschiedenen BufferCB?
das mit der Postmessage ist mir nicht ganz klar wo ich die Antwort zurückbekomme. Wo muss ich die abfangen?

NumberFive
12.03.2005, 20:08
mit welchem c++ programmierst du ?

der zeit versatz ist gut denn du wirst eh nie gleistig beide bilder verarbeiten können.

wenn du die bilder dann michen willst dann kannst du das immer noch tun
wenn du sie runter gerechnet hast.

gunfire
12.03.2005, 20:13
visual c++,
nein der zeitversatz ist nicht gut, weil aus den bildern eine 180° Ansicht erstellt werden soll,
wenn die also nicht gleich würde dieses fertige bild dann recht komisch aussehen.

NumberFive
12.03.2005, 20:20
von microsoft ? mit MFC oder WTL ? oder nur api ?

die PostMessage kommt in dem fenster an wo du sie hin schickst PostMessage(handle vom fenster,.....)

oder PostThreadMessage(Thread_ID,......)

dann kommt sie im thread an.

in der MFC und in der wtl gibt es ein block wo nachichten zu proceduren / funktionen die auf gerufen werden soll. die funktion hat immer zwei werte WPARAM und LPARAM.

hier ist ein mfc beispiel vielleicht hilft es beim verstehen
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel5.htm

so morgen abend wieder freundin ruft

Gruß

Crash32
23.03.2005, 09:26
Hi

Also ich habe mich auch schon sehr viel mit der digitalen Bildverarbeitung rumgeschlagen, und dazu folgendes Programm entwickelt.

Das Programm dient zum testen von Bildverarbeitungsalgorythmen, in einer schönen Umgebung.

Man Startet einfach das Programm, schreibt in einer "Scriptsprache" einfach ein paar Bildbearbeitungsalgorythmen nacheinander, jenachdem was man für ein Ergebniss haben will. Dann lädt man ein Bild, bzw. holt sich ein Bild von der Webcam, läßt die Algorythmen drüber laufen, und schaut sich das Ergebniss an.
Das ganze läuft bis jetzt schon ganz gut.
Und wenn man ein bißchen Ahnung von Programmieren und C++ hat, kann man auch eigene Bildbearbeitungsalgorythmen einbauen.


Ich hab mal ein paar Screenshots angehängt.
Wenn jemand interesse daran hätte, dann könnte ich das Programm gerne verschicken, und beim Einarbeiten helfen.

Der Sinn des Programms besteht darin, verschiedene Abfolgen von einzelnen Algorhythmen und deren Wirkungen auf unterschiedliche Bilder zu testen.

Mfg Reinhold Fischer


Anhängend: 2 Bilder des Programms

NumberFive
25.03.2005, 10:45
Hallo Crash32,

schöne ideen so was habe ich in meinem programm auch schon
drin. Leider kann ich nicht lesen welche algorythmen du schon hast.

Ich finde nicht nur das ergebnist zählt sonder auch die zeit wann es da ist
was nutz mir dein ergebnis was genial ist wenn die berechnug eine Stunde dauert.

Irgend wo in diesem Thread sind auch bilder die von mir erzeugt worden sind.

Wie holst du dir die bilder von der cam ? Video für windows oder directx ?
wie lange brauchst du für das Pferd ?

Wie ssieht das ergeniss auch wenn du ein kreis auf ein platt papier malst
und das vir die Cam hälst ?

Kannst du dann den kreis mittel punkt bestimmen ?

So könnte man die Ziel führung machen.

Gruß

26.03.2005, 12:49
Hi


Die Zeit wurde in diesem Programm absolut nicht beachtet, da der Zugriff auf die Bilder sehr speicherlastig ist.

Die Bilder hole ich mir über DirectX.

Wenn ich da einen Kreis mache, funktioniert es bei klaren kannten sehr gut.
Sonst muß man halt mehrere Verfahren drüberlaufen lassen.
Z.b eine Kantenerkennung, Segmentierung ( Region Growing ) usw.
um ein vernünftiges Ergebniss zu haben.


Mfg Reinhold Fischer

NumberFive
26.03.2005, 13:55
mir fehlt irgend wo der ansatz wie ich wenn der kreis da ist dann den mittel punkt zu bestimmen also zu erkennen per software das es ein kreis ist.

Du hast den source angeboten ich hätte interesse an dem MFC projekt.

Gruß

27.03.2005, 22:40
Das ist in meinem Code auch nicht drin, aber vielleicht hilft dir folgender Ansatz:

wenn du Kantenerkennung usw. hast drüberlaufenlassen, dann nimm dir eine Pixelmaske:
111
bsp:101
111


Mit dieser Maske läufst du jeden Pixel im Bild an.
Wenn jetzt der Pixel der in der Mitte ist kein Kantenpixel ist, dann überprüfst du, ob er auf einer Kante liegt. Zum Beispiel liegt er auf einer Kante, wenn links oben und rechts unten ein kantenpixel ist.
er ist kein Kantenpixel wnen z.b nur links unten und rechts unten Kantenpixel sind.

So bearbeitest du das ganze Bild. Der Sinn liegt darin, das Kanten, die durch Lücken in einer kante automatisch "geschlossen" werden.

Danach machst du mit jedem Kantenpixel auf dem Bild folgendes:

Wenn direkt neben dem Kantenpixel ein weiterer kantenpixel ist, dann gehst du zu diesem "Nachbarkantenpixel", dort überprüfst du das gleiche Nochmal, wobei du den Kantenpixel von dem du gekommen bist, nicht beachten darfst. Und das machst du solange bis die Kante entweder zuende ist ( kein Kantenpixel mehr vorhanden, außer der von dem man gekommen ist) oder du das Bild verläßt ( Kante geht über den Bildrand hinaus ) oder du eben zu deinem Ausgangspixel zurückkommst. In dem Fall hast du eine geschlossene kante entdeckt, die ein "Gebiet" auf dem Bild eingrenzt.



Nun gehst du mit jedem "Gebiet" folgendermaßen vor:


Untersuche die komplette Kante auf Ecken, wobei der Winkel der Ecken (90°==perfekte Ecke vom Viereck oder so; 40° z.b Ecke von Dreieck)
und die Auflösung in der du Untersuchst ausprobieren und anpassen mußt.
Denn um eine scharfe Ecke eines Dreiecks zu erkennen, mußt du relativ "nahe" an die Pixel, und mußt nur eine kleine Maske benutzen.
Um aber eine abgerundete Ecke eines Rechtecks zu erkennen, mußt du "weiter" raus.


Hört sich komisch an, aber ich denke so müßte das gehen.

Wenn du das alles gemacht hast, und keine Ecken in deinem "Rand" gefunden hast, dann ist es aller Wahrscheinlichkeit nach ein Kreis.


Nun zur Mittelpunkt bestimmung:

Da es ein Kreis ist, gibt es bei einem Bild immer 2 Kantenpixel, mit der gleichen y-Koordinate.

Ziehe eine "imaginäre" Linie von irgendeinem Kantenpixel zu seinem "gegenüber" ( der mit der gleich y-Koordinate ).
Jetzt machst du das gleiche mit der x-Koordinate und 2 Kantenpixeln.
Dabei suchst du die Linie raus, die jeweils in y-richtung und x-richtung den größten Abstand zwischen den beiden Kantenpixeln haben.
Und da wo sich diese beiden Linien treffen, ist der Mittelpunkt des Kreises bzw. der Ellipse.

Das ist nur so ein Ansatz der mir heut eingefallen ist, habe ihn nicht ausprobiert.

Schaut bitte nicht auf die Rechtschreibung, ist nicht so meine Stärke.


Mfg Reinhold Fischer

tcar
10.05.2005, 15:46
Zum Problem mit dem erkennen von Formen:

Also prinzipiell würde ich die Punkte umwandeln in linien (verbinde zwei punkte und prüfe, ob und wie viele punkti sich darauf befinden). Weiss zwar nich, wie das in vernünftiger zeit (rechenzeit) bewältigt werden soll. aber mal so hypothetisch. um zwei rechtwinklige linien ausfindig zu machen, wandle ich alle lienien in vektoren um und vergleiche immer zwei miteinander per skalarprodukt (falls 0 dann echtwinklig). weiter könnte mann noch prüfen, ob sich der schnittpunkt überhaupt im bild befindet, usw.

25.05.2005, 20:29
also ich will ja nicht sagen dass wisual basic blöd ist, aber ich kann mit meinem programm unter linux ein bild öffnen, kanten erkennen und zusammenhängende flächen erkennen... das alles in weit unter 1 sec...

pebisoft
29.05.2005, 10:43
hallo, ich fange mit visualbasic 5.0 an. ich möchte ein bild von der wintv-karte in die ablage legen (ca 2 bilder pro sec), das alte bild kann immer wieder überschrieben werden. dann möchte ich das/ein bild rausholen und auswerten und den robby über das easyfunkmodul steuern.
voraussetzung habe ich schon erstellt: videobild mit cmoscam s/w über funk zum pc. bild kann ich auch schon mit dem wintvprog2000 sehen. easy-funk zur steuerung des robby von einem visuellen steuerboard von visualbasic gehrt auch.
problem ist das bild in die ablage bringen und rausholen.
mfg pebisoft

NumberFive
31.05.2005, 22:04
Hallo pebisoft,

mit diesem Wort (WindowsAPI Befehl) "capCreateCaptureWindow" bei google suchen dann fidest du viele Beispiele habe leider kein VB sonder nur C++ und Delphi.

Mfg

04.06.2005, 21:03
moin
ihr habt alle probleme!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!

ich progge in c++ unter linux
bisher enthalten:
2x Kantenerkennung
Flächenerkennugn
Öffnen- und Speicherrutinen für ppm (P6 / P5) , HSV, capture devices
Weichzeichner
2x Differenzfilter (für Bewegungserkennung)
Betragsdiagramm (positionsunabhängige beschreibung von Objeckten)

in Arbeit:
Vecktor basierende Kantenbeschreibung für Objeckte
Rutinen für die bearbeitung von Stereo Bildern
...


ps: tipp an euch arbeitet doch mal gemeinsam an einem projeckt (cvs) in einer sprache

Trabukh
04.06.2005, 23:11
Du bist unser Held...
Anstatt uns zu zeigen, was deine Software kann, könntest du ja vllt konkrete Tipps bzw. Antworten zu den Fragen machen, die hier so auftauchen, z.B. "Wie bekomme ich das Bild am schnellsten / effizientesten aus der Kamera?"

Gruß, Trabukh

11.06.2005, 19:13
read => buffer => schleife => array

NumberFive
19.06.2005, 07:46
So kann man meinsch auch Mund tod machen.

aber wirklich was bringen tut das nicht. Schade das du nicht bereit bist zu helfen nach dem du ein Gott in der Grafic programmierung sein muß.

Mfg

v29a
19.06.2005, 11:50
also lieber gast, ohne quellcode (oder hilfen für andere) glaub zumindest ich dir mal garnix :P

edit: aber ein gemeisames projekt wär glaub ich wirklich vorteilhaft ..

NumberFive
19.06.2005, 12:07
das mit den gemeisamen Projekten würde ich auch begrüssen nur spricht meine er fahrung dagegen. nach dem ich jetzt schon das fünfte Projekt für die eine "Standart" Roboter software gesehen habe. Und alle die die geschrieben haben das sie mit machen wollen nix mehr tun.

Mal abgeshen von Johannes natürlich. Ich will nicht sagen das unsere lösung die beste ist aber ich denke da würde sich noch viel drauss machen lassen.

Oh ich schweife ab. Aber das mußte ich einfach mal schreiben.

@gast read array of farbe ist fertig die schleife ist auch da aber nicht ein vetor gib mal ansatz.

Mfg

zefram
19.06.2005, 19:57
Habt ihr euch eigentlich schonmal fertige Bibliotheken ala OpenCV oder LTIlib angesehen? (Habe ich das nicht schonmal gefragt ...)


read array of farbe ist fertig die schleife ist auch da aber nicht ein vetor gib mal ansatz.
Was meinst du in dem zusammenhang mit vector?

NumberFive
25.06.2005, 07:23
Was ich meine sind Linen (Vetoren)
die Man dann Scalieren kann um formen zu erkennen.

Also Bild -> Array Of Byte (Ohne Farbe/Grau Stufen) -> Kanten erkennung
-> Vetoren -> Form erkennung.

Das Problem ist das bei mir die Kannten erkunng ewig dauert und die Ergebnisse erlich gesagt sehr zu wünschen übrig lassen.

Ähnliches Thema:

https://www.roboternetz.de/phpBB2/viewtopic.php?p=92261#92261

Und es muß hier auch noch ein Thread geben wo ich mal Bilder gepostet habe nur leider finde ich den gerade nicht