Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.79 KB | None | 0 0
  1. #include "tracker.h"
  2.  
  3. using namespace cv;
  4.  
  5. tracker::tracker() {
  6.     nTrajectories = 0;
  7.     frameNumber = 0;
  8. }
  9.  
  10. tracker::~tracker() {
  11.     delete [] trajectories;
  12. }
  13.  
  14. void tracker::initTracker(Mat* frame, CvRect* regions, int nRegions, int particlesPerObject) {
  15.     colorFeatures cf;
  16.     p_perObject = particlesPerObject;
  17.     nTrajectories = nRegions;
  18.     Mat* frameHSV = cf.bgr2hsv(frame);
  19.    
  20.     trajectories = (trajectory*) malloc(nRegions * sizeof(trajectory));
  21.     for (int i=0; i < nTrajectories; i++) {
  22.         particleFilter* pf = new particleFilter();
  23.         pf->initParticles(regions[i], particlesPerObject);
  24.         trajectories[i].object = pf;
  25.         trajectories[i].object->objectID = i;
  26.         trajectories[i].object->weight = 1;
  27.         trajectories[i].startFrame = 0;
  28.         trajectories[i].histo = computeHistogram(frameHSV, regions[i]);
  29.         trajectories[i].points = (CvPoint*) malloc(sizeof(CvPoint));
  30.         trajectories[i].points[frameNumber] = trajectories[i].object->getParticleCenter();
  31.     }
  32.    
  33.     frameNumber += 1;
  34. }
  35.  
  36. void tracker::mergeTrack() {
  37.     float d = 0;
  38.     float x, y, x1, y1;
  39.     for (int i=0; i < nTrajectories; i++) {
  40.         x = trajectories[i].object->particles[0].x;
  41.         y= trajectories[i].object->particles[0].y;
  42.         for (int j=0; j < nTrajectories; j++) {
  43.             x1 = trajectories[j].object->particles[0].x;
  44.             y1 = trajectories[j].object->particles[0].y;
  45.            
  46.             d = sqrtf((x1-x) * (x1-x) + (y1-y) * (y1-y));
  47.             if (d < 20) {
  48.                 if (trajectories[i].startFrame <= trajectories[j].startFrame) {
  49.                     trajectories[i].object->weight = 1;
  50.                     trajectories[j].object->weight -= 1;
  51.                 } else {
  52.                     trajectories[j].object->weight = 1;
  53.                     trajectories[i].object->weight -= 1;
  54.                 }
  55.             }
  56.         }
  57.     }
  58. }
  59.  
  60. void tracker::removeTrack(int n) {
  61.     for (int i=n; i < nTrajectories; i++) {
  62.         trajectories[i] = trajectories[i+1];
  63.     }
  64.     nTrajectories--;
  65. }
  66.  
  67. void tracker::next(Mat* frame) {
  68.     colorFeatures cf;
  69.     Mat* frameHSV = cf.bgr2hsv(frame);
  70.     int w = frame->cols;
  71.     int h = frame->rows;
  72.     for (int i=0; i < nTrajectories; i++) {
  73.         trajectories[i].object->transition(w, h);
  74.         trajectories[i].object->updateWeight(frameHSV, trajectories[i].histo);
  75.         trajectories[i].object->normalizeWeights();
  76.         trajectories[i].object->resample();
  77.         trajectories[i].points = (CvPoint*) realloc(trajectories[i].points, (frameNumber+1) * sizeof(CvPoint));
  78.         trajectories[i].points[frameNumber] = trajectories[i].object->getParticleCenter();
  79.     }
  80.    
  81.     mergeTrack();
  82.     frameHSV->release();
  83.     frameNumber += 1;
  84. }
  85.  
  86.  
  87.  
  88.  
  89. //void tracker::updateObjectWeights(Mat* frame, adaboostDetect* adaboost) {
  90. //    Mat* temp = 0;
  91. //    colorFeatures cf;
  92. //    for (int i=0; i < nTrajectories; i++) {
  93. //        int w = cvRound(trajectories[i].object->particles[0].width);
  94. //        int h = cvRound(trajectories[i].object->particles[0].height);
  95. //        int x = cvRound(trajectories[i].object->particles[0].x) - w/2;
  96. //        int y = cvRound(trajectories[i].object->particles[0].y) - h/2;
  97. //
  98. //        cvSetImageROI(frame, cvRect(x-5, y-5, w+10, h+10));
  99. //        temp = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, frame->nChannels);
  100. //        cvCopy(frame, temp, NULL);
  101. //        CvRect* rgs;
  102. //        if (adaboost->detectObject(temp, &rgs)) {
  103. //            if (trajectories[i].object->weight < 1) {
  104. //                trajectories[i].object->weight += 0.5;
  105. //            }
  106. //        } else {
  107. //            trajectories[i].object->weight -= 0.5;
  108. //            if (trajectories[i].object->weight < -4) {
  109. //                removeTrack(i);
  110. //            }
  111. //        }
  112. //
  113. //        cvReleaseImage(&temp);
  114. //        cvResetImageROI(frame);
  115. //    }
  116. //}
  117.  
  118. void tracker::addObjects(Mat* frame, CvRect* regions, int nRegions) {
  119.     if (nRegions < 1) {
  120.         return;
  121.     }
  122.    
  123.     colorFeatures cf;
  124.     Mat* frameHSV = cf.bgr2hsv(frame);
  125.     int dm = 0, tr = 0, rs = 0, nw = 0;
  126.     int trFound[200];
  127.     std::fill_n(trFound, nTrajectories, 0);
  128.     for (int i = nTrajectories; i < nTrajectories + nRegions; i++) {
  129.         int x = (float) regions[i-nTrajectories].x + regions[i-nTrajectories].width/2;
  130.         int y = (float) regions[i-nTrajectories].y + regions[i-nTrajectories].height/2;
  131.         for (int j = 0; j < nTrajectories; j++) {
  132.             int x1 = trajectories[j].object->particles[0].x;
  133.             int y1 = trajectories[j].object->particles[0].y;
  134.             int d = sqrtf((x1-x) * (x1-x) + (y1-y) * (y1-y));
  135.             if (j == 0) {
  136.                 dm = d;
  137.             }
  138.             if (d < dm) {
  139.                 tr = j;
  140.                 dm = d;
  141.             }
  142.         }
  143.        
  144.         if (dm < 20) {
  145.             trajectories[tr].object->resetParticles(regions[i-nTrajectories]);
  146.             frameHSV = cf.bgr2hsv(frame);
  147.             trajectories[tr].histo = computeHistogram(frameHSV, regions[i-nTrajectories]);
  148.             trajectories[tr].object->weight = 1;
  149.             trFound[tr] = 1;
  150.             rs++;
  151.         } else {
  152.             trajectories = (trajectory*) realloc (trajectories, (nTrajectories+nw+1) * sizeof(trajectory));
  153.             particleFilter* pf = new particleFilter;
  154.             pf->initParticles(regions[i-nTrajectories], p_perObject);
  155.             trajectories[nw+nTrajectories].startFrame = frameNumber;
  156.             trajectories[nw+nTrajectories].object = pf;
  157.             trajectories[nw+nTrajectories].object->objectID = nw+nTrajectories;
  158.             trajectories[nw+nTrajectories].object->weight = 0.5;
  159.             trajectories[nw+nTrajectories].histo = computeHistogram(frameHSV, regions[i-nTrajectories]);
  160.             trajectories[nw+nTrajectories].points = (CvPoint*) malloc(frameNumber * sizeof(CvPoint));
  161.             trajectories[nw+nTrajectories].points[frameNumber-1] = trajectories[nw+nTrajectories].object->getParticleCenter();
  162.             nw++;
  163.         }
  164.     }
  165.    
  166.     for (int j = 0; j < nTrajectories; j++) {
  167.         if (trFound[j] == 1) {
  168.             if (trajectories[j].object->weight < 1) {
  169.                 trajectories[j].object->weight += 0.5;
  170.             }
  171.         } else {
  172.             trajectories[j].object->weight -= 0.5;
  173.         }
  174.     }
  175.    
  176.     nTrajectories = nTrajectories + nw;
  177.     for (int i = 0; i < nTrajectories; i++) {
  178.         if (trajectories[i].object->weight < -3) {
  179.             removeTrack(i);
  180.         }
  181.     }
  182. }
  183.  
  184. void tracker::showResults(Mat* frame) {
  185.     for (int i=0; i < nTrajectories; i++) {
  186.         CvScalar color;
  187.         if (trajectories[i].object->weight > 0.5) {
  188.             color = CV_RGB((12*trajectories[i].object->objectID)%255,
  189.                            (24*trajectories[i].object->objectID)%255,
  190.                            (48*trajectories[i].object->objectID)%255);
  191.             trajectories[i].object->displayParticles(frame, CV_RGB(0, 0, 255), color, SHOW_SELECTED);
  192.             CvFont font;
  193.             cvInitFont(&font, CV_FONT_HERSHEY_PLAIN|CV_FONT_ITALIC, 1, 1, 0, 1);
  194.             char buffer [4];
  195.             sprintf (buffer, "%d",trajectories[i].object->objectID );
  196.             cvPutText(frame,buffer, cvPoint( cvRound(trajectories[i].object->particles[0].x)+5, cvRound(trajectories[i].object->particles[0].y)+5 ), &font, cvScalar(255,255,255));
  197.         }
  198.     }
  199. }
  200.  
  201. //IplImage* tracker::subtractObjects(IplImage* frame) {
  202. //    IplImage* tmp = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, frame->nChannels);
  203. //    cvCopy(frame, tmp);
  204. //    int w = frame->width;
  205. //    int h = frame->height;
  206. //    for (int i=0; i < nTrajectories; i++) {
  207. //        if (trajectories[i].object->weight < 0.5) {
  208. //            continue;
  209. //        }
  210. //        CvRect r = trajectories[i].object->getParticleRect();
  211. //        for (int k=r.y; k<r.y+r.height;k++) {
  212. //            for (int j=r.x; j<r.x+r.width;j++) {
  213. //                if ((k>=0)&&(k<h)&&(j>=0)&&(j<w)) {
  214. //                    ((uchar *)(tmp->imageData + k*tmp->widthStep))[j*tmp->nChannels + 0] = 0;
  215. //                    ((uchar *)(tmp->imageData + k*tmp->widthStep))[j*tmp->nChannels + 1] = 0;
  216. //                    ((uchar *)(tmp->imageData + k*tmp->widthStep))[j*tmp->nChannels + 2] = 0;
  217. //                }
  218. //            }
  219. //        }
  220. //    }
  221. //    return tmp;
  222. //}
  223.  
  224. histogram* tracker::computeHistogram(Mat* frame, CvRect region) {
  225.     colorFeatures cf;
  226. //    cvSetImageROI(frame, region);
  227.     Mat* tmp;
  228. //    *tmp = cv::Mat(cvGetSize(frame), CV_32FC3);
  229.     *tmp = (*frame)(region);
  230. //    cvCopy(frame, tmp, NULL);
  231. //    cvResetImageROI(frame);
  232.     histogram* hist = cf.comHistogramHSV(tmp, 1);
  233.     cf.normalizeHistogram(hist);
  234.     tmp->release();
  235.    
  236.     return hist;
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement