0前置操作
- 安裝python(最新3.10即可)
- 安裝pycharm(社區(qū)版即可)
- 安裝opencv-python(cmd輸入pip install opencv-python即可,嫌慢用國內(nèi)鏡像也可以)
- 后續(xù)也需要安裝opencv-contrib-python
1讀取圖片
# 導入cv2模塊,別名為cv
import cv2 as cv
# 讀取圖片
img = cv.imread("face1.jpg")
# 顯示窗口到窗口上,窗口名就是read_img
cv.imshow("read_img", img)
# 窗口等待 0為不自動關(guān)閉 其他數(shù)值為等待時間,單位為毫秒,返回為按鍵的ASCII
key = cv.waitKey(0) # 此代碼不寫會閃現(xiàn)窗口
# 釋放內(nèi)存,銷毀窗口
cv.destroyAllWindows()
結(jié)果是直接在窗口直接顯示圖片
2灰度轉(zhuǎn)換
# 導入cv模塊
import cv2 as cv
# 讀取圖片
img = cv.imread("face1.jpg")
# 灰度轉(zhuǎn)換
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 窗口顯示灰度圖
cv.imshow("gray", gray_img)
# 保存灰度圖
cv.imwrite("face1_gray.jpg", gray_img)
# 顯示原圖
cv.imshow("img", img)
# 等待
cv.waitKey(0)
# 銷毀
cv.destroyAllWindows()
灰度圖與原始圖比較
3修改尺寸
import cv2 as cv
# 讀取原圖
img = cv.imread("face1.jpg")
# 修改尺寸
resize_img = cv.resize(img, dsize=(200, 200))
# 顯示原圖
cv.imshow("img", img)
# 顯示修改圖,最大化也是修改后的圖
cv.imshow("resize_img", resize_img)
# 打印修改前后的圖片尺寸信息
print("未修改", img.shape)
print("修改后", resize_img.shape)
# 按鍵為q時退出窗口等待
while True:
if ord('q') == cv.waitKey(0):
break
# 釋放內(nèi)存,銷毀窗口
cv.destroyAllWindows()
4繪制矩形或圓形(涉及人臉框使用)
import cv2 as cv
img = cv.imread("face1.jpg")
x, y, w, h = 100, 100, 100, 100
# 坐標軸以橫向右為x軸正方向,以縱向下為y軸正方向
# 畫矩形框(2個點可以確定一個邊與x軸y軸垂直或平行的矩形) color(b,g,r) thickness厚度
cv.rectangle(img, (x, y, x + w, y + h), color=(0, 0, 255), thickness=1)
# 畫圓形(圓點+半徑即可畫一個圓)
cv.circle(img, center=(x + w, y + h), radius=100, color=(0, 255, 0), thickness=1)
# 顯示
cv.imshow("img", img)
while True:
if ord('q') == cv.waitKey(0):
break
cv.destroyAllWindows()
5人臉識別
import cv2 as cv
# 檢測函數(shù) 檢索
def face_detect_demo():
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖片
#電腦本地路徑為E:/2022soft/py310/Lib/site-packages/cv2/data
face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_alt2.xml") # 級聯(lián)分類器
# gray表示傳入的灰度圖(快速查詢) 1.1表示每次搜索窗口依次擴大10% 5表示構(gòu)成檢測目標的相鄰矩形的最小個數(shù)(默認為3個) (100,100)表示最小人臉大小 (300,300)表示最大人臉大小
face = face_detect.detectMultiScale(gray, 1.1, 5, cv.CASCADE_SCALE_IMAGE, (30, 30), (200, 200))
# 遍歷所有人臉的位置信息,包括人臉位置及大小
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1) # 畫出識別出來的人臉框
cv.imshow("result", img)
# 讀取圖片
img = cv.imread("p4.jpg")
# 檢測圖片
face_detect_demo()
while True:
if ord('q') == cv.waitKey(0):
break
cv.destroyAllWindows()
運行如下(疑似歪頭馬斯克沒被識別出來)
文章來源:http://www.zghlxwxcb.cn/news/detail-439488.html
6多人臉檢測
import cv2 as cv
# 檢測函數(shù) 檢索
def face_detect_demo():
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖片
face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_default.xml") # 級聯(lián)分類器
face = face_detect.detectMultiScale(gray, minSize=(30, 30)) # 檢索人臉
# 遍歷所有人臉的位置信息,包括人臉位置及大小
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1) # 畫出識別出來的人臉框
cv.imshow("result", img)
# 讀取圖片
img = cv.imread("p3.jpg")
# 檢測圖片
face_detect_demo()
while True:
if ord('q') == cv.waitKey(0):
break
cv.destroyAllWindows()
7視頻檢測
import cv2 as cv
# 檢測函數(shù) 檢索 畫框
def face_detect_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖片
face_detect = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_default.xml") # 級聯(lián)分類器
face = face_detect.detectMultiScale(gray, minSize=(30, 30)) # 檢索人臉
# 遍歷所有人臉的位置信息,包括人臉位置及大小
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1) # 畫出識別出來的人臉框
cv.imshow("result", img)
# cap =cv.VideoCapture(0)#攝像頭取數(shù)據(jù)
cap = cv.VideoCapture("2.mp4")
while True:
flag, frame = cap.read() # 得到狀態(tài)和幀數(shù)據(jù)
if not flag:
break
face_detect_demo(frame) # 幀數(shù)據(jù)檢索人數(shù)并畫框
cv.waitKey(1)
cv.destroyAllWindows()
cap.release()
更換了檢測數(shù)據(jù)源,從單張圖片導攝像頭 或視頻文件,本質(zhì)不變,依舊是檢測每一幀的人臉,受限于初始模型的能力,誤識率還是比較高的。文章來源地址http://www.zghlxwxcb.cn/news/detail-439488.html
8拍照保存
import cv2 as cv
# 打開攝像頭
cap = cv.VideoCapture(0)
count = 1
while (cap.isOpened()): # 檢測攝像頭是否開啟
ret_flag, Vshow = cap.read() # 得到每幀數(shù)據(jù)
cv.imshow("Capture", Vshow) # 顯示預覽
k = cv.waitKey(1) & 0xFF # 按鍵判斷
if (k == ord('s')):
cv.imwrite(str(count) + "_camera.jpg", Vshow) # 保存
print("Success to save " + str(count) + "_camera.jpg\n")
count += 1
elif k == ord(" "): # 退出
break
# 釋放攝像頭
cap.release()
# 釋放窗口內(nèi)存
cv.destroyAllWindows()
9訓練人臉(提取人臉特征)
import os
import cv2 as cv
from PIL import Image
import numpy as np
def getImageAndLabels(path):
# 儲存人臉數(shù)據(jù)
facesSamples = []
# 儲存姓名數(shù)據(jù)
ids = []
# 儲存圖片信息
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
# 加載分類器
face_detector = cv.CascadeClassifier("haarcascade/haarcascade_frontalface_alt2.xml");
# 遍歷列表中的圖片
for imagePath in imagePaths:
# 打開圖片,灰度化,PIL有9種模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
PIL_img = Image.open(imagePath).convert('L')
# 將圖像轉(zhuǎn)為數(shù)組,以黑白深淺
img_numpy = np.array(PIL_img, 'uint8')
# 獲取圖片人臉特征
faces = face_detector.detectMultiScale(img_numpy)
# 獲取每張圖片的id和姓名
id = int(os.path.split(imagePath)[1].split('-')[0])
# 預防無面容照片
for x, y, w, h in faces:
ids.append(id)
facesSamples.append(img_numpy[y:y + h, x: x + w])
print('id=', id)
# 打印面部特征和id
print('fs=', facesSamples)
return facesSamples, ids
if __name__ == '__main__':
# 圖片路徑
path = "data/face/"
# 獲取圖像數(shù)組和id標簽數(shù)組和姓名
faces, ids = getImageAndLabels(path)
# 加載識別器 這里的face在opencv-contrib-python上,所以,你懂的
recognizer = cv.face.LBPHFaceRecognizer_create()
# 訓練
recognizer.train(faces, np.array(ids))
# 保存文件
recognizer.write("trainer/trainer.yml")
10人臉識別
import cv2 as cv
import os
def face_detect_demo(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier(
"haarcascade/haarcascade_frontalface_default.xml") # 級聯(lián)分類器
# gray表示傳入的灰度圖(快速查詢) 1.1表示每次搜索窗口依次擴大10% 5表示構(gòu)成檢測目標的相鄰矩形的最小個數(shù)(默認為3個) (100,100)表示最小人臉大小 (300,300)表示最大人臉大小
face = face_detector.detectMultiScale(gray, 1.1, 5, cv.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=1)
ids, confidence = recognizer.predict(gray[y:y + h, x:x + w])
if confidence > 80:#差別較大,當做不認識
cv.putText(img, "unknow" + str(confidence), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
else:
cv.putText(img, str(names[ids - 1]) + str(confidence), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75,
(0, 255, 0), 1)
cv.imshow("result", img)
def getName():
path = 'data/face/'
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
for imagePath in imagePaths:
name = str(os.path.split(imagePath)[1].split('-', 2)[1])
names.append(name)
names = []
getName()
recognizer = cv.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')#加載人臉特征值,之前訓練出來的
warningtime = 0
img = cv.imread("p6.jpg")#識別圖片
face_detect_demo(img)
cv.waitKey(0)
cap = cv.VideoCapture("2.mp4")
while True:
flag, frame = cap.read()
if not flag:
break
face_detect_demo(frame)#視頻每一幀識別
cv.waitKey(1)
11網(wǎng)絡視頻播放
import cv2
class CaptureVideo(object):
def net_video(self):
# 獲取網(wǎng)絡視頻流
cam = cv2.VideoCapture("rtmp://media3.scctv.net/live/scctv_800")#好不容易找到一個可以播放的視頻源
while cam.isOpened():
sucess, frame = cam.read()
cv2.imshow("Network", frame)
cv2.waitKey(1)
if __name__ == "__main__":
capture_video = CaptureVideo()
capture_video.net_video()
到了這里,關(guān)于python+opencv最簡單的人臉識別入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!