Nutzung von cvCanny in OpenCV

There was a time, when I shared a blog. This post was written by Stephan. See all blogpost from him or stalk him on github.


Mit der Funktion cvCanny von OpenCV lassen sich Kanten in einem Bild erfassen. Hier ein Beispiel, wie man ein Bild auf der Festplatte erfolgreich mit cvCanny erfasst. Wichtig ist, dass das geladene Bild in einem Kanal vorliegt, also "grayscaled" ist. Dies erreicht man durch folgenden Aufruf, bei dem der zweite Parameter der Funktion cvLoadImage auf 0 gesetzt wird (weitere Infos hier).

 IplImage* in = cvLoadImage(argv[1],0);

Dann erzeugt man ein neues Bild (Variable out), das die gleiche Dimensionen wie das Eingangsbild (Variable in) besitzt (und natürlich auch nur einen Kanal). Mehr zur Funktion cvCreateImage gibt es hier.

IplImage* out = cvCreateImage(
            cvGetSize(in),
            IPL_DEPTH_8U,
            1
            );

Anschließend muss nur noch die cvCanny-Funktion aufgerufen werden, mit den Parametern kann man anschließend etwas "herumspielen":

cvCanny(in, out, 0.3, 0.8);

//Bild darstellen
cvNamedWindow("Canny", CV_WINDOW_AUTOSIZE);
cvShowImage("Canny", out);

//ermöglicht, dass das Bild angezeigt wird, bis Taste gedrückt wird, da keine Schleife
cvWaitKey(0);

Enthält dein Eingangsbild mehrere Kanäle, wirst du beim Aufruf deines Programms folgende Fehlermeldung erhalten (kompilieren lässt es sich):

OpenCV ERROR: Unsupported format or combination of formats () in function cvCanny

Nachtrag:

Liest man Livebilder aus einer Kamera aus , benötigt man die Hilfe von cvCvtColor

//Kamera auslesen
CvCapture* capture;
capture = cvCreateCameraCapture(0); // 0 muss gegebenenfalls angepasst werden

//aktuelles Bild der Videokamera erhalten
IplImage* in = cvQueryFrame(capture);

//Graubild erzeugen
IplImage* out = cvCreateImage(
            cvGetSize(in),
            IPL_DEPTH_8U,
            1
            );

cvCvtColor(in, out, CV_BGR2GRAY);

//Graubild anzeigen
cvNamedWindow("Gray Image", CV_WINDOW_AUTOSIZE);
cvShowImage("Gray Image", out);

//ermöglicht, dass das Bild angezeigt wird, bis Taste gedrückt wird, da keine Schleife
cvWaitKey(0);