Water's Home

Just another Life Style

0%

Tracking Specific Color / Tracking Object

Tracking Specific Color

    // Define the range of "blue" color in HSV colorspace
    Scalar lowerLimit = Scalar(60,100,100);
    Scalar upperLimit = Scalar(180,255,255);
    
    // Threshold the HSV image to get only blue color
    inRange(hsvImage, lowerLimit, upperLimit, mask);
    
    // Compute bitwise-AND of input image and mask
    bitwise\_and(frame, frame, outputImage, mask=mask);
    
    // Run median filter on the output to smoothen it
    medianBlur(outputImage, outputImage, 5);

Tracking Object

    if(trackingFlag)
    {
        // Check for all the values in 'hsvimage' that are within the specified range
        // and put the result in 'mask'
        inRange(hsvImage, Scalar(0, minSaturation, minValue), Scalar(180, 256, maxValue), mask);
        
        // Mix the specified channels
        int channels\[\] = {0, 0};
        hueImage.create(hsvImage.size(), hsvImage.depth());
        mixChannels(&hsvImage, 1, &hueImage, 1, channels, 1);
        
        if(trackingFlag < 0)
        {
            // Create images based on selected regions of interest
            Mat roi(hueImage, selectedRect), maskroi(mask, selectedRect);
            
            // Compute the histogram and normalize it
            calcHist(&roi, 1, 0, maskroi, hist, 1, &histSize, &histRanges);
            normalize(hist, hist, 0, 255, CV\_MINMAX);
            
            trackingRect = selectedRect;
            trackingFlag = 1;
        }
        
        // Compute the histogram back projection
        calcBackProject(&hueImage, 1, 0, hist, backproj, &histRanges);
        backproj &= mask;
        RotatedRect rotatedTrackingRect = CamShift(backproj, trackingRect, TermCriteria(CV\_TERMCRIT\_EPS  CV\_TERMCRIT\_ITER, 10, 1));
        
        // Check if the area of trackingRect is too small
        if(trackingRect.area() <= 1)
        {
            // Use an offset value to make sure the trackingRect has a minimum size
            int cols = backproj.cols, rows = backproj.rows;
            int offset = MIN(rows, cols) + 1;
            trackingRect = Rect(trackingRect.x - offset, trackingRect.y - offset, trackingRect.x + offset, trackingRect.y + offset) & Rect(0, 0, cols, rows);
        }
        
        // Draw the ellipse on top of the image
        ellipse(image, rotatedTrackingRect, Scalar(0,255,0), 3, CV\_AA);
    }