using namespace std;
using namespace cv;
#define CASCADE_FILE_PATH"/mnt/stopsign_classifier.xml"
void detectAndDraw(Mat& img, CascadeClassifier& cascade)
{
double t = 0;
Mat gray;
vectorstopsigns;
const static Scalar colors[] =
{
Scalar(255,0,0),
Scalar(255,128,0),
Scalar(255,255,0),
Scalar(0,255,0),
Scalar(0,128,255),
Scalar(0,255,255),
Scalar(0,0,255),
Scalar(255,0,255)
};
cvtColor(img, gray, COLOR_BGR2GRAY);
equalizeHist(gray, gray);
t = (double)getTickCount();
cascade.detectMultiScale(gray, stopsigns, 1.1, 10) ;
t = (double)getTickCount() - t;
printf("detect results: time = %g ms stopsignsNum = %d
", t*1000/getTickFrequency(), stopsigns.size());
for (size_t i = 0; i < stopsigns.size(); i++)
{
Rect r = stopsigns[i];
Point center;
Scalar color = colors[i%8];
rectangle(img, cvPoint(cvRound(r.x), cvRound(r.y)),
cvPoint(cvRound(r.x + r.width-1), cvRound(r.y + r.height-1)),
color, 2);
}
imshow("result", img);/* remove if run in arm-linux */
//imwrite("/mnt/dvr_handle.jpg", img);
}
int main(int argc, const char** argv)
{
Mat image;
CascadeClassifier cascade;
if(argc != 2)
{
printf("USAGE:
./stopdetect IMAGE
");
return -1;
}
if(!cascade.load(CASCADE_FILE_PATH))
{
printf("ERROR: Could not load classifier cascade !
");
return -1;
}
image = imread(argv[1], 1);
if(image.empty())
{
printf("Could not read %s
", argv[1]);
return -1;
}
printf("Detecting STOP sign in %s
", argv[1]);
detectAndDraw(image, cascade);
waitKey(0); /* remove if run in arm-linux */
return 0;
}