Determine the minimum bounding box to capture an object in MATLAB

后端 未结 1 1434
暖寄归人
暖寄归人 2020-12-18 15:23

I have background subtracted images as input. The idea is to reduce search areas for person detection by using a smaller search area for the HOG algorithm. The output requ

相关标签:
1条回答
  • 2020-12-18 15:58

    It looks like you have tried what I have suggested. However, you want the bounding box that encapsulates the entire object. This can easily be done by using the BoundingBox property, then calculating each of the four corners of each rectangle. You can then calculate the minimum spanning bounding box that encapsulates all of the rectangles which ultimately encapsulates the entire object.

    I do notice that there is a thin white strip at the bottom of your image, and that will mess up the bounding box calculations. As such, I'm going to cut the last 10 rows of the image before we proceed calculating the minimum spanning bounding box. To calculate the minimum spanning bounding box, all you have to do is take all of the corners for all of the rectangles, then calculate the minimum and maximum x co-ordinates and minimum and maximum y co-ordinates. These will correspond to the top left of the minimum spanning bounding box and the bottom right of the minimum spanning bounding box.

    When taking a look at the BoundingBox property using regionprops, each bounding box outputs a 4 element vector:

    [x y w h]
    

    x,y denote the top left co-ordinate of your bounding box. x would be the column and y would be the row of the top left corner. w,h denote the width and the height of the bounding box. We would use this and compute top left, top right, bottom left and bottom right of every rectangle that is detected. Once you complete this, stack all of these rectangle co-ordinates into a single 2D matrix, then calculate the minimum and maximum x and y co-ordinates. To calculate the rectangle, simply use the minimum x and y co-ordinates as the top left corner, then calculate the width and height by subtracting the maximum and minimum x and y co-ordinates respectively.

    Without further ado, here's the code. Note that I want to extract all of the bounding box co-ordinates in a N x 4 matrix where N denotes the number of bounding boxes that are detected. You would have to use reshape to do this correctly:

    % //Read in the image from StackOverflow
    x=imread('http://i.stack.imgur.com/mRWId.png');
    
    % //Threshold and remove last 10 rows
    y=im2bw(x);
    y = y(1:end-10,:);
    
    % //Calculate all bounding boxes
    s=regionprops(y, 'BoundingBox');
    
    %// Obtain all of the bounding box co-ordinates
    bboxCoords = reshape([s.BoundingBox], 4, []).';
    
    % // Calculate top left corner
    topLeftCoords = bboxCoords(:,1:2);
    
    % // Calculate top right corner
    topRightCoords = [topLeftCoords(:,1) + bboxCoords(:,3) topLeftCoords(:,2)];
    
    % // Calculate bottom left corner
    bottomLeftCoords = [topLeftCoords(:,1) topLeftCoords(:,2) + bboxCoords(:,4)];
    
    % // Calculate bottom right corner
    bottomRightCoords = [topLeftCoords(:,1) + bboxCoords(:,3) ...
        topLeftCoords(:,2) + bboxCoords(:,4)];
    
    % // Calculating the minimum and maximum X and Y values
    finalCoords = [topLeftCoords; topRightCoords; bottomLeftCoords; bottomRightCoords];
    minX = min(finalCoords(:,1));
    maxX = max(finalCoords(:,1));
    minY = min(finalCoords(:,2));
    maxY = max(finalCoords(:,2));
    
    % Draw the rectangle on the screen
    width = (maxX - minX + 1);
    height = (maxY - minY + 1);
    rect = [minX minY width height];
    
    % // Show the image
    imshow(y);
    hold on;
    rectangle('Position', rect, 'EdgeColor', 'yellow');
    

    This is the image I get:

    enter image description here

    0 讨论(0)
提交回复
热议问题