欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng)

 更新時(shí)間:2019年09月25日 11:16:49   作者:Python弟弟  
這篇文章主要介紹了利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

基于python opencv人臉識(shí)別的簽到系統(tǒng)前言先看下效果實(shí)現(xiàn)的功能開(kāi)始準(zhǔn)備頁(yè)面的構(gòu)建功能實(shí)現(xiàn)代碼部分總結(jié)

前言

一個(gè)基于opencv人臉識(shí)別和TensorFlow進(jìn)行模型訓(xùn)練的人臉實(shí)時(shí)簽到系統(tǒng),作者某二本大學(xué)里的末流學(xué)生,寫于2019/09/,python學(xué)習(xí)期間。

今年7月份開(kāi)始接觸python的,最近閑著無(wú)事就開(kāi)始做了這個(gè)人臉識(shí)別的系統(tǒng),一開(kāi)始的話就想著簡(jiǎn)單的弄下,就去了百度智能云用的api接口實(shí)現(xiàn)的,寫完以后我就想為什么我不自己寫一個(gè)人臉識(shí)別簽到,不去調(diào)用百度api接口,然后就誕生了這個(gè)程序。

先看下效果

在這里插入圖片描述

實(shí)現(xiàn)的功能

點(diǎn)擊開(kāi)始進(jìn)行實(shí)時(shí)人臉打開(kāi)識(shí)別簽到

在這里插入圖片描述

點(diǎn)擊注冊(cè)會(huì)跳到注冊(cè)頁(yè)面進(jìn)行注冊(cè)

在這里插入圖片描述

點(diǎn)擊缺勤會(huì)打開(kāi)缺勤窗口顯示缺勤的表格

在這里插入圖片描述

開(kāi)始準(zhǔn)備

選用語(yǔ)言Python,時(shí)下入門機(jī)器學(xué)習(xí)成本最低、學(xué)習(xí)速度最快的語(yǔ)言,python搞網(wǎng)絡(luò)爬蟲(chóng)也很靠譜。運(yùn)用的技術(shù)有 opencv(攝像頭、圖片處理),numpy(圖片數(shù)字化),os(文件的操作和處理),TensorFlow(構(gòu)建神經(jīng)網(wǎng)絡(luò)進(jìn)行模型訓(xùn)練)。

頁(yè)面的構(gòu)建

我的UI頁(yè)面是用pyqt寫的,pyqt這塊也不是很熟練,就稍微看了看教程,問(wèn)了問(wèn)同學(xué),摸索著開(kāi)始使用了,關(guān)于pyqt這塊的話,不和大家多說(shuō)了,大家可以看下這個(gè)鏈接pyqt5、qtdesigner安裝和環(huán)境設(shè)置,我的這個(gè)程序也是虧了博主的這篇博客,大愛(ài)

在這里插入圖片描述

功能實(shí)現(xiàn)

這里我就長(zhǎng)話短說(shuō),因?yàn)樯婕暗臇|西比較多,我就按照我的目錄中的文件開(kāi)始講起

在這里插入圖片描述

icon這個(gè)文件夾主要是存放UI頁(yè)面的圖標(biāo)

  • small_img_gray文件夾是用來(lái)存放注冊(cè)時(shí)轉(zhuǎn)換的灰度圖,就是你在注冊(cè)的時(shí)候點(diǎn)擊拍照以后,程序會(huì)在一段時(shí)間內(nèi)拍下100張照片進(jìn)行保存,然后再將保存的照片轉(zhuǎn)換為灰度圖進(jìn)行往后的模型訓(xùn)練。
  • temp文件夾用來(lái)保存訓(xùn)練的模型test_img用來(lái)保存注冊(cè)時(shí)拍下的100張照片,對(duì)了忘了說(shuō),
  • test_img文件夾和small_img_gray文件夾下都是以人名為命名的文件夾,每個(gè)人名文件夾下保存著100張照片

在這里插入圖片描述

captureface.py這個(gè)文件功能是

1.用于某個(gè)人的圖片采集和圖片中人臉檢測(cè)及灰度處理

2.通過(guò)電腦攝像頭實(shí)時(shí)拍照,并按類別進(jìn)行存儲(chǔ)

3.把獲取的圖片中的人臉檢測(cè)裁剪出來(lái),并做灰度處理后分類存儲(chǔ),這里用到了后邊的getimgdata.py文件

cnn_net.py是用來(lái)構(gòu)建cnn神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),以及模型訓(xùn)練和模型預(yù)測(cè)

cv2ImgAddText.py,關(guān)于這個(gè)文件,大家前邊看到的我人臉上邊有個(gè)方框和人名是吧,但是在做這一步的時(shí)候我發(fā)現(xiàn),opencv自帶的puttext方法不能輸出中文,只能輸出英文,很生氣,中國(guó)漢字文化博大精深~源遠(yuǎn)流長(zhǎng) 為什么不能輸出漢字??但是咱也不能怪人家開(kāi)發(fā)人員可能人家沒(méi)考慮的,所以這個(gè)文件就是將漢字進(jìn)行輸出的db.py用來(lái)建立連接數(shù)據(jù)庫(kù)的對(duì)象face_register.py文件向數(shù)據(jù)庫(kù)進(jìn)行插入用戶數(shù)據(jù)

face_search.py文件是在進(jìn)行簽到時(shí)更新數(shù)據(jù)庫(kù)中用戶的狀態(tài),是簽到了還是遲到了getimgdata.py文件包含4個(gè)方法,主要功能就是將用戶的照片進(jìn)行分類存儲(chǔ)

haarcascade_frontalface_default.xml文件是級(jí)聯(lián)分類器文件,是opencv進(jìn)行人臉識(shí)別的文件,具體還有其他的分類器,像識(shí)別眼睛嘴巴還有微笑什么的late.py和late.ui這兩個(gè)文件我拿一起說(shuō),主要是因?yàn)閘ate.py是由late.ui文件進(jìn)行編譯得到的,當(dāng)你看完上邊頁(yè)面部分的構(gòu)建你就會(huì)明白了,后邊的Mainwindow.pyMainwindow.ui以及register.py和register.ui同理,都是頁(yè)面的代碼文件微軟雅黑Bold.ttf就是人臉識(shí)別的時(shí)候方框上邊的名字字體,默認(rèn)的我嫌它的字體比較細(xì),所以網(wǎng)上找了個(gè)加粗的,大家也可以用別的字體,這個(gè)無(wú)所謂最后就是main.py這個(gè)文件了,基本上所有的執(zhí)行代碼就在這了,這里呢用到了pyqt的多線程QThread以及python的多線程threading,這倆稍微有點(diǎn)那么區(qū)別,但基本上實(shí)現(xiàn)都是相通的,為什么會(huì)用到多線程呢?

這是因?yàn)樵谝婚_(kāi)始進(jìn)行注冊(cè)拍照和模型訓(xùn)練的時(shí)候,我發(fā)現(xiàn)如果不啟用多線程,前端的ui頁(yè)面就會(huì)未響應(yīng),當(dāng)模型訓(xùn)練完成以后才恢復(fù)正常,這樣給用戶帶來(lái)的體驗(yàn)是極差的,所以盡量將ui展示頁(yè)面和功能實(shí)現(xiàn)的代碼分開(kāi),在顯示頁(yè)面的同時(shí)還能進(jìn)行后臺(tái)的運(yùn)算。

(不知道這樣說(shuō)對(duì)不對(duì),說(shuō)錯(cuò)的還請(qǐng)大家指出來(lái),小白虛心學(xué)習(xí))代碼部分

這里就放main.py文件的吧,其他的放了估計(jì)也太多剩下的大家可以去我的GitHub下載,下載鏈接會(huì)在最后貼出。

在這里插入圖片描述

