Advertisement
thibthibaut

OPENCVCHASE

Dec 9th, 2015
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.23 KB | None | 0 0
  1. //CHASE
  2. /*
  3.  ______ ____  _____    _   _          _____ _____ _____
  4.  |  ____/ __ \|  __ \  | \ | |   /\   |  __ \_   _|  __ \
  5.  | |__ | |  | | |__) | |  \| |  /  \  | |  | || | | |__) |
  6.  |  __|| |  | |  _  /  | . ` | / /\ \ | |  | || | |  _  /
  7.  | |   | |__| | | \ \  | |\  |/ ____ \| |__| || |_| | \ \
  8.  |_|    \____/|_|  \_\ |_| \_/_/    \_\_____/_____|_|  \_\
  9.  
  10.  With love.
  11.  Thibaut
  12.  */
  13.  
  14.  
  15. #include <opencv2/imgproc/imgproc.hpp>
  16. #include <opencv2/highgui/highgui.hpp>
  17. #include <opencv2/video/tracking.hpp>
  18. #include <opencv2/objdetect/objdetect.hpp>
  19. #include <opencv2/calib3d/calib3d.hpp>
  20. #include <opencv2/legacy/legacy.hpp>
  21. #include <opencv2/legacy/compat.hpp>
  22. #include <time.h>
  23. #include <stdio.h>
  24. /*
  25.  Librairies à linker:
  26.  opencv_core2410.lib
  27.  opencv_highgui2410.lib
  28.  opencv_imgproc2410.lib
  29.  opencv_video2410.lib
  30.  opencv_objdetect2410.lib
  31.  opencv_legacy2410.lib
  32.  */
  33.  
  34. #define SELECTION_NO        0
  35. #define SELECTION_START     1
  36. #define SELECTION_CALCUL    2
  37. #define SELECTION_READY     3
  38. #define HISTORIQUE_SIZE     10
  39.  
  40.  
  41. CvRect selectionRect = cvRect(0, 0, 0, 0);
  42.  
  43. int selectionFSM = 0;
  44.  
  45. //Click de souris sur la fenêtre
  46. void onMouseClick(int event, int x, int y, int, void *) {
  47.     switch(event) {
  48.         case CV_EVENT_LBUTTONDOWN:
  49.             if((selectionFSM == SELECTION_NO) || (selectionFSM == SELECTION_READY)) {
  50.                 selectionRect.x = x;
  51.                 selectionRect.y = y;
  52.                 selectionRect.width = 0;
  53.                 selectionRect.height = 0;
  54.                 selectionFSM = SELECTION_START;
  55.             }
  56.             else {
  57.                 selectionFSM = SELECTION_CALCUL;
  58.             }
  59.             break;
  60.         case CV_EVENT_MOUSEMOVE:
  61.             if(selectionFSM) {
  62.                 selectionRect.width  = x - selectionRect.x;
  63.                 selectionRect.height = y - selectionRect.y;
  64.                 if(selectionRect.width < 0) {
  65.                     selectionRect.x     += selectionRect.width;
  66.                     selectionRect.width  = -selectionRect.width;
  67.                 }
  68.                 if(selectionRect.height < 0) {
  69.                     selectionRect.y     += selectionRect.height;
  70.                     selectionRect.height = -selectionRect.height;
  71.                 }
  72.             }
  73.             break;
  74.     }
  75. }
  76.  
  77.  
  78. //Point d'entrée du programme
  79. int main(int, char*[]) {
  80.     //Instance de caméra
  81.     //CvCapture *cameraCapture = cvCreateCameraCapture(CV_CAP_ANY);
  82.     //OU capture depuis un .AVI
  83.     CvCapture *cameraCapture = cvCaptureFromAVI("/Users/thibaut/workspace/OpenCV/openCVproject/chase.avi");
  84.     int paused = -1;
  85.    
  86.     int s_min = 81;
  87.     int s_max = 177;
  88.    
  89.     int v_min = 55;
  90.     int v_max = 109;
  91.    
  92.     CvBox2D trackBox;
  93.     CvConnectedComp trackComp;
  94.    
  95.     //Images
  96.     IplImage *camera_frame         = cvQueryFrame(cameraCapture);
  97.     IplImage *hsv_frame            = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 3);
  98.    
  99.     //Fenêtres
  100.     cvNamedWindow("Camera", CV_WINDOW_AUTOSIZE);
  101.     cvNamedWindow("Hue", CV_WINDOW_AUTOSIZE);
  102.     cvNamedWindow("CamZoom", CV_WINDOW_AUTOSIZE);
  103.    
  104.     //cvCreateTrackbar("ThresholdMin", "Threshold", &h_min, 255, NULL);
  105.     //cvCreateTrackbar("ThresholdMAx", "Threshold", &h_max, 255, NULL);
  106.    
  107.    
  108.     //Clic pour FSM
  109.     cvSetMouseCallback("Camera", onMouseClick, 0);
  110.    
  111.     //Nombre de bandes dans l'histogramme
  112.     int histDims = 16;
  113.     //Bornes de l'histogramme
  114.     float histRanges_array[] = {0, 180};
  115.     float *histRanges = histRanges_array;
  116.     //Création de l'histogramme
  117.     CvHistogram *hist = cvCreateHist(1, &histDims, CV_HIST_ARRAY, &histRanges, 1);
  118.    
  119.     //Affichage du FPS à l'écran
  120.     char text[255];
  121.     CvFont font;
  122.     cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, 1, 1, 0, 1);
  123.     time_t timeStart = 0, timeNow = 0;
  124.     int frameCounter = 0;
  125.     time(&timeStart);
  126.    
  127.     //Boucle de traitements
  128.     while (true) {
  129.         time(&timeNow);
  130.        
  131.         //Récupère l'image de la caméra
  132.         if((paused < 0) || (paused > 0)) {
  133.             camera_frame = cvQueryFrame(cameraCapture);
  134.             paused--;
  135.         }
  136.        
  137.        
  138.        
  139.         //Créé la carte des teintes, des saturations et des luminances
  140.         IplImage *camZoom = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 3);
  141.         IplImage *H_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  142.         IplImage *S_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  143.         IplImage *V_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  144.         IplImage *SandV_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  145.         IplImage *H_frame_backProject = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  146.         //IplImage *binaryHue = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
  147.        
  148.        
  149.         cvCopy(camera_frame, camZoom);
  150.         //Sépare les plans
  151.        
  152.         cvCvtColor(camera_frame, hsv_frame, CV_RGB2HSV);    // Couleur RGB => HSV
  153.         cvSplit( hsv_frame, H_frame, S_frame, V_frame, 0);
  154.        
  155.        
  156.         //Création du masque de backprojection (zones d'intérêt
  157.        
  158.         cvInRangeS(S_frame, cvScalar(s_min), cvScalar(s_max), S_frame);
  159.         cvInRangeS(V_frame, cvScalar(v_min), cvScalar(v_max), V_frame);
  160.        
  161.         cvAnd(S_frame, V_frame, SandV_frame);
  162.        
  163.         // SandV_frame = S_frame & V_frame;
  164.        
  165.         //cvThreshold(H_frame, binaryHue, 50, 255, CV_THRESH_BINARY_INV);
  166.        
  167.        
  168.        
  169.         //Calcul le masque de backprojection
  170.         if(selectionFSM == SELECTION_CALCUL) {
  171.             //Focus sur la zone sélectionnée
  172.            
  173.             cvSetImageROI(H_frame, selectionRect);
  174.            
  175.             cvSetImageROI(SandV_frame, selectionRect);
  176.            
  177.            
  178.             //Calcul de l'histogramme
  179.            
  180.             cvCalcHist(&H_frame, hist, 0, SandV_frame );
  181.            
  182.             //Normalisation des valeurs
  183.             float max_val = 0;
  184.             cvGetMinMaxHistValue(hist, 0, &max_val, 0, 0 );
  185.             cvConvertScale(hist->bins, hist->bins, (max_val)?(255. / max_val):(0.), 0);
  186.            
  187.             //Désélection de la zone
  188.             cvResetImageROI(H_frame);
  189.             cvResetImageROI(SandV_frame);
  190.            
  191.             //Algo prêt
  192.             selectionFSM = SELECTION_READY;
  193.         }
  194.        
  195.        
  196.         //Algorithme du Camshift
  197.         if(selectionFSM == SELECTION_READY) {
  198.             //Calcul de backprojection
  199.            
  200.             cvCalcBackProject(&H_frame, H_frame_backProject, hist);
  201.            
  202.             //Application du masque sur le résultat de la backprojection
  203.             cvAnd(H_frame_backProject, SandV_frame, H_frame_backProject);
  204.            
  205.             //Seuillage du résultat masqué de la backprojection
  206.            
  207.             cvThreshold(H_frame_backProject, H_frame_backProject, 40, 255, CV_THRESH_BINARY);
  208.            
  209.             //Algorithme du cam shift pour trouver l'objet à suivre
  210.             //int criteria = (CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1);
  211.            
  212.            
  213.             cvCamShift(H_frame_backProject, selectionRect, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &trackComp, &trackBox);
  214.            
  215.             cvEllipseBox( camera_frame, trackBox, CV_RGB(255,0,0), 3, CV_AA, 0 );
  216.            
  217.             cvSetImageROI(camZoom, cvRect(trackBox.center.x, trackBox.center.y, 600, 600));
  218.            
  219.            
  220.            
  221.             //Correction d'angle (bug ?)
  222.             //…
  223.            
  224.             //Lissage par IIR récursif
  225.             //…
  226.            
  227.             //Découpage de l'image recadrée
  228.             //…
  229.            
  230.             //Dessins des zones de traitements (brut et lissé)
  231.             //…
  232.         }
  233.        
  234.         //Dessin de la sélection
  235.         if(selectionFSM == SELECTION_START)
  236.             cvRectangle(camera_frame, cvPoint(selectionRect.x, selectionRect.y), cvPoint(selectionRect.x + selectionRect.width, selectionRect.y + selectionRect.height), CV_RGB(0, 130, 229), 3);
  237.        
  238.         //Affichage de l'image originale et des FPS
  239.         //sprintf(text, "%.2f FPS", (double)(++frameCounter) / (double)(difftime(timeNow, timeStart)));
  240.         //cvPutText(camera_frame, text, cvPoint(20, 30), &font, cvScalar(255, 255, 0));
  241.        
  242.         cvShowImage("Camera", camera_frame);
  243.        
  244.         cvShowImage("Hue", H_frame);
  245.         //sprintf(text, "hmin %3d hmax %3d ", h_min, h_max  );
  246.         //cvPutText(V_frame, text, cvPoint(20, 30), &font, cvScalar(255, 255, 0));
  247.        
  248.         cvShowImage("CamZoom", camZoom);
  249.        
  250.        
  251.         //Affichage des autres images
  252.        
  253.         //Image suivante ou arrêt
  254.         int key = cvWaitKey(1);
  255.         if(key == 'q' || key == 'Q')
  256.             break;
  257.         else if((key == 'f') || (key == 'F') || (cvGetCaptureProperty(cameraCapture, CV_CAP_PROP_POS_AVI_RATIO) > 0.99))
  258.             cvSetCaptureProperty(cameraCapture, CV_CAP_PROP_POS_FRAMES, 0);
  259.         else if(key == ' ') {
  260.             if(paused < 0)  paused = 0;
  261.             else            paused = -1;
  262.         }
  263.         else if(key == 13)
  264.             paused = 1;
  265.     }
  266.     return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement