先上几个cv2模块的函数
1.读取保存图片
import cv2 as cv
img=cv.imread("img.jpg")
cv.imshow("read",img)
cv.imwrite("img2.jpg",img)
cv.waitKey(0)
cv.destroyAllWindows()
2.改变图片尺寸
import cv2 as cv
img=cv.imread("img.jpg")
resize_img=cv.resize(img,dsize=(450,250))
cv.imshow("resize",resize_img)
print('未修改',img.shape)
print('修改后',resize_img.shape)
cv.destroyAllWindows()
3.转换灰度图片
import cv2 as cv
img= cv.imread("img.jpg")
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray_img)
cv.waitKey(0)
cv.destroyAllWindows()
4.绘制矩形
import cv2 as cv
img= cv.imread("img.jpg")
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray_img)
cv.imwrite("gray_img.jpg",gray_img)
cv.waitKey(0)
cv.destroyAllWindows()
开始人脸识别(确保电脑有摄像头)
1.先获取图片
import cv2 as cv
cap=cv.VideoCapture(0)#参数为0调用默认摄像头,为视频路径读取视频
num=1
while(cap.isOpened()):
flag,Vshow=cap.read()
cv.imshow("Capture_Test",Vshow)
k=cv.waitKey(1)
if k==ord('s'):
cv.imwrite('ykc/'+str(num)+'.ykc'+'.jpg',Vshow)
print('success to save'+str(num)+'.ykc'+'.jpg')
print('-------------------------------')
num+=1
elif k==ord('q'):
break
cap.release()
cv.destroyAllWindows()
2.训练数据
import os
import cv2 as cv
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f)for f in os.listdir(path)]
face_detector=cv.CascadeClassifier('D:/BaiduNetdiskDownload/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
for imagePath in imagePaths:
PIL_img=Image.open(imagePath).convert('L')
img_numpy=np.array(PIL_img,'uint8')
faces=face_detector.detectMultiScale(img_numpy)
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)
print('fs:',facesSamples)
return facesSamples,ids
if __name__=='__main__':
path='./ykc'
faces,ids=getImageAndLabels(path)
recognizer=cv.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
recognizer.write('ykc.yml')
3.人脸识别
import cv2 as cv
import os
import urllib
import urllib.request
from PyQt5.QtWidgets import QWidget, QApplication,QMessageBox
recogizer=cv.face.LBPHFaceRecognizer_create()
recogizer.read('ykc.yml')
names=[]
warningtime=0
def warning():
# app = QApplication([])
# w = QWidget() # 没有父类的widget将被作为窗口使用
# reply = QMessageBox.warning(w, '警告', '有坏银')
# app.exec()
print('有坏银')
def face_detect(img):
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detector=cv.CascadeClassifier('D:/BaiduNetdiskDownload/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
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=2)
ids,confidence=recogizer.predict(gray[y:y+h,x:x+w])
if confidence >80:
global warningtime
warningtime+=1
if warningtime>100:
warning()
warningtime=0
cv.putText(img,'unknow',(x+10,y-10),cv.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),1)
else:
cv.putText(img,str(names[ids-1]),(x+10,y-10),cv.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),1)
cv.imshow("result",img)
def name():
path = './ykc/'
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)
cap=cv.VideoCapture(0)
name()
while True:
flag,frame=cap.read()
if not flag:
break
face_detect(frame)
if ord('q')==cv.waitKey(10):
break
cv.destroyAllWindows()
cap.release()
warning()函数还有优化的地方,我是想在没有被录入的人脸进入摄像头多次后弹出一个警告的对话框,但是对话框弹出后,程序就终止运行了,所以目前只能print()提示,效果不是很好