# -*- coding: utf-8 -*-
# @File : main.py
# @Author: CSD
# @Date : 2019/9/7 0007 20:48
# @Software: PyCharm
import gc
import os
import sys
import time
import cv2
import qimage2ndarray
from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QAbstractItemView, QTableWidgetItem, QMessageBox
from Mainwindow import Ui_MainWindow
from db import mysql_conn
from face_register import register_handler
from face_search import search_handler
from late import Ui_Table
from register import Ui_Register
from cnn_net import CnnNet
from sklearn.model_selection import train_test_split
import numpy as np
from getimgdata import GetImgData
import captureface
from captureface import CaptureFace
import threading
from cv2ImgAddText import cv2ImgAddText
imgs, labels, number_name = GetImgData().readimg() # 讀取數(shù)據(jù)
train_x, test_x, train_y, test_y = train_test_split(imgs, labels, test_size=0.1, random_state=10) # 訓(xùn)練集測(cè)試集數(shù)據(jù)劃分
cnnnet = CnnNet() # 調(diào)用CNN算法類
# 主窗口
class parentWindow(QMainWindow, Ui_MainWindow):
 def __del__(self):
 try:
 self.camera.release() # 釋放資源
 except:
 return
 def __init__(self, parent=None):
 super(parentWindow, self).__init__(parent)
 self.setupUi(self)
 self.Latebt.setEnabled(False)
 # self.PrepCamera()
 self.CallBackFunctions()
 self.Timer = QTimer() # 實(shí)例化一個(gè)類
 self.Timer.timeout.connect(self.TimerOutFun) # 定時(shí)刷新
 self.flagThread = FlagThread()
 # 當(dāng)獲得循環(huán)完畢的信號(hào)時(shí),停止計(jì)數(shù)
 self.flagThread.trigger.connect(self.fun_timer)
 # 初始化攝像頭
 def PrepCamera(self):
 try:
 self.camera = cv2.VideoCapture(0)
 self.camera.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
 self.MsgTE.clear()
 self.MsgTE.append('攝像頭已連接!')
 except Exception as e:
 self.MsgTE.clear()
 self.MsgTE.append(str(e))
 # 回調(diào)函數(shù)
 def CallBackFunctions(self):
 self.Showbt.clicked.connect(self.StartCamera)
 self.About.clicked.connect(self.about)
 # 開(kāi)始按鈕函數(shù)
 def StartCamera(self):
 self.Showbt.setEnabled(False)
 self.Loginbt.setEnabled(False)
 self.Latebt.setEnabled(True)
 self.PrepCamera()
 self.Timer.start(1) # 每隔1ms刷新一次
 self.timelb = time.clock()
 self.flagThread.start()
 # 從攝像頭讀取圖像
 def TimerOutFun(self):
 success, img = self.camera.read()
 if success:
 self.Image = img
 self.DispImg()
 else:
 self.MsgTE.clear()
 self.MsgTE.setPlainText('攝像頭讀取圖像已暫停!')
 def fun_timer(self, flag):
 self.MsgTE.setPlainText(flag)
 # 檢測(cè)人臉、色彩空間及格式轉(zhuǎn)換
 def DispImg(self):
 results = captureface.detect_face(self.Image)
 if results is not ():
 faceboxes = results # 提取人臉位置信息
 for (x, y, w, h) in faceboxes:
 face = self.Image[y:y + h, x:x + w] # 截取圖片中的人臉圖像
 face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖片
 face = cv2.resize(face, (64, 64)) # 壓縮成指定大小
 face = face.reshape([1, 64, 64, 1])
 cnnNet = CnnNet(modelfile='./temp/train-model') # 注意這步很關(guān)鍵,起到了重置計(jì)算圖的作用,否則多次導(dǎo)入訓(xùn)練好的計(jì)算圖會(huì)出現(xiàn)tensor重復(fù)的問(wèn)題
 res, pre = cnnNet.predict(test_x=face) # 調(diào)用已訓(xùn)練好的模型進(jìn)行預(yù)測(cè)
 if np.max(pre) < 0.8: # 通過(guò)調(diào)整閾值為threshold,當(dāng)返回?cái)?shù)組最大值小于threshold是即視為unknown
  self.name = "unknown"
 else:
  self.name = number_name[res[0]]
  self.flagThread.get_name(self.name)
 # cv2.putText(self.Image, self.name, (int(x), int(y) - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
 cv2.rectangle(self.Image, (int(x), int(y)), (int(x + w), int(y + h)), (255, 0, 0), 3) # 將name顯示出來(lái)
 img = cv2ImgAddText(self.Image, self.name, int(x+25), int(y-50))
 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 qimg = qimage2ndarray.array2qimage(img) # 調(diào)用array2qimage函數(shù)將其轉(zhuǎn)為QImage格式
 self.DispLb.setPixmap(QPixmap(qimg)) # 再通過(guò)QPixmap函數(shù)轉(zhuǎn)為QPixmap格式進(jìn)行顯示。
 self.DispLb.show() # 圖像顯示
 gc.collect()
 else:
 img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2RGB)
 qimg = qimage2ndarray.array2qimage(img) # 調(diào)用array2qimage函數(shù)將其轉(zhuǎn)為QImage格式
 self.DispLb.setPixmap(QPixmap(qimg)) # 再通過(guò)QPixmap函數(shù)轉(zhuǎn)為QPixmap格式進(jìn)行顯示。
 self.DispLb.show() # 圖像顯示
 # 幫助
 def about(self):
 reply = QMessageBox.information(self,
   "關(guān)于",
   "1.點(diǎn)擊開(kāi)始按鈕播放視頻流,進(jìn)行簽到\n"
   "2.點(diǎn)擊注冊(cè)按鈕可跳往注冊(cè)窗口進(jìn)行注冊(cè)\n"
   "3.點(diǎn)擊缺勤按鈕可查看缺勤學(xué)生名單,狀態(tài)0代表缺勤\n"
   "4.點(diǎn)擊幫助按鈕可查看幫助,同時(shí)關(guān)閉主窗口視頻流,進(jìn)行人臉注冊(cè)",
   QMessageBox.Close)
 try:
 self.camera.release() # 釋放資源
 self.Showbt.setEnabled(True)
 self.Loginbt.setEnabled(True)
 except:
 return
# 注冊(cè)窗口
class childWindow(QDialog, Ui_Register):
 def __init__(self, parent=None):
 super(childWindow, self).__init__(parent)
 self.setupUi(self)
 self.PhotoBt.setEnabled(False)
 self.RegisterBt.setEnabled(False)
 # self.PrepCamera()
 self.CallBackFunctions()
 self.workThread = WorkThread()
 self.photoThread = PhotoThread()
 # 當(dāng)獲得循環(huán)完畢的信號(hào)時(shí),停止計(jì)數(shù)
 self.workThread.trigger.connect(self.timeStop)
 self.photoThread.trigger.connect(self.runover)
 self.Timer = QTimer() # 實(shí)例化一個(gè)類
 self.Timer.timeout.connect(self.TimerOutFun) # 定時(shí)刷新
 # 初始化攝像頭并打開(kāi)
 def PrepCamera(self):
 try:
 self.camera = cv2.VideoCapture(0)
 self.MsgLb.clear()
 self.MsgLb.setText('請(qǐng)輸入學(xué)號(hào)、姓名,點(diǎn)擊拍照!')
 except Exception as e:
 self.MsgLb.clear()
 self.MsgLb.setText(str(e))
 # 回調(diào)函數(shù)
 def CallBackFunctions(self):
 self.PhotoBt.clicked.connect(self.PhotoCamera)
 self.StartBt.clicked.connect(self.StartCamera)
 self.RegisterBt.clicked.connect(self.RegisterCamera)
 self.ModelBt.clicked.connect(self.ModelTrain)
 # 開(kāi)始按鈕函數(shù)
 def StartCamera(self):
 self.PhotoBt.setEnabled(True)
 self.RegisterBt.setEnabled(True)
 self.PrepCamera()
 self.Timer.start(1) # 每隔1ms刷新一次
 self.timelb = time.clock()
 # 注冊(cè)
 def RegisterCamera(self):
 Msg = register_handler(self.stu_id.text(), self.stu_name.text())
 self.MsgLb.setText(Msg)
 # 拍照按鈕函數(shù)
 def PhotoCamera(self):
 if self.stu_id.text().isdigit():
 self.RecordCamera() # 保存照片
 self.stu_id.clear()
 self.stu_name.clear()
 else:
 self.MsgLb.setText('請(qǐng)檢查學(xué)號(hào)是否正確')
 # 從攝像頭讀取圖像
 def TimerOutFun(self):
 success, img = self.camera.read()
 if success:
 self.Image = img
 self.DispImg()
 else:
 self.MsgLb.clear()
 self.MsgLb.setText('攝像頭讀取圖像已暫停!')
 # 色彩空間及格式轉(zhuǎn)換
 def DispImg(self):
 img = cv2.cvtColor(self.Image, cv2.COLOR_BGR2RGB)
 qimg = qimage2ndarray.array2qimage(img) # 調(diào)用array2qimage函數(shù)將其轉(zhuǎn)為QImage格式
 self.ShowLb.setPixmap(QPixmap(qimg)) # 再通過(guò)QPixmap函數(shù)轉(zhuǎn)為QPixmap格式進(jìn)行顯示。
 self.ShowLb.show() # 圖像顯示
 # 采集照片
 def RecordCamera(self):
 self.MsgLb.setText('正在采集圖片')
 self.photoThread.img(self.Image, self.stu_name.text())
 self.photoThread.start()
 def runover(self, msg, i):
 self.MsgLb.setText(msg)
 self.progressBar.setValue(i)
 # 模型訓(xùn)練
 def ModelTrain(self):
 self.MsgLb.setText('請(qǐng)等待一段時(shí)間進(jìn)行模型訓(xùn)練!')
 self.workThread.start()
 def timeStop(self, msg, i):
 self.MsgLb.setText(msg)
 self.progressBar.setValue(i)
 def closeEvent(self, event):
 self.camera.release()
# 缺勤窗口
class childWindow_late(QDialog, Ui_Table):
 def __init__(self, parent=None):
 super(childWindow_late, self).__init__(parent)
 self.setupUi(self)
 self.CallBackFunctions()
 self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
 # 回調(diào)函數(shù)
 def CallBackFunctions(self):
 self.ResetBt.clicked.connect(self.ResetTable)
 self.ShowBt.clicked.connect(self.ShowTable)
 # 顯示缺勤表格
 def ShowTable(self):
 sql = 'select * from users where state=0'
 print(sql)
 cursor = mysql_conn.cursor()
 cursor.execute(sql)
 results = cursor.fetchall()
 print(results)
 if results:
 row = cursor.rowcount
 vol = len(results[0])
 self.tableWidget.setRowCount(row)
 self.tableWidget.setColumnCount(3)
 for i in range(row):
 for j in range(3):
  temp_data = results[i][j + 1] # 臨時(shí)記錄,不能直接插入表格
  print(temp_data)
  data = QTableWidgetItem(str(temp_data)) # 轉(zhuǎn)換后可插入表格
  data.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
  self.tableWidget.setItem(i, j, data)
 # 重置
 def ResetTable(self):
 reply = QMessageBox.question(self,
   "消息",
   "重置后所有的學(xué)生的狀態(tài)將更改為0,是否修改?",
   QMessageBox.Yes | QMessageBox.No)
 if reply == QMessageBox.Yes:
 sql = 'update users set state = 0'
 print(sql)
 cursor = mysql_conn.cursor()
 cursor.execute(sql)
 mysql_conn.commit()
 else:
 return
class WorkThread(QThread):
 trigger = pyqtSignal(str, int)
 def __int__(self):
 super(WorkThread, self).__init__()
 def run(self):
 time.sleep(2)
 path = './small_img_gray' # 灰度圖路徑
 imgs, labels, number_name = GetImgData(dir=path).readimg()
 x_train, x_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.2)
 cnnNet = CnnNet(modelfile='./temp/train-model',
  imgs=x_train, labels=y_train)
 train_class = cnnNet.cnnTrain(maxiter=1000, # 最大迭代次數(shù)
   accu=0.99, ) # 指定正確率(499次之后)
 for index, out in enumerate(train_class):
 # 循環(huán)完畢后發(fā)出信號(hào)
 self.trigger.emit(out, index * 10)
 self.trigger.emit("訓(xùn)練完成", 100)
 def kill_thread(self):
 self.terminate()
class PhotoThread(QThread, Ui_Register):
 trigger = pyqtSignal(str, int)
 def __int__(self):
 super(PhotoThread, self).__init__()
 def img(self, img, stu_name):
 self.Image = img
 self.stu_name = stu_name
 def run(self):
 filepath = os.path.join('./test_img/', self.stu_name) # 路徑拼接
 if not os.path.exists(filepath): # 看是否需要?jiǎng)?chuàng)建路徑
 os.makedirs(filepath)
 for i in range(100): # 開(kāi)始拍照
 savePath = (filepath + "/%d.jpg" % i)
 cv2.imencode('.jpg', self.Image, [cv2.IMWRITE_JPEG_QUALITY, 100])[1].tofile(savePath) # 保存圖片
 # 無(wú)法寫入中文 搜了搜發(fā)現(xiàn)OpenCV的imwrite不支持 所以換成了cv2.imencode
 # picturepath = os.path.join(filepath, str(i)) + '.jpg' # 圖片的完整路徑名 無(wú)法讀取中文路徑
 # cv2.imwrite(picturepath, self.Image, [cv2.IMWRITE_JPEG_QUALITY, 100]) # 將圖片寫入指定d路徑
 self.trigger.emit('正在采集圖片~', i)
 picture = CaptureFace(
 imgdir='./test_img/', # 采集到的圖片存放位置
 grayfacedir='./small_img_gray' # 灰度處理后的圖片存放位置
 )
 picture.facetogray(someone=self.stu_name, waitkey=100, size=64)
 self.trigger.emit('圖片采集完畢!點(diǎn)擊注冊(cè)', 100)
class FlagThread(QThread):
 trigger = pyqtSignal(str)
 def __int__(self):
 super(FlagThread, self).__init__()
 def get_name(self, name=''):
 self.name = name
 def log_in(self):
 if self.name != '':
 user_id, user_name, user_state = search_handler(self.name)
 if user_state == 1:
 self.Msg = '%s %s 簽到成功.' % (user_id, user_name)
 elif user_id is None:
 self.Msg = '簽到失敗'
 else:
 self.Msg = '未檢測(cè)到人臉'
 def run(self):
 time.sleep(2)
 while True:
 self.get_name()
 timer = threading.Timer(2, self.log_in) # 等待5s鐘調(diào)用一次fun_timer() 函數(shù)
 timer.start()
 timer.join()
 self.trigger.emit(self.Msg)
 print(self.Msg)
if __name__ == '__main__':
 app = QApplication(sys.argv)
 ui = parentWindow()
 ui_child = childWindow()
 ui_child_late = childWindow_late()
 login_btn = ui.Loginbt
 late_btn = ui.Latebt
 login_btn.clicked.connect(ui_child.show)
 late_btn.clicked.connect(ui_child_late.show)
 if mysql_conn is None:
 QMessageBox.warning(ui,
  "警告",
  "請(qǐng)先聯(lián)網(wǎng),以便進(jìn)行操作",
  QMessageBox.Close)
 sys.exit(app.exec_())
 else:
 ui.show()
 sys.exit(app.exec_())

這個(gè)我自己搭建出的人臉識(shí)別系統(tǒng)是具有自己學(xué)習(xí)能力的,你給它喂的數(shù)據(jù)越多,它就可以識(shí)別越多的人而且準(zhǔn)確度會(huì)不斷提高,希望大家可以自己測(cè)試和研究。最終實(shí)現(xiàn)的結(jié)果就是文章開(kāi)頭的時(shí)候的效果。希望能幫到大家!最后附上GitHub地址,覺(jué)著好的話可以給個(gè)星星★哦源代碼下載地址

有什么問(wèn)題我會(huì)盡量回答!

總結(jié)

以上所述是小編給大家介紹的利用python、tensorflow、opencv、pyqt5實(shí)現(xiàn)人臉實(shí)時(shí)簽到系統(tǒng),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

最新評(píng)論