首页 文章

确定在MATLAB中捕获对象的最小边界框

提问于
浏览
2

我有背景减去图像作为输入 . 该想法是通过使用较小的HOG算法搜索区域来减少用于人物检测的搜索区域 . 所需的输出是围绕人的边界框和框角的像素位置 .

这是输入图像:

input image

这是必需的输出:

required output

这是我到目前为止所尝试的:

x=imread('frame 0080.png');   
y=im2bw(x);
s=regionprops(y);    

imshow(y);    
hold on

for i=1:numel(s)  
   rectangle('Position',s(i).BoundingBox,'edgecolor','y')
end

这是我得到的输出:

actual output

1 回答

  • 3

    看起来你已经尝试了我的建议 . 但是,您需要封装整个对象的边界框 . 这可以通过使用 BoundingBox 属性,然后计算每个矩形的四个角中的每一个来轻松完成 . 然后,您可以计算封装最终封装整个对象的所有矩形的最小跨越边界框 .

    我注意到图像底部有一个薄的白色条带,这会弄乱边界框的计算 . 因此,在我们继续计算最小跨越边界框之前,我将剪切图像的最后10行 . 要计算最小跨越边界框,您所要做的就是获取所有矩形的所有角点,然后计算最小和最大坐标以及最小和最大坐标 y 坐标 . 这些将对应于最小跨越边界框的左上角和最小跨越边界框的右下角 .

    使用 regionprops 查看 BoundingBox 属性时,每个边界框输出一个4元素向量:

    [x y w h]
    

    x,y 表示边界框的左上角坐标 . x 将是列, y 将是左上角的行 . w,h 表示边界框的宽度和高度 . 我们将使用它并计算检测到的每个矩形的左上角,右上角,左下角和右下角 . 完成此操作后,将所有这些矩形坐标堆叠成单个2D矩阵,然后计算最小和最大 xy 坐标 . 要计算矩形,只需使用最小 xy 坐标作为左上角,然后分别通过减去最大和最小 xy 坐标来计算宽度和高度 .

    不用多说,这是代码 . 请注意,我想在 N x 4 矩阵中提取所有边界框坐标,其中 N 表示检测到的边界框的数量 . 您必须使用reshape才能正确执行此操作:

    % //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');
    

    这是我得到的图像:

    enter image description here

相关问题