主要實現功能:
通過opencv的模塊的內置的方法打開電腦攝像頭,讀取每一幀數據進行分析。通過界面的方式在界面裏實時更新攝像頭視頻並且標記出人臉。
效果圖:
代碼:
這部分代碼可以用來檢測opencv的庫是否安裝正常。是直接調用opencv庫裏面調用攝像頭顯示圖像的方法,把攝像頭得到的每一幀圖像直接顯示在窗口裏,測試代碼如下:
#!/usr/bin/python3.7
# coding=utf-8
import cv2#導入opencv模塊
#捕捉幀,筆記本攝像頭設置爲0即可
""" VideoCapture是使用攝像頭的方法,
可以有多個攝像頭,多以攝像頭的編號是從0開始
VideoCapture第一個參數就是攝像頭編號"""
capture = cv2.VideoCapture(0)
#循環顯示幀
while(True):
"""讀取解碼攝像頭得到的每幀圖像,返回值第二個得到的每一幀圖像"""
ok, frame = capture.read()
"""顯示窗口第一個參數是窗口名,第二個參數是內容"""
cv2.imshow('Carmer', frame)
"""鍵盤按鍵等待延時,如果輸入按鍵q,則退出窗口"""
if cv2.waitKey(1) == ord('q'):#按Q退出
break
如果上面的程序可以正常在窗口裏顯示出來攝像頭拍攝的畫面,那麼說明可以正常使用opencv。
接下里需要去下載和安裝人臉識別級聯分類器opencv-CascadeClassifier
需要下載分類器:https://gitee.com/tianxiaohuahua/opencv.git
具體教程我參考了這位大神的博客:利用python、tensorflow、opencv實現人臉識別(包會)!
這裏需要注意一些問題,比如在填寫級聯分類器的文件路徑名稱時候,最好使用局對路徑。在使用絕對路徑的時候確實麻煩了半個小時找錯誤。
如果你正確下載了文件,但是報錯是
error(-215) !empty() in function detectMultiScale
那麼有極大的可能是因爲路徑的原因纔會有錯誤。需要認真的找到文件路徑。
對應文章開頭人臉識別以及眼睛識別的具體代碼如下:
#!/usr/bin/python3.7
# coding=utf-8
import cv2
"""功能:級聯分類器由若干簡單分類器和一個神經網絡分類器構成。
參數列表:級聯分類器文件路徑;
其他: 關於opencv-CascadeClassifier(級聯分類器)的初步認識 https://blog.csdn.net/sazass/article/details/89150468"""
face_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花語音機器人主程序/program/main/opencv/data/haarcascades/haarcascade_frontalface_default.xml") #告訴OpenCV使用人臉識別分類器
eye_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花語音機器人主程序/program/main/opencv/data/haarcascades/haarcascade_eye.xml") #告訴OpenCV使用眼睛識別分類器
"""功能:對opencv級聯分類器的分類
人臉檢測器(默認):haarcascade_frontalface_default.xml
人臉檢測器(快速Harr):haarcascade_frontalface_alt2.xml
人臉檢測器(側視):haarcascade_profileface.xml
眼部檢測器(左眼):haarcascade_lefteye_2splits.xml
眼部檢測器(右眼):haarcascade_righteye_2splits.xml
嘴部檢測器:haarcascade_mcs_mouth.xml
鼻子檢測器:haarcascade_mcs_nose.xml
身體檢測器:haarcascade_fullbody.xml
人臉檢測器(快速LBP):lbpcascade_frontalface.xml
原文鏈接:https://blog.csdn.net/qq_42633819/article/details/81191308 """
""" 功能:cv2.VideoCapture是使用攝像頭的方法,
可以有多個攝像頭,多以攝像頭的編號是從0開始
參數列表: VideoCapture第一個參數就是攝像頭編號"""
cap = cv2.VideoCapture(0)
"""功能:進入人臉檢測,因爲處理的過程是將攝像頭得到的每一幀數據進行處理,並且信息實時更新!"""
while True:
"""功能:讀取解碼攝像頭得到的每幀圖像,第二個返回值是得到的每一幀圖像"""
ok, img = cap.read()
"""功能從:磁盤讀取一張圖片進行人臉識別標記出來
參數列表: 圖片路徑
返回值: 讀取到的文件緩存
img = cv2.imread(filepath) # 讀取圖片"""
"""功能:將當前幀轉換成灰度圖像,輸入值是攝像頭得到的每一幀圖像、代表灰度的參數
灰度圖像是爲了減少增加識別效率,減少識別的運算量,降低計算複雜度"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
"""功能:利用分類器識別出哪個區域爲人臉
參數列表:
image:圖像緩存文件
scaleFactor圖片縮放比例;
minNeighbors要檢測的有效點數;
minNeighbors:對特徵檢測點周邊多少有效點同時檢測,這樣可避免因選取的特徵檢測點太小而導致遺漏,數字越大識別精度越高;
minSize:特徵檢測點的最小尺寸。
返回值: 得到一個矩形(一個臉一個)分別是矩形的x, y, w, h(座標,長寬),
如果是多個臉就有多個矩形,則返回值爲列表,列表內包含每一個矩形的信息"""
faces = face_cascade.detectMultiScale(image = gray,
scaleFactor = 1.2,# scaleFactor圖片縮放比例
minNeighbors = 4,# minNeighbors要檢測的有效點數,數字越大識別精度越高
minSize = (32, 32) )# 特徵檢測點的最小尺寸
"""功能:將多個臉用框畫出來"""
if len(faces) > 0: # 大於0則檢測到人臉
for faceRect in faces: # 單獨框出每一張人臉,
x, y, w, h = faceRect # 在圖像中人臉的位置和大小信息
"""功能:在圖像中使用方框標記出來人臉"""
cv2.rectangle(img = img, # 圖像文件
pt1 = (x, y), # 方框位置
pt2 = (x + w, y + h), # 方框的大小
color = (255, 0, 0),# 方框的顏色
thickness = 2 ) # 方框的線寬
"""功能:把原來的圖像轉切割成只剩下人臉的小圖像"""
roi_color = img[y:y + h // 2, x:x + w]
"""功能:把原來的灰度圖像轉切割成只剩下人臉的小灰度圖像"""
roi_gray = gray[y:y + h // 2, x:x + w]
"""功能:利用利用分類器識別出哪個區域爲眼睛"""
eyes = eye_cascade.detectMultiScale(image = roi_gray, # 圖像緩存文件
scaleFactor = 1.1, # scaleFactor圖片縮放比例
minNeighbors = 1, # minNeighbors要檢測的有效點數
flags = cv2.CASCADE_SCALE_IMAGE, # 層疊縮放圖像
minSize = (2, 2)) # 特徵檢測點的最小尺寸
"""功能:將多個眼睛圈畫出來"""
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(img = roi_color, # 圖像文件
pt1 = (ex, ey), # 方框位置
pt2 = (ex + ew, ey + eh), # 方框的大小
color = (0, 255, 0), # 方框的顏色
thickness = 2) # 方框的線寬
"""功能:在窗口裏輸出文字提示"""
cv2.putText(img = img, # 圖像文件
text = "face", # 要顯示的文字
org = (x, y - 30), # 座標
fontFace = cv2.FONT_HERSHEY_SIMPLEX, # 字體
fontScale = 1, # 字號
color = (255, 0, 255), # 顏色
lineType = 2) # 字的線寬
"""功能:等待10毫秒看是否有按鍵輸入"""
cv2.imshow(winname = "img", mat = img)
"""功能:如果輸入q則退出循環"""
if cv2.waitKey(1) & 0xFF == ord('q'):
break
"""
# 將當前幀保存爲圖片
ok, frame = cap.read() # 讀取一幀數據
img_name = '%s/%s.jpg ' %(path_name, name)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)"""
運行環境:
Ubuntu19.0
python3.7
pycharm
踩坑細節:
本來以爲安裝opencv的庫需要很麻煩,下載了zip還去搜怎麼安裝,結果安裝了半天也沒有安裝上,但是在pycharm直接搜索這個庫就直接安裝好了!