3

Я хочу создать ограничительную рамку вокруг человека на изображении. Я пробовал разные методы, но я не мог получить решение, которое я хочу.Нарисуйте прямоугольную рамку вокруг человека на изображении

Вот изображение Я использую:

enter image description here

Вот код, который я написал до сих пор:

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); 
+1

Ваша задача не рисовать рамку - это местонахождение человека внутри изображения. Если вы не сделаете это правильно, тогда вам не удастся правильно нарисовать эту ограничительную рамку. – rayryeng

+0

Спасибо Rayryeng за ваше предложение. Есть ли способ сначала найти человека внутри? –

+0

Не могли бы вы загрузить исходное изображение без красной рамки? – rayryeng

ответ

2

Ваша проблема на самом деле не рисовать прямоугольник - это местонахождение человека внутри изображения, которое вы не совсем сделали правильно. Если вы не сделаете это правильно, вы не сможете разместить правильную ограничительную рамку вокруг человека. Это то, что я сделал, чтобы найти человека на изображении, а затем нарисовать ограничивающий прямоугольник вокруг этого человека. Это при условии, что изображение хранится в im:

  1. Обратите внимание, что распределение интенсивности лица темнее, чем большая часть сцены. Таким образом, я собираюсь создать порог изображения, выбрав любые пиксели, меньшие, чем интенсивность 65, как белые, а другие - черные.
  2. очистить любые белые пиксели, которые окружают границу
  3. изображения я выполнить вызов regionprops добыванием BoundingBox и Area свойства.
  4. Я просматриваю все области и нахожу BoundingBox с самыми большими Area.
  5. Я использую это 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'); 

Это то, что мы получаем:

enter image description here

Имейте в виду, что это не является совершенным. Возможно, вам придется поиграть с порогом, чтобы получить более точную ограничительную рамку, но этого должно быть достаточно для начала.

Удачи вам!

+0

Спасибо Rayryeng, когда я запустил код, он дал мне ошибку на шаге # 4 Неопределенная переменная «A» или класс «A». –

+0

@AadnanFarooqA - извините опечатка. позвольте мне исправить – rayryeng

+0

@AadnanFarooqA - Исправлено. Запустите его снова и попробуйте – rayryeng

2

Вы также можете использовать vision.PeopleDetector в Computer Vision, System Toolbox:

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); 

enter image description here

Смежные вопросы