2017-06-19 1 views
0

J'essaie de faire une détection de visages dans une vidéo à l'aide de l'API Google Vision. J'utilise le code suivant:Détection de visages en vidéo à l'aide de l'API Google Cloud

import argparse 
import cv2 
from google.cloud import vision 
from PIL import Image, ImageDraw 


def detect_face(face_file, max_results=4): 
    """Uses the Vision API to detect faces in the given file. 
    Args: 
     face_file: A file-like object containing an image with faces. 
    Returns: 
     An array of Face objects with information about the picture. 
    """ 
    content = face_file.read() 
    # [START get_vision_service] 
    image = vision.Client().image(content=content) 
    # [END get_vision_service] 

    return image.detect_faces() 


def highlight_faces(frame, faces, output_filename): 
    """Draws a polygon around the faces, then saves to output_filename. 
    Args: 
     image: a file containing the image with the faces. 
     faces: a list of faces found in the file. This should be in the format 
      returned by the Vision API. 
     output_filename: the name of the image file to be created, where the 
      faces have polygons drawn around them. 
    """ 
    im = Image.open(frame) 
    draw = ImageDraw.Draw(im) 

    for face in faces: 
     box = [(bound.x_coordinate, bound.y_coordinate) 
       for bound in face.bounds.vertices] 
     draw.line(box + [box[0]], width=5, fill='#00ff00') 

    #im.save(output_filename) 


def main(input_filename, max_results): 

    video_capture = cv2.VideoCapture(input_filename) 


    while True: 
     # Capture frame-by-frame 
     ret, frame = video_capture.read() 
     faces = detect_face(frame, max_results) 
     highlight_faces(frame, faces) 
     cv2.imshow('Video', frame) 
     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 


if __name__ == '__main__': 
    parser = argparse.ArgumentParser(
     description='Detects faces in the given image.') 
    parser.add_argument(
     'input_image', help='the image you\'d like to detect faces in.') 
    parser.add_argument(
     '--max-results', dest='max_results', default=4, 
     help='the max results of face detection.') 
    args = parser.parse_args() 

    main(args.input_image, args.max_results) 

Mais je reçois l'erreur:

content = face_file.read() AttributeError: 'numpy.ndarray' object has no attribute 'read'

Les "cadres" sont se lisent comme numpy tableau. Mais je ne sais pas comment les contourner.

Quelqu'un peut-il m'aider s'il vous plaît?

Répondre

1

La fonction detect_face attend un objet de type fichier pour lire les données. Une façon possible de le faire est de convertir frame (de type numpy.ndarray) en une image, et de le mettre dans un tampon, qui peut ensuite être lu comme un fichier.

Par exemple, essayez de faire les modifications suivantes à votre code:

## Add some imports. 
import io 
import numpy as np 
... 

def main(input_filename, max_results): 
    ... 
    while True: 
     # Capture frame-by-frame 
     ret, frame = video_capture.read() 

     ## Convert to an image, then write to a buffer. 
     image_from_frame = Image.fromarray(np.unit8(frame)) 
     buffer = io.BytesIO() 
     image_from_frame.save(buffer, format='PNG') 
     buffer.seek(0) 

     ## Use the buffer like a file. 
     faces = detect_face(buffer, max_results) 

     ... 

Note: Il devrait y avoir un moyen d'utiliser image_from_frame.tobytes() comme contenu de l'image dans le client API de vision, mais je ne pouvais pas le faire fonctionner.