歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 基於OpenCV的攝像頭臉部識別抓取及格式儲存(Python)

基於OpenCV的攝像頭臉部識別抓取及格式儲存(Python)

日期:2017/2/28 14:25:02   编辑:Linux教程

剛接觸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()

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

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

--------------------------------------分割線 --------------------------------------

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm

[翻譯]Ubuntu 14.04, 13.10 下安裝 OpenCV 2.4.9 http://www.linuxidc.com/Linux/2014-12/110045.htm

--------------------------------------分割線 --------------------------------------

OpenCV的詳細介紹:請點這裡
OpenCV的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved