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 <highgui.h>
#include <stdio.h>
#include <cv.h>
 
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

5 thoughts on “OpenCV: Edge Detection

  1. 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. 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. 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

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>