Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //CHASE
- /*
- ______ ____ _____ _ _ _____ _____ _____
- | ____/ __ \| __ \ | \ | | /\ | __ \_ _| __ \
- | |__ | | | | |__) | | \| | / \ | | | || | | |__) |
- | __|| | | | _ / | . ` | / /\ \ | | | || | | _ /
- | | | |__| | | \ \ | |\ |/ ____ \| |__| || |_| | \ \
- |_| \____/|_| \_\ |_| \_/_/ \_\_____/_____|_| \_\
- With love.
- Thibaut
- */
- #include <opencv2/imgproc/imgproc.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/video/tracking.hpp>
- #include <opencv2/objdetect/objdetect.hpp>
- #include <opencv2/calib3d/calib3d.hpp>
- #include <opencv2/legacy/legacy.hpp>
- #include <opencv2/legacy/compat.hpp>
- #include <time.h>
- #include <stdio.h>
- /*
- Librairies à linker:
- opencv_core2410.lib
- opencv_highgui2410.lib
- opencv_imgproc2410.lib
- opencv_video2410.lib
- opencv_objdetect2410.lib
- opencv_legacy2410.lib
- */
- #define SELECTION_NO 0
- #define SELECTION_START 1
- #define SELECTION_CALCUL 2
- #define SELECTION_READY 3
- #define HISTORIQUE_SIZE 10
- CvRect selectionRect = cvRect(0, 0, 0, 0);
- int selectionFSM = 0;
- //Click de souris sur la fenêtre
- void onMouseClick(int event, int x, int y, int, void *) {
- switch(event) {
- case CV_EVENT_LBUTTONDOWN:
- if((selectionFSM == SELECTION_NO) || (selectionFSM == SELECTION_READY)) {
- selectionRect.x = x;
- selectionRect.y = y;
- selectionRect.width = 0;
- selectionRect.height = 0;
- selectionFSM = SELECTION_START;
- }
- else {
- selectionFSM = SELECTION_CALCUL;
- }
- break;
- case CV_EVENT_MOUSEMOVE:
- if(selectionFSM) {
- selectionRect.width = x - selectionRect.x;
- selectionRect.height = y - selectionRect.y;
- if(selectionRect.width < 0) {
- selectionRect.x += selectionRect.width;
- selectionRect.width = -selectionRect.width;
- }
- if(selectionRect.height < 0) {
- selectionRect.y += selectionRect.height;
- selectionRect.height = -selectionRect.height;
- }
- }
- break;
- }
- }
- //Point d'entrée du programme
- int main(int, char*[]) {
- //Instance de caméra
- //CvCapture *cameraCapture = cvCreateCameraCapture(CV_CAP_ANY);
- //OU capture depuis un .AVI
- CvCapture *cameraCapture = cvCaptureFromAVI("/Users/thibaut/workspace/OpenCV/openCVproject/chase.avi");
- int paused = -1;
- int s_min = 81;
- int s_max = 177;
- int v_min = 55;
- int v_max = 109;
- CvBox2D trackBox;
- CvConnectedComp trackComp;
- //Images
- IplImage *camera_frame = cvQueryFrame(cameraCapture);
- IplImage *hsv_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 3);
- //Fenêtres
- cvNamedWindow("Camera", CV_WINDOW_AUTOSIZE);
- cvNamedWindow("Hue", CV_WINDOW_AUTOSIZE);
- cvNamedWindow("CamZoom", CV_WINDOW_AUTOSIZE);
- //cvCreateTrackbar("ThresholdMin", "Threshold", &h_min, 255, NULL);
- //cvCreateTrackbar("ThresholdMAx", "Threshold", &h_max, 255, NULL);
- //Clic pour FSM
- cvSetMouseCallback("Camera", onMouseClick, 0);
- //Nombre de bandes dans l'histogramme
- int histDims = 16;
- //Bornes de l'histogramme
- float histRanges_array[] = {0, 180};
- float *histRanges = histRanges_array;
- //Création de l'histogramme
- CvHistogram *hist = cvCreateHist(1, &histDims, CV_HIST_ARRAY, &histRanges, 1);
- //Affichage du FPS à l'écran
- char text[255];
- CvFont font;
- cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, 1, 1, 0, 1);
- time_t timeStart = 0, timeNow = 0;
- int frameCounter = 0;
- time(&timeStart);
- //Boucle de traitements
- while (true) {
- time(&timeNow);
- //Récupère l'image de la caméra
- if((paused < 0) || (paused > 0)) {
- camera_frame = cvQueryFrame(cameraCapture);
- paused--;
- }
- //Créé la carte des teintes, des saturations et des luminances
- IplImage *camZoom = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 3);
- IplImage *H_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- IplImage *S_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- IplImage *V_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- IplImage *SandV_frame = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- IplImage *H_frame_backProject = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- //IplImage *binaryHue = cvCreateImage(cvGetSize(camera_frame), IPL_DEPTH_8U, 1);
- cvCopy(camera_frame, camZoom);
- //Sépare les plans
- cvCvtColor(camera_frame, hsv_frame, CV_RGB2HSV); // Couleur RGB => HSV
- cvSplit( hsv_frame, H_frame, S_frame, V_frame, 0);
- //Création du masque de backprojection (zones d'intérêt
- cvInRangeS(S_frame, cvScalar(s_min), cvScalar(s_max), S_frame);
- cvInRangeS(V_frame, cvScalar(v_min), cvScalar(v_max), V_frame);
- cvAnd(S_frame, V_frame, SandV_frame);
- // SandV_frame = S_frame & V_frame;
- //cvThreshold(H_frame, binaryHue, 50, 255, CV_THRESH_BINARY_INV);
- //Calcul le masque de backprojection
- if(selectionFSM == SELECTION_CALCUL) {
- //Focus sur la zone sélectionnée
- cvSetImageROI(H_frame, selectionRect);
- cvSetImageROI(SandV_frame, selectionRect);
- //Calcul de l'histogramme
- cvCalcHist(&H_frame, hist, 0, SandV_frame );
- //Normalisation des valeurs
- float max_val = 0;
- cvGetMinMaxHistValue(hist, 0, &max_val, 0, 0 );
- cvConvertScale(hist->bins, hist->bins, (max_val)?(255. / max_val):(0.), 0);
- //Désélection de la zone
- cvResetImageROI(H_frame);
- cvResetImageROI(SandV_frame);
- //Algo prêt
- selectionFSM = SELECTION_READY;
- }
- //Algorithme du Camshift
- if(selectionFSM == SELECTION_READY) {
- //Calcul de backprojection
- cvCalcBackProject(&H_frame, H_frame_backProject, hist);
- //Application du masque sur le résultat de la backprojection
- cvAnd(H_frame_backProject, SandV_frame, H_frame_backProject);
- //Seuillage du résultat masqué de la backprojection
- cvThreshold(H_frame_backProject, H_frame_backProject, 40, 255, CV_THRESH_BINARY);
- //Algorithme du cam shift pour trouver l'objet à suivre
- //int criteria = (CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1);
- cvCamShift(H_frame_backProject, selectionRect, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &trackComp, &trackBox);
- cvEllipseBox( camera_frame, trackBox, CV_RGB(255,0,0), 3, CV_AA, 0 );
- cvSetImageROI(camZoom, cvRect(trackBox.center.x, trackBox.center.y, 600, 600));
- //Correction d'angle (bug ?)
- //…
- //Lissage par IIR récursif
- //…
- //Découpage de l'image recadrée
- //…
- //Dessins des zones de traitements (brut et lissé)
- //…
- }
- //Dessin de la sélection
- if(selectionFSM == SELECTION_START)
- cvRectangle(camera_frame, cvPoint(selectionRect.x, selectionRect.y), cvPoint(selectionRect.x + selectionRect.width, selectionRect.y + selectionRect.height), CV_RGB(0, 130, 229), 3);
- //Affichage de l'image originale et des FPS
- //sprintf(text, "%.2f FPS", (double)(++frameCounter) / (double)(difftime(timeNow, timeStart)));
- //cvPutText(camera_frame, text, cvPoint(20, 30), &font, cvScalar(255, 255, 0));
- cvShowImage("Camera", camera_frame);
- cvShowImage("Hue", H_frame);
- //sprintf(text, "hmin %3d hmax %3d ", h_min, h_max );
- //cvPutText(V_frame, text, cvPoint(20, 30), &font, cvScalar(255, 255, 0));
- cvShowImage("CamZoom", camZoom);
- //Affichage des autres images
- //Image suivante ou arrêt
- int key = cvWaitKey(1);
- if(key == 'q' || key == 'Q')
- break;
- else if((key == 'f') || (key == 'F') || (cvGetCaptureProperty(cameraCapture, CV_CAP_PROP_POS_AVI_RATIO) > 0.99))
- cvSetCaptureProperty(cameraCapture, CV_CAP_PROP_POS_FRAMES, 0);
- else if(key == ' ') {
- if(paused < 0) paused = 0;
- else paused = -1;
- }
- else if(key == 13)
- paused = 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement