Python 中的 人脸识别 是基于OpenCV 来进行实现的。
OpenCV 可以通过 头videoCapture()方法打开摄像
摄像头变量 = cv2.VideoCapture(n) n为整数,内置摄像头为0,若有其他摄像头则依次为1,2,3,4,。。。
cap = cv2.VideoCapture(0)
摄像头是否处于打开状态可以通过isOpened()方法进行判断
摄像头变量.isOpened()
若打开返回True,反正返回False
cap.isOpened()
布尔变量,图像变量 = 摄像头变量.read() 可以通过read() 方法读取图像
布尔变量为True,代表读取成功,False代表读取失败
ret,img = cap.read()
释放摄像头
摄像头变量.release()
cap.release()
按键变量 = cv2.waitKey(n) waitKey(n) 方法可以获取用户输入,同时可获取按键的ASCLL码值
话不多说,直接上代码。
下面是登录注册的人脸实现系统。
from django.shortcuts import render
#导包
from django.http import HttpResponse,HttpResponseRedirect
#导入类路由库
from django.views import View
#导入数据库类
from myapp.models import User
import json
#导入时间模块
import time
import os
from mymac.settings import UPLOAD_ROOT
import cv2
import numpy as np
from myapp.my_compare import main_my,parse_arguments
from django.utils.decorators import method_decorator
from django.db import connection
#定义注册逻辑
class Sign_Up(View):
#定义注册接收方法
def post(self,request):
username = request.POST.get('username')
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier("C:/Users/lenvov/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml")
my_count = 1
while(1):
# 获取摄像头屏幕对象
ret,frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY )
# 识别脸部
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
for facerect in faces:
# 框处人脸
x,y,w,h = facerect
cv2.rectangle(gray,(x-10,y-10),(x+w+10,y+h+10),(0,255,0),3)
f = cv2.resize(gray[y:(y+h),x:(x+w)],(200,200))
# 生成摄像头视角窗口
cv2.imshow("capture",gray)
# 等待结束 如果按q键就结束
if cv2.waitKey(1) & 0xff == ord('q'):
cv2.imwrite(UPLOAD_ROOT+'/'+username+'_face.jpg',f)
break
# 释放摄像头
cap.release()
cv2.destroyAllWindows()
res = User.objects.filter(username=username).count()
if res > 0:
return HttpResponse('请换一个用户名')
else:
user = User(username=username)
user.save()
return HttpResponse('注册成功')
#定义登录逻辑
class Log_IN(View):
#定义注册接收方法
def post(self,request):
username = request.POST.get('username')
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier("C:/Users/lenvov/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml")
my_count = 1
while(1):
# 获取摄像头屏幕对象
ret,frame = cap.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY )
# 识别脸部
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
for facerect in faces:
# 框处人脸
x,y,w,h = facerect
cv2.rectangle(gray,(x-10,y-10),(x+w+10,y+h+10),(0,255,0),3)
f = cv2.resize(gray[y:(y+h),x:(x+w)],(200,200))
# 生成摄像头视角窗口
cv2.imshow("capture",gray)
# 等待结束 如果按q键就结束
if cv2.waitKey(1) & 0xff == ord('q'):
cv2.imwrite(UPLOAD_ROOT+'/'+username+'_hou.jpg',f)
break
# 释放摄像头
cap.release()
cv2.destroyAllWindows()
res = User.objects.filter(username=username)[0]
args_list = []
args_list.append('C:/20170512-110547')
args_list.append(UPLOAD_ROOT+'/'+username+'_face.jpg')
args_list.append(UPLOAD_ROOT+'/'+username+'_hou.jpg')
res_float = main_my(parse_arguments(args_list))
print(res_float)
if res_float > 0.50:
return HttpResponse('识别头像不匹配')
else:
return HttpResponse('登录成功')
这些只是后端代码,前端代码就是通过axios来实现的。
如需有有疑问,可以在评论区里评论。