基于opencv的攝像頭臉部識別抓取及格式儲存(python)
opencv作為優秀的視覺處理在動態圖像處理上也是很不錯的,本次主要基于Opencv抓取視頻,然后保存為avi,同時進行臉部識別作業,
剛接觸opencv,參照opencv的sample例子做了一個視頻頭像抓取的小代碼,順便一起學習著用,先上視頻抓取及存儲代碼:
# -- coding: cp936 -- import cv2capture=cv2.VideoCapture(0)
將capture保存為motion-jpeg,cv_fourcc為保存格式
size = (int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
cv_fourcc值要設置對,不然無法寫入,而且不報錯,坑
video=cv2.VideoWriter("VideoTest.avi", cv2.cv.CV_FOURCC('I','4','2','0'), 30, size)
isopened可以查看攝像頭是否開啟
print capture.isOpened() num=0
要不斷讀取image需要設置一個循環
while True: ret,img=capture.read() #視頻中的圖片一張張寫入 video.write(img) cv2.imshow('Video',img) key=cv2.waitKey(1)#里面數字為delay時間,如果大于0為刷新時間, #超過指定時間則返回-1,等于0沒有返回值,但也可以讀取鍵盤數值, cv2.imwrite('%s.jpg'%(str(num)),img) num=num+1 if key==ord('q'):#ord為鍵盤輸入對應的整數, break video.release()
如果不用release方法的話無法儲存,要等結束程序再等攝像頭關了才能顯示保持成功
capture.release()#把攝像頭也順便關了
cv2.destroyAllWindows()</pre>
opencv視頻抓取好簡單,主要用videowriter就可以了,主要要注意的是opencv中的抓取是放在內存中的,所以需要一個釋放命令,不然就只能等到程序關閉后進行垃圾回收時才能釋放了。視頻抓取就不上圖了。
然后是臉部識別,opencv自帶了很多特征庫有臉部,眼睛的還有很多,原理都一樣,只是眼睛的庫識別率視乎并不高,直接上代碼:
#coding=utf-8 import cv2 import cv2.cv as cv img = cv2.imread("5.jpg") def detect(img, cascade): '''detectMultiScale函數中smallImg表示的是要檢測的輸入圖像為smallImg, faces表示檢測到的人臉目標序列,1.3表示每次圖像尺寸減小的比例為1.3, 4表示每一個目標至少要被檢測到3次才算是真的目標(因為周圍的像素和不同的窗口大小都可以檢測到人臉), CV_HAAR_SCALE_IMAGE表示不是縮放分類器來檢測,而是縮放圖像,Size(20, 20)為目標的最小最大尺寸''' rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30), flags = cv.CV_HAAR_SCALE_IMAGE) if len(rects) == 0: return [] rects[:,2:] += rects[:,:2] print rects return rects #在img上繪制矩形 def draw_rects(img, rects, color): for x1, y1, x2, y2 in rects: cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) #轉換為灰度圖 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #直方圖均衡處理 gray = cv2.equalizeHist(gray) #臉部特征分類地址,里面還有其他 cascade_fn = 'data/haarcascades/haarcascade_frontalface_alt.xml' #讀取分類器,CascadeClassifier下面有一個detectMultiScale方法來得到矩形 cascade = cv2.CascadeClassifier(cascade_fn) #通過分類器得到rects rects = detect(gray, cascade) #vis為img副本 vis = img.copy() #畫矩形 draw_rects(vis, rects, (0, 255, 0)) cv2.imshow('facedetect', vis) cv2.waitKey(0) cv2.destroyAllWindows()直接上效果圖和原圖對比:
http://my.oschina.net/Kanonpy/