Objekterkennung und anschl. Farbauswertung mit openCV
-
Hallo
ich möchte mit openCV eine Objekterkennung durchführen, und anschließend soll das Objekt auf Farbfehler untersucht werden.
Genauer gesagt habe ich eine Videokamera, und die Objekte sind drei Zylinder (Höhe ca. 1 cm), die aufeinander gestapelt sind. Drei verschiedenfarbige Typen gibt es.
Mit Hilfe welcher Funktionen kann ich diese Aufgabe durchführen?
Kann mir da jemand helfen?
-
Klar, ich würd dir gern helfen. Das geht aber leichter wenn du was mehr verrätst.
Wie weit bist du denn schon? Hast du die Zylinder schon segmentiert? Sind sie (wenn sie keine Fehler enthalten) einfarbig? Hast du es mit konstanter Beleuchtung zu tun und könntest sogar gegen fest einkonfigurierte Farbwerte vergleichen? Was für Farbfehler wären das? Hast du Beispielbilder?
Mit einer einzelnen Funktion wird das nicht gehen, sollte aber auch (zumindest wenn die Bedingungen ok sind und die Farbfehler nicht superminimal) nicht allzu aufwendig werden.
-
ich habe bisher nur bisschen mit anderen beispielen rumprogrammiert, zum beispiel habe canny-kantendetektor ausprobiert, template-matching ausprobiert.
segmentierung heißt doch, die gewünschten objekte im bild zu finden oder?
welche funktion kann das?
mit welcher funktion kann ich dann die farbwerte in dem gefundenen objekt überprüfen?
wie kann ich die position aus der segmentierung an die farbauswertung übergeben?wenn die zylinder ok sind, dann sind sie einfarbig, ja.
für konstante beleuchtung wird gesorgt.
ja im prinzip könnte ich schon mit festen farbwerten vergleichen (innerhalb eines bestimmten toleranzbereichs)
die farbfehler wären nicht allzu klein, beispielsweise auf einem roten zylinder ein schwarzer strich mit dem edding
foto hab ich leider grad keins zur hand.
-
http://www.fotos-hochladen.net/thumbnail/bsp4adrt78bq0_thumb.jpg
kleines beispiel schnell in paint gemalt.
links drei einzelne zylinder (farben: rot, aluminium, und blau)
rechts die drei zylinder aufeinander gestapelt, mit beispielfarbfehler.
-
Jo, Segmentieren heißt, dass die Umrisse vom Objekt im Bild kennst.
OpenCV kann das (eventuell mit entsprechender Vorverarbeitung) mit dieser Funktion:
http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours
Ein Tutorial dazu gibts auch: http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.htmlDie Farbwerte innerhalb deines Objekts kannst du auf Verschiedene Arten prüfen.
Mit einem Histogramm könntest du vielleicht feststellen, ob überhaupt Fehler da sind. Du könntest aber auch einfach über die Pixel iterieren und alles markieren, das einen gewissen Abstand (vielleicht in einem anderen Farbraum als RGB) zu deiner Referenzfarbe hat.
Wie das funktioniert (auch mit Masken, also zu übergebenden Sementierungen) müsste alles in den Tutorials und Beispielcodes, die man mit runterläd sein. Wenn du irgendwo speziell hängst, poste mal, was du bereits hast incl. Originalbilder, damit mans nachstellen kann.Die wirkliche Herausforderung bei sowas liegt nämlich eigentlich immer in der Tatsache, dass die echten Bilder nie so schön sind wie die abstrakt konstruierten Beispielbilder, die man zum Konzept-Entwickeln benutzt.
-
erst mal danke.
ich werde probieren das mit dem konturen finden durchzuführen.
gibts eine funktionen der ich einfach sage, suche innerhalb der konturen (die ich mit findcontours finde) falsche farbwerte / farbwerte ausserhalb der toleranz?
wie kann ich einer funktion so ein segment übergeben?wenn ich mehr hab, und weitere probleme, meld ich mich wieder.
-
Eine Kontur übergibst du immer mit einer mask. Das ist ein Bild in der gleichen Größe wie das Bild, auf das sich die Kontur beziehen soll, in dem alles ausserhalb der Kontur schwarz ist und alles innerhalb von ihr weiß (bzw != 0).
Ganz banal könntest du das finden des Fehlers probieren, indem du erstmal pixelweise die Differenz eines Bilds voll mit deiner Referenzfarbe zu deinem richtigen Bild bestimmst. cv::absdiff macht das alles für dich.
Dann kannst du mit cv::minMaxLoc gucken, wo der größte Unterschied liegt.
Wenns nicht so rauschanfällig sein soll, kannst du zwischendurch noch was weichzeichen (cv::blur).Guck einfach mal ein Bischen durch die Doku ( http://opencv.itseez.com/index.html ).
Und wie gesagt: Mit echten Beispielbildern (welche mit Fehler und welche ohne Fehler) könnte man mehr dazu sagen.
-
ok, danke erstmal.
wenn ich es soweit zum laufen krieg bin ich schon mal froh ^^