基于opencv的攝像頭臉部識別抓取及格式儲存(python)

jopen 9年前發布 | 83K 次閱讀 圖形/圖像處理 OpenCV

opencv作為優秀的視覺處理在動態圖像處理上也是很不錯的,本次主要基于Opencv抓取視頻,然后保存為avi,同時進行臉部識別作業,

剛接觸opencv,參照opencv的sample例子做了一個視頻頭像抓取的小代碼,順便一起學習著用,先上視頻抓取及存儲代碼:

# -- coding: cp936 --
import cv2

capture=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()

直接上效果圖和原圖對比:

基于opencv的攝像頭臉部識別抓取及格式儲存(python)

基于opencv的攝像頭臉部識別抓取及格式儲存(python)

http://my.oschina.net/Kanonpy/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!