Skip to content

OpenCV: Edge Detection

This is a simple example of how pass edge detection in a video using OpenCV. It uses the built-in OpenCV Canny edge detector algorithm.

#include 
#include 
#include 

int main(int argc, char *argv[]) {
    int delay = 0, key=0, i=0;
    char *window_name;
    CvCapture *video = NULL;
    IplImage  *frame = NULL;
    IplImage  *grey  = NULL;
    IplImage  *edges = NULL;

    /* check for video file passed by command line */
    if (argc>1) {
        video = cvCaptureFromFile(argv[1]);
    } else {
        printf("Usage: %s VIDEO_FILE\n", argv[0]);
        return 1;
    }

    /* check file was correctly opened */
    if (!video) {
        printf("Unable to open \"%s\"\n", argv[1]);
        return 1;
    }

    /* create a video window with same name of the video file, auto sized */
    window_name = argv[1];
    cvNamedWindow(window_name, CV_WINDOW_AUTOSIZE);

    /* Get the first frame and create a edges image with the same size */
    frame = cvQueryFrame(video);
    grey  = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
    edges = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);

    /* calculate the delay between each frame and display video's FPS */
    printf("%2.2f FPS\n", cvGetCaptureProperty(video, CV_CAP_PROP_FPS));
    delay = (int) (1000/cvGetCaptureProperty(video, CV_CAP_PROP_FPS));

    while (frame) {
	/* Edges on the input gray image (needs to be grayscale) using the Canny algorithm.
           Uses two threshold and a aperture parameter for Sobel operator. */
        cvCvtColor(frame, grey, CV_BGR2GRAY);
        cvCanny( grey, edges, 1.0, 1.0, 3);

	/* show loaded frame */
        cvShowImage(window_name, edges);
	
	/* load and check next frame*/
        frame = cvQueryFrame(video);
	if(!frame) {
		printf("error loading frame.\n");
		return 1;
	}

	/* wait delay and check for the quit key */
        key = cvWaitKey(delay);
        if(key=='q') break;
    }
}

To compile it in a well configured OpenCV development environment:

gcc edgeplayer.c -o edgeplayer `pkg-config opencv –libs –cflags`

To run it call edgeplayer and the name of the video:

./edgeplayer rick.avi

The result is something similar to this:

rick roll edge

Published inenglish

6 Comments

  1. Mathias Mathias

    Hi,

    From trial and error I found that using the following settings worked best for me:

    Low-threshold: 100
    High-threshold: 200
    Aperture: 5

    Is there an easy way to calculate these values automatically. Maybe frames with less white and more longer lines have the better values, but testing all the values and checking each frame one by one (even automatically) would take a long time.

    Your thoughts?

  2. zola zola

    I put the code in my Visual studio and added the openCV input links. there is no error in the debugging but i cannot run the program, it just run and blinks out.
    what is the things about at the end of ur post:
    gcc edgeplayer.c -o edgeplayer `pkg-config opencv –libs –cflags`

    could u help me on this.

    Thank you very much

  3. zola zola

    I put the code in my Visual studio and added the openCV input links. there is no error in the debugging but i cannot run the program, it just run and blinks out.
    what is the things about at the end of ur post:
    gcc edgeplayer.c -o edgeplayer `pkg-config opencv –libs –cflags`

    could u help me on this.

    Thank you very much

  4. Ravikiran Khandre Ravikiran Khandre

    Sir, Plz send me code of canny edge detection of image in opencv without using inbuilt canny function.

  5. Vijayalakshmi S Vijayalakshmi S

    Sir, can you please guide me to do my project on opencv and my topic is “Tracking Ellipse in video using Hough Transform “—- Thanks in Advance.

Leave a Reply

Your email address will not be published. Required fields are marked *