Hello,
I have been trying to experiment with opencv functions for object detection using cascade classification. However I have not been able to get it working correctly. I have taken a simple example of cupboard door handle, which I would like to detect in images. Please find the zip of my data as attached (link - link text). This contains negative files (55 files) and positive files (66 files). The commands which I have used for the experiment are as below (I am using Ubuntu 12.10 version, along with QT Creator and Opencv libraries (2.3))
find ./negatives -name '*.jpg' > negatives.dat
find ./positives -name '*.jpg' > positives.dat
perl createtrainsamples_my.pl positives.dat negatives.dat output (please note that I have modified the command within the perl script to use w as 10 and h as 70 (most of the positive images are apprxmt. with this ratio) (essentially the script uses the below command - opencv_traincascade -data traincascade -vec samples.vec -bg negatives.dat -numPos 66 -numNeg 55 -numStages 16 -featureType LBP -w 10 -h 70 -bt GAB -minHitRate 0.995 -maxFalseAlarmRate 0.3 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1)
find ./output -name '*.vec' > samples.dat
mergevec samples.dat samples.vec w 10 h 70 (this i did it from windows as there were errors on Ubuntu)
opencv_traincascade -data traincascade -vec samples.vec -bg negatives.dat -numPos 66 -numNeg 55 -numStages 16 -featureType LBP -w 10 -h 70 -bt GAB -minHitRate 0.995 -maxFalseAlarmRate 0.3 -weightTrimRate 0.95 -maxDepth 1 -maxWeakCount 100 -maxCatCount 256 -featSize 1
I have then renamed traincascade\cascade.xml to cascadetest2.xml in the source code as below
#include "windowclassifier.h" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp"
#include <iostream> #include <stdio.h>
WindowClassifier::WindowClassifier() { }
using namespace std; using namespace cv;
/** Function Headers */ void detectAndDisplay1( Mat frame );
/** Global variables */ String window_cascade_name = "cascadetest2.xml"; CascadeClassifier window_cascade; string window_name1 = "Capture - Window detection";
/* @function main */ int main( int argc, const char* argv ) { CvCapture* capture; //Mat frame(240,320, CV_8UC4); Mat frame; //-- 1. Load the cascades
if( !window_cascade.load(window_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; }; frame = imread("/tmp/test.jpg");
detectAndDisplay1( frame ); return 0; }
/* @function detectAndDisplay */ void detectAndDisplay1( Mat frame ) { std::vector<rect> faces; window_cascade.detectMultiScale( frame, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int i = 0; i < faces.size(); i++ ) { Point center( faces[i].x + faces[i].width0.5, faces[i].y + faces[i].height0.5 ); ellipse( frame, center, Size( faces[i].width0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
} //-- Show what you got
imshow( window_name1, frame ); waitKey(0);
}
I am also attaching the test data and results in this link - link text. If you see in the results, result test detected 2 handles instead of 1 and the location is offset. result test 1 did not detect anything. result test 2 detected 2 handles and the location is offset. Can someone please help?
Thanks in Advance..