How to Add OpenCV and CvBlob Libraries to Eclipse
Start Eclipse.
Go to File->New->C++ Project
Choose a name. For example i named my project "umuttugrahan"Â
Press finish.
Then you can see your project at "Project Explorer"
Right click to your project file. New->Folder
We gotta name our folder "src". Don't forget it
Right click to "src" folder. Then create source file. I named my source file "umuttugrahan.cpp"
Now we're in our source file.
Let's start to add cvblob library.
Go Project->Properties
In C/C++ Build choose "Settings". And then choose "Includes" from GCC C++ Compiler.
Now, we're gonna add include paths
1-/usr/local/include
2-/usr/local/include/opencv
Go GCC C++ Linker
We must add library path and libraries.
Our library path /usr/local/lib
Now, adding libraries
We gotta write this libraries to libraries part
opencv_core
opencv_imgproc
opencv_highgui
opencv_ml
opencv_video
opencv_features2d
opencv_calib3d
opencv_objdetect
opencv_contrib
opencv_legacy
opencv_flann
cvblob
Now we are done.
Come back to source file. In this post "umuttugrahan.cpp"
#include<iostream>
#include<iomanip>
#if (defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__) || (defined(__APPLE__) & defined(__MACH__)))
#include<cv.h>
#include<highgui.h>
#else
#include<opencv/cv.h>
#include<opencv/highgui.h>
#endif
#include<cvblob.h>
using namespace cvb;
int main()
{
CvTracks tracks;
cvNamedWindow("red_object_tracking", CV_WINDOW_AUTOSIZE);
CvCapture *capture = cvCaptureFromCAM(0);
cvGrabFrame(capture);
IplImage *img = cvRetrieveFrame(capture);
CvSize imgSize = cvGetSize(img);
IplImage *frame = cvCreateImage(imgSize, img->depth, img->nChannels);
IplConvKernel* morphKernel = cvCreateStructuringElementEx(5, 5, 1, 1, CV_SHAPE_RECT, NULL);
//unsigned int frameNumber = 0;
unsigned int blobNumber = 0;
bool quit = false;
while (!quit&&cvGrabFrame(capture))
{
IplImage *img = cvRetrieveFrame(capture);
cvConvertScale(img, frame, 1, 0);
IplImage *segmentated = cvCreateImage(imgSize, 8, 1);
// Detecting red pixels:
// (This is very slow, use direct access better...)
for (int j=0; j<imgSize.height; j++)
for (int i=0; i<imgSize.width; i++)
{
CvScalar c = cvGet2D(frame, j, i);
double b = ((double)c.val[0])/255.;
double g = ((double)c.val[1])/255.;
double r = ((double)c.val[2])/255.;
unsigned char f = 255*((r>0.2+g)&&(r>0.2+b));
cvSet2D(segmentated, j, i, CV_RGB(f, f, f));
}
cvMorphologyEx(segmentated, segmentated, NULL, morphKernel, CV_MOP_OPEN, 1);
//cvShowImage("segmentated", segmentated);
IplImage *labelImg = cvCreateImage(cvGetSize(frame), IPL_DEPTH_LABEL, 1);
CvBlobs blobs;
unsignedint result = cvLabel(segmentated, labelImg, blobs);
cvFilterByArea(blobs, 250, 1000000);
cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_BOUNDING_BOX);
cvUpdateTracks(blobs, tracks, 200., 5);
cvRenderTracks(tracks, frame, frame, CV_TRACK_RENDER_ID|CV_TRACK_RENDER_BOUNDING_BOX);
cvShowImage("red_object_tracking", frame);
/*std::stringstream filename;
filename << "redobject_" << std::setw(5) << std::setfill('0') << frameNumber << ".png";
cvSaveImage(filename.str().c_str(), frame);*/
cvReleaseImage(&labelImg);
cvReleaseImage(&segmentated);
char k = cvWaitKey(10)&0xff;
switch (k)
{
case 27:
case'q':
case'Q':
quit = true;
break;
case's':
case'S':
for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it)
{
std::stringstream filename;
filename << "redobject_blob_" << std::setw(5) << std::setfill('0') << blobNumber << ".png";
cvSaveImageBlob(filename.str().c_str(), img, it->second);
blobNumber++;
std::cout << filename.str() << " saved!" << std::endl;
}
break;
}
cvReleaseBlobs(blobs);
//frameNumber++;
}
cvReleaseStructuringElement(&morphKernel);
cvReleaseImage(&frame);
cvDestroyWindow("red_object_tracking");
return 0;
}
Build and Run this code. This is so great example for blob tracking using cvblob library.






