人脸识别(cv2库的实现)

1.人脸识别

首先,我已经讲过了cv2库的安装了,以及拓展的相关文件了

接下来咱们就开干吧~

#导入cv2模块
import cv2 as cv

def face_detect_demo(img):
    gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    face_detect=cv.CascadeClassifier("D:\BaiduNetdiskDownload\OPENCV(WIN)\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml")
    face=face_detect.detectMultiScale(gray)#限制,最小是100×100,最大是1000×1000
    for x,y,w,h in face:
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
    cv.imshow("result",img)

#读取摄像头
cap=cv.VideoCapture(0)
#循环
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord('q')==cv.waitKey(1):
        break
#释放内存
cv.destroyAllWindows(0)
#释放摄像头
cap.release()







''''#灰度转换
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#显示灰度
cv.imshow("gray",gray_img)
#显示照片
cv.imshow("read_img",img)
#保存灰度照片
cv.imwrite("gray_face11.jpg",gray_img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()
'''

这是整体的代码

下面咱们细细道来:

对其中的函数属性做个解释:
创建一个VideoCapture对象,它的参数可以是设备索引或视频文件的名称。
有时候cap可能尚未初始化捕获,通过 cap.isOpened() 方法检查它是否已初始化。如果是True,那么确定。否则使用cap.open()打开它
cap.read() 返回布尔值(True/ False)。如果正确读取该帧,它将为True

cv2.imshow之后要跟cv2.waitkey,他们是一对好兄弟

cv2.waitKey(1000) & 0xFF == ord(‘q’) 是什么意思

先解释下字面意思:

  • cv2.waitKey(1000):在1000ms内根据键盘输入返回一个值
  • 0xFF :一个十六进制数
  • ord('q') :返回q的ascii码

0xFF是一个十六进制数,转换为二进制是11111111。waitKey返回值的范围为(0-255),刚好也是8个二进制位。那么我们将 cv2.waitKey(1) & 0xFF计算一下(不知怎么计算的可以百度位与运算)发现结果仍然是waitKey的返回值,那为何要多次一举呢?直接 cv2.waitKey(1) == ord('q')不就好了吗。

实际上在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象。通过cv2.waitKey(1) & 0xFF运算,当waitkey返回值正常时 cv2.waitKey(1) = cv2.waitKey(1000) & 0xFF,当返回值不正常时,cv2.waitKey(1000) & 0xFF的范围仍不超过(0-255),就避免了一些奇奇怪怪的BUG。

2.人脸录入

import cv2

#摄像头
cap=cv2.VideoCapture(0)

flag=1
num=1

while(cap.isOpened()):#检测是否在开启状态
    ret_flag,Vshow=cap.read()#得到每帧图像
    cv2.imshow("Capture_Test",Vshow)#显示图像
    k=cv2.waitKey(1) &0xFF #按键判断
    if k==ord('s'):#保存
        cv2.imwrite(r"C:\Users\lenovo\Desktop\output/"+str(num)+".name"+".jpg",Vshow) #路径前面必须加一个r,否则会报错
        print("sucess to save",str(num)+".jpg")
        print("-----------")
        num+=1
    elif k==ord(' '):
        break

cap.release()
cv2.destroyAllWindows()

功能是从摄像头截取照片并进行保存到指定目录下,注意在路径前面要加一个r,要不然解析不出来路径,会报错

你可能感兴趣的:(#,第三方库相关功能的实现,opencv,计算机视觉,python)