我想在图像中围绕一个人制作一个边界框。我尝试了不同的方法,但我无法得到我想要的解决方案。
这是我正在使用的图像:
这是我到目前为止编写的代码:
bw = im2bw(test, graythresh(test));
bw2 = imfill(bw,'holes');
imshow(bw2);
figure;
L = bwlabel(bw2);
imshow(label2rgb(L, @jet, [.7 .7 .7]))
figure;
imshow(I1);
R = regionprops(L, 'BoundingBox');
rectangle('Position', R(1).BoundingBox);
答案 0 :(得分:3)
你的问题实际上并没有绘制边界框 - 它将人物定位在图像中,而你还没有完全正确地完成。如果您没有正确执行此操作,那么您将无法在该人周围放置正确的边界框。这就是我在图像中定位人物,然后在这个人周围绘制一个边界框的过程。这假设您的图片存储在im
:
regionprops
调用,提取BoundingBox
和Area
属性。BoundingBox
最大的Area
。BoundingBox
并在我们的图片上绘制。因此:
%// Step #1
im_thresh = im < 65;
%// Step #2
im_thresh2 = imclearborder(im_thresh);
%// Step #3
rp = regionprops(im_thresh2, 'BoundingBox', 'Area');
%// Step #4
area = [rp.Area].';
[~,ind] = max(area);
bb = rp(ind).BoundingBox;
%// Step #5
imshow(im);
rectangle('Position', bb, 'EdgeColor', 'red');
这就是我们得到的:
请记住,这并不完美。您可能需要使用阈值来获得更准确的边界框,但这应该足以让您开始。
祝你好运!答案 1 :(得分:2)
您还可以在计算机视觉系统工具箱中使用vision.PeopleDetector
:
im = imread('bnJzI.png');
detector = vision.PeopleDetector('ClassificationModel', 'UprightPeople_96x48', 'ClassificationThreshold', 2.5);
bbox = step(detector, im);
im2 = insertObjectAnnotation(im, 'rectangle', bbox, 'person');
imshow(im2);