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
Druckbare Version
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
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ß
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...
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.
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
Hi,
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.Zitat:
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.
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
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/loadfra...orial003.shtml
Gruß, Trabukh
EDIT: Den Anfang kann man getrost überspringen, ab "Pointer" wird interessant...
Der Artikel hier ist noch besser: http://www.activevb.de/tipps/vb6tipps/tipp0255.html
Zitat:
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/loadfra...orial003.shtml
link will nich
Gruß, Trabukh
EDIT: Den Anfang kann man getrost überspringen, ab "Pointer" wird interessant...
also de rlink will nicht...sorry verklikt
habs gefunden ;-)
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).Zitat:
Zitat von zefram
Ich möcht so was erreichen wie ein beschreibung der form so das ich sieh in verschiedene großen wieder erkennen kann.Zitat:
Zitat von Johannes
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
Hallo,
Das ist natuerlich nicht mehr ganz so einfach. Stichwoerter: Fourier-Koeffizienten, Momente.Zitat:
Ich möcht so was erreichen wie ein beschreibung der form so das ich sieh in verschiedene großen wieder erkennen kann.
Besonders schwer ist eben, dass die Merkmale sich nicht aendern sollen, wenn das gesuchte Objekt groesser oder kleiner oder gedreht im Bild erscheint.
Soweit ich mich erinnere, dient der Canny-Operator nur zur Kantenerkennung.Zitat:
Eigndlich so weit wie ich das verstanden habe macht das auch der
canny so aber leider dauert das zu lange.
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.Zitat:
4 Ecken -> OK
vier seiten gleich lang -> OK
ziel gefunden daruf los fahren
PS: Sorry fuer die fehlenden Umlaute :-$
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
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.
Bild hier
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!
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ß
Ich habe eine total normale USBWebcam.
Es funktioniert super.
Die gibt es billig bei Ebay.
Was will man mehr ?
MFG
Rasmus
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
Welche Webcam willst du dir kaufen?
MFG
Rasmus
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ß
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
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?
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?
Mit folgendem Code(VB) geht es super:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=1933
MfG
Rasmus
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
Im Prinzip hast du Recht, aber ich wäre nicht sicher, ob Delphi wesentlich besser ist als VB.
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
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.
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
Das ist doch mal ein interessantes Projekt. Geht das soweit, dass das Programm alle Teile selbst zusammenpuzzelt?Zitat:
Zitat von Pascal
Kannst du einige genauere Informationen geben, welche Verfahren und Algorithmen ihr anwendet oder ist das noch top secret, wegen Jufo?
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
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:)
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ß
@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
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:
guck dir doch mal den link bei projekt an vielleicht können wir was zu sammen machenCode: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;
Gruß
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.
ehrlich gesagt wie bist du dann so weit gekommen ?
DirectX ist doch alles Com ?
mit was programierst du ?
Das ist der Code der den Grapper lädt der nachher die Bilder Klaut.Code:// 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 )
{
Hast du das SDK von Microsoft da sind Beispiele drin
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
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 ?
ich denk schon ja, muss morgen mal genauer anschauen, thx auf jedenfall mal