Ваша проблема на самом деле не рисовать прямоугольник - это местонахождение человека внутри изображения, которое вы не совсем сделали правильно. Если вы не сделаете это правильно, вы не сможете разместить правильную ограничительную рамку вокруг человека. Это то, что я сделал, чтобы найти человека на изображении, а затем нарисовать ограничивающий прямоугольник вокруг этого человека. Это при условии, что изображение хранится в im
:
- Обратите внимание, что распределение интенсивности лица темнее, чем большая часть сцены. Таким образом, я собираюсь создать порог изображения, выбрав любые пиксели, меньшие, чем интенсивность 65, как белые, а другие - черные.
- очистить любые белые пиксели, которые окружают границу
- изображения я выполнить вызов
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');
Это то, что мы получаем:
Имейте в виду, что это не является совершенным. Возможно, вам придется поиграть с порогом, чтобы получить более точную ограничительную рамку, но этого должно быть достаточно для начала.
Удачи вам!
Ваша задача не рисовать рамку - это местонахождение человека внутри изображения. Если вы не сделаете это правильно, тогда вам не удастся правильно нарисовать эту ограничительную рамку. – rayryeng
Спасибо Rayryeng за ваше предложение. Есть ли способ сначала найти человека внутри? –
Не могли бы вы загрузить исходное изображение без красной рамки? – rayryeng