Point2f EyeTracker::detectPupil() { /* * Uses cvHoughCircles to find circles on gray eye image. * Sets prev_center with last circle. */ doHoughTransform(); /* Sets featurePoints */ noktadanAcil(); CvPoint2D32f p32[NPOINTS]; CvBox2D box; for(size_t i = 0; i < featurePoints.size(); ++i) { p32[i] = cvPoint2D32f( featurePoints[i].x, featurePoints[i].y ); } cvFitEllipse(p32, NPOINTS, &box); cvEllipse(grayEyeImagePts, cvPoint((int)box.center.x, (int)box.center.y), cvSize((int)(box.size.width/2), (int)(box.size.height/2)), box.angle, 0, 360, cvScalar(WHITE, 0, 0, 0), 3); cout << "x=" << (int)box.center.x << "-y=" << (int) box.center.y << endl; if(box.size.width < 1) { firstDetect = false; } else { /* Adds point to centerList, sets aver_center to average of centerList */ addToList(cvPoint( cvRound(box.center.x), cvRound(box.center.y) ) ); prev_center.x = (int)box.center.x; prev_center.y = (int)box.center.y; } return box.center; }
int fmaFitEllipse(void) { long lErrors = 0; CvPoint points[1000]; CvPoint2D32f fpoints[1000]; CvBox2D box; CvMemStorage* storage = cvCreateMemStorage(0); CvContour* contour; CvSize axis; IplImage* img = cvCreateImage( cvSize(200,200), IPL_DEPTH_8U, 1 ); for( int k = 0 ; k < 1000; k++ ) { iplSet( img, 0 ); CvPoint center = { 100, 100 }; double angle = atsInitRandom( 0, 360 ); axis.height = (int)atsInitRandom( 5, 50 ); axis.width = (int)atsInitRandom( 5, 50 ); cvEllipse( img, center, axis, angle, 0, 360, 255, -1 ); cvFindContours( img, storage, (CvSeq**)&contour, sizeof(CvContour) ); cvCvtSeqToArray( (CvSeq*)contour, points ); for( int i = 0; i < contour->total; i++ ) { fpoints[i].x = (float)points[i].x; fpoints[i].y = (float)points[i].y; } cvFitEllipse( fpoints, contour->total, &box ); //compare boxes if( fabs( box.center.x - center.x) > 1 || fabs( box.center.y - center.y ) > 1 ) { lErrors++; } if( ( fabs( box.size.width - (axis.width * 2 ) ) > 4 || fabs( box.size.height - (axis.height * 2) ) > 4 ) && ( fabs( box.size.height - (axis.width * 2 ) ) > 4 || fabs( box.size.width - (axis.height * 2) ) > 4 ) ) { lErrors++; //graphic /*IplImage* rgb = cvCreateImage( cvSize(200,200), IPL_DEPTH_8U, 3 ); iplSet( rgb, 0 ); cvEllipse( rgb, center, axis, angle, 0, 360, CV_RGB(255,0,0) , 1 ); int window = atsCreateWindow( "proba", cvPoint(0,0), cvSize(200,200) ); cvEllipse( rgb, center, cvSize( box.size.width/2, box.size.height/2) , -box.angle, 0, 360, CV_RGB(0,255,0) , 1 ); //draw center cvEllipse( rgb, center, cvSize( 0, 0) , 0, 0, 360, CV_RGB(255,255,255) , -1 ); atsDisplayImage( rgb, window, cvPoint(0,0), cvSize(200,200) ); getch(); atsDestroyWindow( window ); //one more cvFitEllipse( fpoints, contour->total, &box ); */ } } cvReleaseMemStorage( &storage ); if( !lErrors) return trsResult(TRS_OK, "No errors"); else return trsResult(TRS_FAIL, "Fixed %d errors", lErrors); }
int findStableMatches( CvSeq *seq, float minRad, float maxRad, CandidatePtrVector& kps, IplImage* bin ) { // Return value int retVal = -1; // Threshold Contour entries size int elements = seq->total; if( elements < 8 ) { return retVal; } // Gather statistics CvRect rect = cvBoundingRect( seq ); int high = ( rect.height < rect.width ? rect.width : rect.height ); int low = ( rect.height < rect.width ? rect.height : rect.width ); // If bounding box is very small simply return if( low < minRad*2 ) { return retVal; } // Allocate Contour array CvPoint *group_pos = (CvPoint*) malloc(elements * sizeof(CvPoint)); cvCvtSeqToArray(seq, group_pos, CV_WHOLE_SEQ); // Calculate arc and downsampling statistics double arc_length = cvArcLength( seq ); double arc_approx = arc_length / 10; double rect_approx = 12*(float)high / (float)low; double downsample = 2 * elements / (rect_approx + arc_approx); double ds_length = arc_length / 4; // Perform downsampling int maxSize = downsample * elements; int newSize = 0; CvPoint *dsed = (CvPoint*) malloc(maxSize * sizeof(CvPoint)); dsed[0] = CvPoint( group_pos[0] ); CvPoint last = CvPoint( dsed[0] ); newSize++; for( int i = 1; i < elements; i++ ) { double dist_so_far = dist_squared( group_pos[i], last ); if( dist_so_far > ds_length && newSize < maxSize ) { dsed[newSize] = CvPoint( group_pos[i] ); newSize++; last = CvPoint( group_pos[i] ); } } // Check to make sure reduced Contour size is sufficient [quickfix: todo revise above] if( newSize < 6 ) { free(group_pos); free(dsed); return -1; } // Fit Ellipse CvPoint2D32f* input = (CvPoint2D32f*)malloc(newSize*sizeof(CvPoint2D32f)); for( int i=0; i<newSize; i++ ) { input[i].x = dsed[i].x; input[i].y = dsed[i].y; } CvBox2D* box = (CvBox2D*)malloc(sizeof(CvBox2D)); cvFitEllipse( input, newSize, box ); // Threshold size float esize = PI*box->size.height*box->size.width/4.0f; if( esize < PI*maxRad*maxRad ) { // Add Candidate *kp = new Candidate; kp->angle = box->angle; kp->r = box->center.y; kp->c = box->center.x; kp->minor = box->size.width/2; kp->major = box->size.height/2; kp->magnitude = 0; kp->method = ADAPTIVE; kps.push_back( kp ); retVal = 0; } else { // Interest point too large retVal = 1; } // Deallocations free(box); free(input); free(group_pos); free(dsed); return retVal; }