автоматическое определение лица и создание снимка с помощью opencv

Я работаю над проектом по распознаванию лиц в своем колледже. что я пытаюсь сделать снимок и сохранить его, если лицо определяется автоматически перед закрытием веб-камеры. то, что у меня есть сейчас, это открыть камеру и подождать, если лицо будет обнаружено, и нажать «q», чтобы сделать снимок и сохранить изображение. Вот код:

import numpy as np
import cv2
import time

#import the cascade for face detection
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')



def TakeSnapshotAndSave():
    # access the webcam (every webcam has a number, the default is 0)
    cap = cv2.VideoCapture(0)

    while(True):
        # Capture frame-by-frame
        ret, frame = cap.read()

        # to detect faces in video
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = frame[y:y+h, x:x+w]

        x = 0
        y = 20
        text_color = (0,255,0)
        # write on the live stream video
        cv2.putText(frame, "Press q when ready", (x,y), cv2.FONT_HERSHEY_PLAIN, 1.0, text_color, thickness=2)


        # if you want to convert it to gray uncomment and display gray not fame
        #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # Display the resulting frame
        cv2.imshow('frame',frame)
        # press the letter "q" to save the picture
        if cv2.waitKey(1) & 0xFF == ord('q'):
            # write the captured image with this name
            cv2.imwrite('try.jpg',frame)
            break

    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    TakeSnapshotAndSave()

заранее спасибо


person Mohamed Gabr    schedule 06.04.2016    source источник
comment
Хорошая идея, я собираюсь попробовать и сообщить, если это сработает. Спасибо   -  person Mohamed Gabr    schedule 06.04.2016


Ответы (2)


Я адаптировал ваш код для сохранения 10 изображений только для тестирования, если вам нужны бесконечные фотографии, просто измените условие while. Итак, в вашем коде вы перезаписывали текущее изображение, поэтому я изменил строковый параметр, чтобы можно было делать много снимков.

import numpy as np
import cv2
import time

#import the cascade for face detection
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

def TakeSnapshotAndSave():
    # access the webcam (every webcam has a number, the default is 0)
    cap = cv2.VideoCapture(0)

    num = 0 
    while num<10:
        # Capture frame-by-frame
        ret, frame = cap.read()

        # to detect faces in video
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            roi_gray = gray[y:y+h, x:x+w]
            roi_color = frame[y:y+h, x:x+w]

        x = 0
        y = 20
        text_color = (0,255,0)

        cv2.imwrite('opencv'+str(num)+'.jpg',frame)
        num = num+1

    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    TakeSnapshotAndSave()
person Bruno Justino Praciano    schedule 17.06.2017
comment
Привет, Бруно, я пытаюсь использовать твой код. Он сообщает следующее: ошибка: OpenCV (3.4.4) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:181: ошибка: (-215: утверждение не выполнено) !_src.empty() в функции 'cv::cvtColor' - person ah bon; 19.12.2018

Выполните imwrite() в самом цикле for (x,y,w,h) infaces:. Если вы используете постоянное имя файла, ваше последнее обнаруженное лицо будет сохранено, а остальные будут перезаписаны.

person Saransh Kejriwal    schedule 06.04.2016