2017-06-19 152 views
0

我试图在使用Google Vision API的视频中进行人脸检测。我使用下面的代码:使用Google Cloud API进行视频中的人脸检测

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) 

但我得到的错误:

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

的“帧”越来越理解为numpy的阵列。但不知道如何绕过它们。

任何人都可以帮我吗?

回答

1

detect_face函数期望类文件对象从中读取数据。一种可能的方法是将frame(类型numpy.ndarray)转换为图像,并将其放入缓冲区,然后可以将其读取为文件。

例如,尝试做以下修改你的代码:

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

     ... 

注:应使用image_from_frame.tobytes()作为视觉API客户端图像内容的方式,但我不能使它工作。