import sys
import cv2
def CatchPICFromVideo(path_name, window_name="GET_FACE", camera_idx=0, catch_pic_num=500):
cv2.namedWindow(window_name)
# 視頻來源,可以來自一段已存好的視頻,也可以直接來自USB攝像頭
cap = cv2.VideoCapture(camera_idx)#cap = cv2.VideoCapture(0)是打開本地攝像頭
#打開本地視頻
#cap =cv2.VideoCapture("/home/dong/Pictures/QQ視頻20190417160108.mp4")
# 告訴OpenCV使用人臉識別分類器
classfier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 識別出人臉後要畫的邊框的顏色,RGB格式
color = (0, 255, 0)
num = 0
while cap.isOpened():
ok, frame = cap.read() # 讀取一幀數據
print(type(frame))
if not ok:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 將當前楨圖像轉換成灰度圖像
# 人臉檢測,1.2和2分別爲圖片縮放比例和需要檢測的有效點數
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=10, minSize=(32, 32))
'''
1 grey 是輸入圖像
2 scaleFactor這個是每次縮小圖像的比例,默認是1.1 ,我這裏選用1.2
3 minNeighbors 它表明如果有15個框都重疊一起了,那這裏肯定是臉部
我以前是 minNeighbors=3容易判斷錯誤,有些不是臉部也給標記起來了,在我看來,minNeighbors可以提高精度。
4 minSize() 匹配物體的最小範圍
maxSize()匹配物體的最大範圍
5 flags=0:可以取如下這些值:
CASCADE_DO_CANNY_PRUNING=1, 利用canny邊緣檢測來排除一些邊緣很少或者很多的圖像區域
CASCADE_SCALE_IMAGE=2, 正常比例檢測
CASCADE_FIND_BIGGEST_OBJECT=4, 只檢測最大的物體
'''
if len(faceRects) > 0: # 大於0則檢測到人臉
for faceRect in faceRects: # 單獨框出每一張人臉
x, y, w, h = faceRect
# 將當前幀保存爲圖片
img_name = '%s/%d.jpg ' % (path_name, num)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)
num += 1
if num > (catch_pic_num): # 如果超過指定最大保存數量退出循環
break
# 畫出矩形框
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 顯示當前捕捉到了多少人臉圖片了,這樣站在那裏被拍攝時心裏有個數,不用兩眼一抹黑傻等着
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, 'num:%d' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)
# 超過指定最大保存數量結束程序
if num > (catch_pic_num): break
# 顯示圖像
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
#waitKey()函數的功能是不斷刷新圖像,頻率時間爲delay,單位爲ms。
if c & 0xFF == ord('q'):
break
# 釋放攝像頭並銷燬所有窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
#CatchPICFromVideo("識別人臉區域")
CatchPICFromVideo('E:\\work\\facode\\renlian-master\\data\\su')
#def CatchPICFromVideo(window_name, camera_idx, catch_pic_num, path_name):
#在函數定義中,幾個參數,反別是窗口名字,攝像頭系列號,捕捉照片數量,以及存儲路徑
在下邊的人臉識別分類器中是我自己下載的opencv,下載網站是:https://opencv.org/releases.html,你也要找到這個路徑並且複製到程序中,這個東西的作用主要是實現對人臉識別的功能,在安裝中還有其他的功能,我也一併列在下面:
人臉檢測器(默認):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