Что возвращает метод CV2 detectMultiScale?

В CV2 я могу генерировать лица из загруженного изображения.

faces = faceCascade.detectMultiScale(
    read_img,
    scaleFactor = 1.1,
    minNeighbors = 0,
    minSize=(100,100)
)
how_many_faces = len(faces)

сколько_лиц возвращает правильное количество граней.

Если я добавлю эти лица в массив...

our_faces = []
for i in faces:
    our_faces.append(i)

return str(our_faces)

...и возвращаю наши_лица, получаю следующие данные:

[array([187, 138, 236, 236], dtype=int32), array([197, 138, 236, 236], dtype=int32), array([163, 130, 260, 260], dtype=int32), array([163, 141, 260, 260], dtype=int32), array([173, 141, 260, 260], dtype=int32), array([184, 141, 260, 260], dtype=int32), array([143, 119, 286, 286], dtype=int32), array([167, 119, 286, 286], dtype=int32), array([143, 131, 286, 286], dtype=int32), array([155, 131, 286, 286], dtype=int32), array([167, 131, 286, 286], dtype=int32), array([144, 105, 315, 315], dtype=int32), array([157, 105, 315, 315], dtype=int32), array([131, 118, 315, 315], dtype=int32), array([144, 118, 315, 315], dtype=int32), array([157, 118, 315, 315], dtype=int32), array([170, 118, 315, 315], dtype=int32), array([130, 87, 346, 346], dtype=int32), array([115, 101, 346, 346], dtype=int32), array([130, 101, 346, 346], dtype=int32), array([144, 101, 346, 346], dtype=int32), array([159, 101, 346, 346], dtype=int32), array([130, 115, 346, 346], dtype=int32), array([ 87, 70, 419, 419], dtype=int32)]

Правильно ли я предполагаю, что этот массив содержит все данные для каждого лица и что это массив Numpy? Если да, то как я могу преобразовать эти данные в массив обратно в формат изображения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
3 666
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

faceCascade.detectMultiScale() возвращает список прямоугольников, поэтому он не содержит изображений обнаруженных лиц, и вы не можете реконструировать лица исключительно из этого списка.

Если вы хотите получить изображения лиц, вам необходимо:

  • сохранить копию изображения, на котором вы изначально искали лица, и
  • используйте нарезку Numpy или аналогичную для извлечения прямоугольников, границы которых находятся в списке faces, возвращаемом faceCascade.detectMultiScale()

Спасибо, Марк. Это отвечает на часть теории. Я смог получить более разумный вывод, используя img = Image.fromarray(...), но я получаю ValueError, что «недостаточно данных изображения». Я думаю, что это лучше задать в другом вопросе, поэтому я создам отдельный вопрос для этой ошибки.

Victor Rodriguez 28.01.2019 17:08

Хорошо, буду следить за новинкой. Это не проблема, вопросы бесплатны!

Mark Setchell 28.01.2019 17:11
def crop(image, faces, k=0):
"""
This function crops the initial image into faces' images seperately. 
Arguments:
    image  (np array image)
    faces (list of tuples)
"""
faces_arrays = []
for (top, right, bottom, left)in faces:
    x0, y0 = left, bottom
    x1, y1 = right, top
    w, h = right-left, top-bottom
    cv2.rectangle(img=image, pt1=(x0, y0), pt2=(x1, y1), color=(255,0,0), thickness=2)
    x2, x3 = x1-w,  x0+w
    # crop the region of interest over a copy 
    face = image[y1:y0, x2:x3].copy()
    faces_arrays.append(face)
    # comment the two following lines if you want to stop saving the crops
    cv2.imwrite('face'+str(k)+'.jpg', face)
    k += 1
return faces_arrays

Другие вопросы по теме