Поиск лиц с помощью OpenCV на Python 3

754 просмотра
0
0 Комментариев

Нашёл код который мне нужен, но как я понял он для Python 2 .
Помогите переделать для Python 3 .

import sys
import cv,cv2
import numpy
cascade = cv.Load('haarcascade_frontalface_alt.xml')
c=1.6
Sr=15
 
def detect(image):
 bitmap = cv.fromarray(image)
 faces = cv.HaarDetectObjects(bitmap, cascade, cv.CreateMemStorage(0))
 if faces:
  for (x,y,w,h),n in faces:
   k=float(w)/bitmap.cols
   S = Sr*c/k
   cv2.rectangle(image,(x,y),(x+w,y+h),(255,255,255),3)
   cv2.putText(image,'S=%s'%(S),(x,y-10), cv2.FONT_HERSHEY_PLAIN, 1.0,(255,255,255))
 return image
 
if __name__ == "__main__":
    cam = cv2.VideoCapture(0)
    while 1:
        _,frame =cam.read()
        frame = numpy.asarray(detect(frame))
        cv2.imshow("features", frame)
        if cv2.waitKey(1) == 0x1b: # ESC
            print 'ESC pressed. Exiting ...'
            break

проблема с модулем cv , как я понял в Python 3 его нету.


Добавить комментарий

2 Answers

Python Опубликовано 10.12.2018
0

В современных версиях OpenCV API немного поменялось.

Пример поиска лиц на фотографии:

import cv2
 
url='http://i.dailymail.co.uk/i/pix/2015/11/10/23/2E503F1500000578-3312647-image-a-39_1447197228350.jpg'
 
# читаем фото из интернета
cap = cv2.VideoCapture(url)
ret,img = cap.read()
 
cv2.imshow('img',img)

результат:

введите сюда описание изображения

загружаем данные заранее натренированных классификаторов (поменяйте пути, чтобы они указывали на соответствующие XML файлы в вашем окружении):

face_cascade = cv2.CascadeClassifier(r'C:\Users\Max\Anaconda3_5.0\envs\py36\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(r'C:\Users\Max\Anaconda3_5.0\envs\py36\Library\etc\haarcascades\haarcascade_eye.xml')

преобразовываем фото в оттенки серого:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

пытаемся найти лица и глаза на фото:

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

сохраняем результат:

cv2.imwrite(r'd:/temp/res.png', img)

получилось:

введите сюда описание изображения

Добавить комментарий
0

Чтобы нарисовать рамки вокруг лиц (без глаз) на картинке:

def detect_faces(f_cascade, bgr_img, scale_factor=1.3):
    gray = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)  # need grayscale image
    faces = f_cascade.detectMultiScale(  # detect faces
        gray, scaleFactor=scale_factor, minNeighbors=5)
 
    for (x, y, w, h) in faces:  # draw a rectangle around each face
        cv2.rectangle(bgr_img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    return len(faces)  # return the number of detected faces

где в качестве каскадного классификатора можно передать haarcascade_frontalface_alt, установленный вместе с opencv:

import os
import cv2  # $ pip install opencv-python
 
path = os.path.join(cv2.__path__[0], 'data/haarcascade_frontalface_alt.xml')
assert os.path.exists(path)
haar_face_cascade = cv2.CascadeClassifier(path)

Чтобы нарисовать лица на картинке, заданной в командной строке:

import sys
 
bgr_img = cv2.imread(sys.argv[1])
nfaces = detect_faces(haar_face_cascade, bgr_img, 1.05)
print(f'detected {nfaces}')  # -> 85
 
# show image
cv2.imshow('Image', img)
cv2.waitKey()  # wait until any key is pressed
cv2.destroyAllWindows()

Результат для фото с выставки:

detected faces haar

Видно, что не все лица определились и есть ложные срабатывания. Увеличивая scale_factor уменьшается число ложных срабатываний и общее число обнаруженных лиц на картинке.

В качестве альтернативы можно использовать LBP каскадные классификаторы из OpenCV, требующие меньше ресурсов, но у которых больше ложных срабатываний:

face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface_improved.xml')
bgr_img = cv2.imread(sys.argv[1])
nfaces = detect_faces(face_cascade, bgr_img, 1.01)
print(f'detected {nfaces}') # -> 99
cv2.imwrite('detected-faces-lbp.png', bgr_img)

detected faces lbp

Более точные результаты нежели LBP или Haar каскадные классификаторы из OpenCV, используя умеренные ресурсы (достаточно для видео), можно получить с помощью OpenCV dnn модуля. Face detection with OpenCV and deep learning.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up