2017-01-20 5 views
0

Je viens de commencer à travailler sur le suivi des pupilles. J'ai fait quelques seuillage pour l'élève mais toujours pas aussi précis que nécessaire. Ci-dessous mon image actuelle seuilléeSeuil pour pupille (suivi des yeux) - OpenCV avec C++

actuelle seuillée l'image

img

Je voudrais voir que de préférence l'élève dans le contour, mais malheureusement, je vois d'autres bruits aussi bien. Ci-dessous est mon code

int main(int argc, char** argv) 
{ 
    Mat src, src_gray, src_bw_glint, src_bw_iris, dst, dsti; 
    int threshold_value1 = 130; 
    int threshold_value2 = 30; 
    int const max_BINARY_value = 255; 
    VideoCapture cap(1); // open the default camera 
    if(!cap.isOpened()) // check if we succeeded 
     return -1; 
    Mat frame; 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    int p = 0; 

    for(;;) 
    { 

     cap >> src; // get a new frame from camera 

     /// Convert it to gray 
     cvtColor(src, src_gray, CV_BGR2GRAY); 

     Mat drawing = Mat::zeros(src_gray.size(), CV_8UC3); 

     /// Reduce the noise so we avoid false circle detection 
     GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2); 
     namedWindow(" Demo_Gray", CV_WINDOW_AUTOSIZE); 
     imshow(" Demo_Gray", src_gray); 

     //Threshold 
     threshold(src_gray, src_bw_iris, threshold_value2, max_BINARY_value, 1); 

     int morph_size = 5; 
     Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2*morph_size + 1, 2*morph_size+1), Point(morph_size,morph_size)); 
     cout<<element; 

     morphologyEx(src_bw_iris, dst, MORPH_DILATE, element,Point(-1,-1), 1); 
     //imshow("Open Image", dst); 
     morphologyEx(dst, dsti, MORPH_TOPHAT, element,Point(-1,-1), 10); 
     //imshow("TopHAt Image", dsti); 
     morphologyEx(dsti, dsti, MORPH_DILATE, element,Point(-1,-1), 1); 
     imshow("TopHAt Image", dsti); 

     findContours(dsti, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

     for(int i = 0; i< contours.size(); i++) 
     {    
      //Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
      Scalar color = Scalar(p, 255, p); 

      drawContours(drawing, contours,i, color, 2, 8, hierarchy, 0, Point()); 
      // circle(drawing, mc[i], 4, color1, -1, 8, 0);     
      imshow("Drawing", drawing);     
     } 

     if (waitKey(1) == 'q') { 
      break; 
     } 

    } 
    return 0; 
} 

J'aime connaître la meilleure approche de seuillage pour mon travail afin de suivre uniquement la pupille. Aussi, s'il vous plaît faites le moi savoir, si vous pensez, cela pourrait être fait beaucoup plus simple que ce que j'ai fait.

+0

essayer de trouver des propriétés de chaque objet et laisser seulement ceux qui sont les plus semblables à disque (par exemple 'rapport set_pixel_area/bounding_box_area' devrait être proche de' PI/4') – Spektre

+1

diminuer votre seuil. l'élève est beaucoup plus sombre que 130. alternativement: https://pdfs.semanticscholar.org/3260/30b941d44ffe6ec33f1b20b5897c4f198f7b.pdf – Piglet

+1

diminuer votre seuil, essayez d'utiliser _HoughCircles_ –

Répondre

0

Je ne pense pas que cela fonctionne le seuil va améliorer votre résultat.

Voici ce que je ferais:

  1. Sur votre résultat binaire, appliquez une ouverture avec un grand élément structurant circulaire. Tous les petits motifs seront effacés, seul le grand (plus ou moins) circulaire restera.
  2. Extraction d'indices de forme, principalement des indices de circularité (voir a list here).
  3. Le motif le plus circulaire sera la pupille.