1. 程式人生 > >Python+Opencv呼叫攝像頭實現人臉識別並儲存視訊及儲存空檔案問題解決

Python+Opencv呼叫攝像頭實現人臉識別並儲存視訊及儲存空檔案問題解決

前言

本文介紹了利用Python+Opencv實現呼叫攝像頭、進行人臉識別、並儲存為avi格式視訊的程式方法。至於python+opencv測試環境的搭建,回頭再開一個帖子進行介紹。
前期配置
Python2.7+Opencv2.4.13

實現過程

先貼程式碼:

#!/usr/bin/env python
#coding=utf-8
import os
import numpy
from PIL import Image,ImageDraw
import cv2


cap = cv2.VideoCapture(0)
fps = cap.get(cv2.cv.CV_CAP_PROP_FPS)
size =
(int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) fourcc = cv2.cv.CV_FOURCC('I','4','2','0') video = cv2.VideoWriter("D:/My Documents/Python/image/avi/aaa.avi", fourcc, 5, size) print cap.isOpened() classifier=cv2.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"
) count=0 while count > -1: ret,img = cap.read() faceRects = classifier.detectMultiScale(img, 1.2, 2, cv2.CASCADE_SCALE_IMAGE,(20,20)) if len(faceRects)>0: for faceRect in faceRects: x, y, w, h = faceRect cv2.rectangle(img, (int(x), int(y)), (int
(x)+int(w), int(y)+int(h)), (0,255,0),2,0) video.write(img) cv2.imshow('video',img) key=cv2.waitKey(1) if key==ord('q'): break video.release() cap.release() cv2.destroyAllWindows()

程式碼說明

module載入的部分就不多說了。

呼叫攝像頭使用cv2.VideoCapture(0)命令,fps獲取視訊的幀數,size獲取視訊尺寸,fourcc是標識視訊資料流格式的四字元程式碼。cv2.VideoWriter定義了視訊儲存的位置及相關引數,本例中使用了與攝像頭相同的編碼格式和尺寸,播放幀數設為每秒5幀。cv2.CascadeClassifier定義了人臉識別分類器,opencv根目錄\sources\data\haarcascades中提供了很多訓練好的分類器,我們使用haarcascade_frontalface_alt.xml分類器。

迴圈結構主要包括人臉識別、人臉標註(綠色粗實線框)、視訊儲存、標註結果展示等功能,當檢測到鍵盤輸入’q’時,攝像頭終止並儲存資料。

最後,video.release()、cap.release()、cv2.destroyAllWindows()關閉所有視窗,have fun!

更新

在opencv3中size 和 fourcc 的獲取方式存在問題,需要改成如下形式。

size =(int(cap.get(cv2.CV_CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CV_CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.CV_FOURCC('I','4','2','0')

問題

之後在使用的過程中,一次發現儲存的視訊都是空的,只有6K,由於使用了多執行緒,以為是多執行緒的問題,後來在網上查詢到這篇文章opencv3 VideoWriter 不能儲存視訊才知道,opencv使用VideoWriter要求寫入幀的size和建立視訊檔案時宣告的幀的大小一致。所以最好使用size =(int(cap.get(cv2.CV_CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CV_CAP_PROP_FRAME_HEIGHT)))這種方式獲取幀的大小,而不要這樣size = (1920,1080)自定義幀的大小。