Ask Your Question
0

Cascade classifier doesn't detect object

asked 2016-11-24 06:20:30 -0600

Tobyy gravatar image

updated 2016-11-24 06:25:41 -0600

Hello everyone, i've trained a Cascade classifier with opencv_traincascade.exe. In the 0-Stage it says HR 1 FA 0. But whren i use it to detect an object it doesn't detect it. I use C++ and OpenCV 3.1. The image size is 100x100px. Even if i use one of the positive images that i used for training it doesnt detect any object. Do you have any ideas what my problem could be?

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

// Function Headers
void detectAndDisplay(Mat frame);

// Global variables
// Copy this file from opencv/data/haarscascades to target folder
string face_cascade_name = "C:\\CreateSamples\\classifier\\cascade.xml";
CascadeClassifier face_cascade;
string window_name = "Capture - Face detection";
int filenumber; // Number of file to be saved
string filename;

// Function main
int main(void)
{
    // Load the cascade
    if (!face_cascade.load(face_cascade_name)) {
        printf("--(!)Error loading\n");
        return (-1);
    }

    // Read the image file
    Mat frame = imread("C:\\CreateSamples\\rawdata\\img02.bmp");


    // Apply the classifier to the frame
    if (!frame.empty()) {
        detectAndDisplay(frame);
    }
    else {
        printf(" --(!) No captured frame -- Break!");
        //break;
    }

    int c = waitKey(10000000000);

    if (27 == char(c)) {
        //break;
    }

    return 0;
}

// Function detectAndDisplay
void detectAndDisplay(Mat frame)
{
    std::vector<Rect> faces;
    Mat frame_gray;
    Mat crop;
    Mat res;
    Mat gray;
    string text;
    stringstream sstm;

    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);

    // Detect faces
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 1.1, 0 | CASCADE_SCALE_IMAGE, Size(1, 1));

    // Set Region of Interest
    cv::Rect roi_b;
    cv::Rect roi_c;

    size_t ic = 0; // ic is index of current element
    int ac = 0; // ac is area of current element

    size_t ib = 0; // ib is index of biggest element
    int ab = 0; // ab is area of biggest element

    for (ic = 0; ic < faces.size(); ic++) // Iterate through all current elements (detected faces)

    {
        roi_c.x = faces[ic].x;
        roi_c.y = faces[ic].y;
        roi_c.width = (faces[ic].width);
        roi_c.height = (faces[ic].height);

        ac = roi_c.width * roi_c.height; // Get the area of current element (detected face)

        roi_b.x = faces[ib].x;
        roi_b.y = faces[ib].y;
        roi_b.width = (faces[ib].width);
        roi_b.height = (faces[ib].height);

        ab = roi_b.width * roi_b.height; // Get the area of biggest element, at beginning it is same as "current" element

        if (ac > ab)
        {
            ib = ic;
            roi_b.x = faces[ib].x;
            roi_b.y = faces[ib].y;
            roi_b.width = (faces[ib].width);
            roi_b.height = (faces[ib].height);
        }

        crop = frame(roi_b);
        resize(crop, res, Size(128, 128), 0, 0, INTER_LINEAR); // This will be needed later while saving images
        cvtColor(crop, gray, CV_BGR2GRAY); // Convert cropped image to Grayscale

                                           // Form a filename
        filename = "";
        stringstream ssfn;
        ssfn << filenumber << ".png";
        filename = ssfn.str();
        filenumber++;
        filename = "C:\\CreateSamples\\rawdata\\img02detec.bmp";
        imwrite(filename, gray);

        Point pt1(faces[ic].x, faces[ic].y); // Display detected faces on main window - live stream from camera
        Point pt2((faces[ic].x + faces[ic].height), (faces[ic].y + faces[ic].width));
        rectangle(frame, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0);
    }

    // Show image
    sstm ...
(more)
edit retag flag offensive close merge delete

Comments

Okay, whren i use images wich are lager than than 100x100px it dectects an object everywhere in the image not just in the position of the object. I dont understand why.

Tobyy gravatar imageTobyy ( 2016-11-24 07:05:11 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
0

answered 2017-03-06 02:39:46 -0600

Crazor gravatar image

Something is wrong either with your training data (samples/negatives) or with your training procedure. HR 1/FA 0 in the first stage means that the classifier locates the object with 100% accuracy after running only a single stage, with zero false alarms on negative images. With correct training, you will get HR 1/FA 1, with FA slowly decreasing with number of selected features. If FA drops below the margin you specified (default 0.5), the next stage is trained. This takes anywhere between minutes or hours to days, depending on the kind of classifier (Haar/LBP), number of sample images/negatives and number of stages to train.

This is a good tutorial to get started: http://coding-robin.de/2013/07/22/tra...

edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2016-11-24 06:20:30 -0600

Seen: 520 times

Last updated: Nov 24 '16