Pages - Menu

Wednesday, February 10, 2010

OpenCV + cvblobslib Demo program

Here is a Sample application to display an image.

Download the Project folder and the source code.




//______________________________________________________________________________________
// OpenCV Blobs detection program
// Author: Bharath Prabhuswamy
//______________________________________________________________________________________
//______________________________________________________________________________________
#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#include "BlobResult.h"

int main()
{
    CvCapture *capture = 0;
    IplImage  *img = 0;
 IplImage  *gray_img = 0;
 IplImage  *thres_img = 0;
    IplImage  *blobs_img = 0;
 int key = 0;
 
    /* Initialize the webcam */
    capture = cvCaptureFromCAM( 0 );
 
    /* Always check if the program can find a device */
    if ( !capture ) 
        return -1;
 
 CBlobResult blobs;
 CBlob *currentBlob;

 int frame_count= 0;
 int i;
 
    /* create a window for the video */
 //cvNamedWindow( "Webcam",CV_WINDOW_AUTOSIZE);
 cvNamedWindow( "Blobs",CV_WINDOW_AUTOSIZE);
 
 /* Create required images once */
 if( frame_count == 0 )
    {
        /* Obtain a frame from the device */
        img = cvQueryFrame( capture );

  /* Always check if the device returns a frame */
  if( !img ) 
   return -1;

  gray_img  = cvCreateImage( cvGetSize(img), img->depth, 1);
  thres_img = cvCreateImage( cvGetSize(img), img->depth, 1);
  blobs_img = cvCreateImage( cvGetSize(img), img->depth, 3);
 }
 
    while((char) key != 27 )
    {
        /* Obtain a frame from the device */
        img = cvQueryFrame( capture );

  /* Always check if the device returns a frame */
  if( !img ) 
   return -1;
  
  frame_count = frame_count + 1;
  
  /* Flip image once, after blob processing it is flipped back */
  cvFlip(img,img,NULL);

  /* Convert image from Color to grayscale and then to binary (thresholded at 200) */
  cvCvtColor(img,gray_img,CV_RGB2GRAY);
  cvThreshold(gray_img,thres_img,200,255,CV_THRESH_BINARY);
  
  /* Find Blobs that are White, Hence 'uchar backgroundColor = 0' (Black) */
  blobs = CBlobResult(thres_img, NULL,0);

  /* Remove blobs if it does not cover minimum area specified below */
  blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(),B_LESS,5,50);

  /* Number of blobs */
  int j = blobs.GetNumBlobs();
  printf("%d\n",j);
  
  /* Color the blobs one after the other */
  for (i = 0; i < blobs.GetNumBlobs(); i++ )
  {
   currentBlob = blobs.GetBlob(i);
   currentBlob->FillBlob( blobs_img, CV_RGB(255,0,0));
  }

  //cvShowImage( "Webcam",gray_img);
  cvShowImage( "Blobs",blobs_img); 
  
  /* Clear image for next iteration */
  cvZero(blobs_img);
  
  /* Quit execution if 'ESC' key is pressed */
  key = cvWaitKey(1);
 }

 /* Clean up memory */
    //cvDestroyWindow( "Webcam" );
 cvDestroyWindow( "Blobs" );
    cvReleaseCapture( &capture );
    return 0;
}

1 comment:

  1. THanks for sharing, but this link doesn't work. Can you solve this issue?

    ReplyDelete