hough circle transform error

asked 2016-04-26 06:55:06 -0500

Dasein gravatar image

updated 2016-04-26 07:27:42 -0500

Hello guys , I am trying to do hough circle transform in order to find pupil in eyeROI.But It doesnt work ..Do you have any idea about how to fix this problem ? Here is the code :

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace std;
using namespace cv;

/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";
String window_name2 = "right eye";
String window_name3 = "left eye";



Rect shrinkRect(Rect rect, int width_percent, int height_percent)
{
    if (width_percent > 100) width_percent = 100;
    if (height_percent > 100) height_percent = 100;

    Rect newrect;
    newrect.width = (rect.width * width_percent) / 100;
    newrect.height = (rect.height * height_percent) / 100;
    newrect.x = rect.x + (rect.width - newrect.width) / 2;
    newrect.y = rect.y + (rect.height - newrect.height) / 2;

    return newrect;
}

Rect expandRect(Rect rect, int width_percent, int height_percent)
{
    // not tested strongly
    Rect newrect;
    newrect.width = rect.width + ((rect.width * width_percent) / 100);
    newrect.height = rect.height + ((rect.height * height_percent) / 100);
    newrect.x = rect.x + (rect.width - newrect.width) / 2;
    newrect.y = rect.y + (rect.height - newrect.height) / 2;

    return newrect;
}

void updateEyeRects(vector<Rect> eyes, Rect& leftEyeRect, Rect& rightEyeRect)
{
    if (eyes.size() < 2) return;
    Rect intersection = eyes[0] & eyes[1];
    if (intersection.width > 1) return;

    if (eyes[0].x < eyes[1].x)
    {
        leftEyeRect = eyes[0];
        rightEyeRect = eyes[1];
    }
    else
    {
        leftEyeRect = eyes[1];
        rightEyeRect = eyes[0];
    }
}

std::vector<Rect> detectEyes(Mat frame, Rect faceRect)
{
    std::vector<Rect> faces;
    if (faceRect.width > 0)
    {
        faces.push_back(faceRect);
    }

    std::vector<Rect> eyes;
    Mat frame_gray;

    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);

    //-- Detect faces
    if (faces.size() == 0)
    {
        equalizeHist(frame_gray, frame_gray);
        face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0, Size(80, 80));
    }

    for (size_t i = 0; i < faces.size(); i++)
    {
        faces[i].height -= faces[i].height / 2;
        faces[i].y += faces[i].height / 3;
        Mat faceROI = frame_gray(faces[i]);
        equalizeHist(faceROI, faceROI);
        //-- In each face, detect eyes
        eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

        for (size_t j = 0; j < eyes.size(); j++)
        {
            eyes[j].x += faces[i].x;
            eyes[j].y += faces[i].y;
        }
    }
    return eyes;
}






int main(int argc, char** argv)
{
    VideoCapture capture;
    Mat frame;

    //-- 1. Load the cascade
    if (!face_cascade.load(face_cascade_name))
    {
        printf("--(!)Error loading face cascade\n");
        return -1;
    };
    if (!eyes_cascade.load(eyes_cascade_name))
    {
        printf("--(!)Error loading eyes cascade\n");
        return -1;
    };

    // Read the video stream or open the web cam
    if (argc > 1)
        capture.open(argv[1]);
    else
        capture.open(0);

    if (!capture.isOpened())
    {
        printf("--(!)Error opening video capture\n");
        return -1;
    }
    Mat left_frame, right_frame;
    Rect leftEyeRect;
    Rect rightEyeRect;
    vector<Rect> eyes;
    int fail_count = 0;

    while (capture.read(frame))
    {
        double t = (double)getTickCount();
        if (frame.empty())
        {
            printf(" --(!) No captured frame -- Break!");
            break;
        }

        if ((eyes.size() < 2) & !(leftEyeRect.width & rightEyeRect.width))
        {
            putText(frame, "Searching for an eye pair..", Point(20, 20), 0, 0.6, Scalar(0, 255, 0));
            eyes = detectEyes(frame, Rect());
            updateEyeRects(eyes, leftEyeRect, rightEyeRect);
        }
        else
        {
            Rect eyesRect(leftEyeRect | rightEyeRect);
            eyesRect = expandRect(eyesRect, 30, 300);
            eyesRect = eyesRect & Rect(0, 0, frame.cols, frame ...
(more)
edit retag flag offensive close merge delete

Comments

1

Your parameters are way off and need to be fine tuned. You cant just put numbers in, you must understand what each parameter does so you can fine tune HoughCirlces. Instead of me typing for 30 mins....read this. http://answers.opencv.org/question/91...

jmbapps gravatar imagejmbapps ( 2016-04-26 08:57:29 -0500 )edit