文章目录

  • 0 项目说明
  • 1 需求分析
  • 2 总体设计
  • 3 详细设计
  • 4 效果展示
  • 5 实验心得
  • 6 项目源码
  • 7 最后

0 项目说明

基于opencv、dilb的员工人脸识别考勤系统

提示:适合用于课程设计或毕业设计,工作量达标,源码开放


1 需求分析

选题“员工刷脸考勤”,要求采用python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部信息,二是持久化地保存这些信息到数据库中去。更细地,还涉及表的设计;另一个基本要求是通过摄像头识别员工面部信息来完成考勤,这个问题基本可以通过遍历数据库里的员工面部数据与当前摄像头里的员工面部数据的比对来实现,但有一个问题就是假如摄像头里有多张人脸改怎么处理。扩展要求是导出每日的考勤表,可以拆分为两个部分,一个是存储考勤信息,一个是展示考勤信息。
我们希望达到的目标是:

(1)仿照通用型软件界面设计的原则,所有的操作都在菜单栏里实现,一部分区域用于展示摄像头实时读取并由程序加工后的视频流信息,另一部分区域做控制台输出,打印相关信息,比如提示员工面部信息添加成功、添加失败及其原因,提示员工打卡成功、打卡失败及其原因;添加面部信息时人是必须和程序进行交互的,比如输入一些相关的信息,这个时候程序是阻塞的;但是在打卡的时候,程序是不阻塞的,如果不点击关闭打卡,它会一直在打卡的模式,等待并识别每一个前来打卡的员工,这比较符合现实的使用场景。

(2)建表来存储员工信息和考勤信息,每次新建录入员工面部信息时,要求输入工号、姓名,并查无重后方可录入,录入时只取距离屏幕最近的员工的面部信息,这是考虑到实际打卡都是依次进行而不是一群人一群人地打卡,录入时有两种模式可供选择,自动模式:一旦识别到人脸就自动捕获截图,连续截图达到10张就结束录入;手动模式:点击菜单结束录入,不一定要得到10张。结束录入后就开始从刚才捕获的员工面部提取人脸特征数据并连同之前输入的员工姓名等数据作为一行记录保存到数据库中,如果没有捕获到员工面部或者刚才捕获的面部信息不是同一个人,这行记录就被丢弃。

考勤时,须满足三个条件:面部信息已录入、在打卡时间段内、未重复打卡,有打卡成功,打卡人姓名及工号、打卡日期及时间才会被当成一行记录保存到数据库并在控制台输出打卡成功信息,否则会在控制台输出失败及其原因信息。
总而言之:我们的设计目标是规范化、人性化。

2 总体设计

为了完成上述目标一,程序的界面初始化分为三部分,第一部分初始化菜单栏,第二部分初始化左边控制台,第三部分初始化右边展示面板,使这三部分相互独立;数据逻辑部分的初始化分为两部分,第一部分是数据库部分的初始化,如果数据库/表不存在就新建,存在则加载相关数据,第二部分是初始化一些需要循环使用的变量,比如新建录入时的员工姓名、工号、截图数目计数器等,每当完成录入时这些数据都应该被重置成初始化以待下一次录入,把这些初始化语句写成一个函数可以提高代码复用度。

上述目标二主要是一些限制性条件,可以通过添加判断语句来实现,比如对输入id的合法性检验:

while self.id == ID_WORKER_UNAVIABLE:self.id = wx.GetNumberFromUser(message="请输入您的工号(-1不可用)",prompt="工号", caption="温馨提示", value=ID_WORKER_UNAVIABLE,                                   parent=self.bmp,max=100000000,min=ID_WORKER_UNAVIABLE)for knew_id in self.knew_id:if knew_id == self.id:self.id = ID_WORKER_UNAVIABLEwx.MessageBox(message="工号已存在,请重新输入", caption="警告")

其中ID_WORKER_UNAVIABLE是id的初始化值-1,不可用,self.knew.id是从数据库里加载出来的id列表,如果id非法(已重复或者不在0~100000000,就会一直有新的弹窗来提示输入id。

再比如对多张人脸时、只处理距离屏幕最近的员工的面部信息:

if len(dets) != 0:biggest_face = dets[0]#取占比最大的脸maxArea = 0for det in dets:w = det.right() - det.left()h = det.top()-det.bottom()if w*h > maxArea:biggest_face = detmaxArea = w*h

dets是侦测到的所有面部数组,biggest_face是距离屏幕最近的面部。

本次课设的完整过程如下:选了员工刷脸考勤系统以后,我和小组成员查阅了大量资料,了解到dlib这个库,于是我们利用dlib库自带的人脸预测器、特征提取器,然后计算128d特征来完成人脸识别,再加上我们之前构想的逻辑,大致完成了课设,由于完成得早,我们大致在课设安排时间的一半时就给老师检查,虽然基本要求和拓展要求都已经实现,但是还有许多可以完善的地方,老师给出了许多宝贵的意见:
(1)把数据保存的地方由csv文件改成数据库。
(2)减少弹出式界面,用frame替换的方式解决之。
(3)刷脸打卡的界面不需要打卡者交互,全自动打卡。
最后检查的时候这些问题都被解决了。

程序框图:

本程序的设计思想大致可分为以下几个方面
(1)面向对象的原则,整个程序的主体就是一个WAS(WorkAttendanceSystem)类,所有的实现都围绕这个类展开。
(2)界面和数据逻辑分离的原则,WAS类的初始化过程包括界面的初始化和数据初始化,两者相互独立。
(3)代码封装原则,多次调用的语句集写成接口供调用,没有冗余的代码。
接口隔离原则:使用多个专门的接口,而不是使用单一的总接口。

3 详细设计

函数清单
注:所有类内的函数的第一个参数为self,表明该函数属于该类,后面不再赘述

(1)def init(self)
WAS类的构造函数,主要是完成一些初始化操作,如初始化菜单、信息打印面板、主展示面板以及初始化加载数据库、初始化循环使用的变量。

(2)def initMenu(self):
完成菜单的初始化显示,点击事件绑定。

(3)def initInfoText(self):
完成左边信息提示面板的初始化显示。

(4)def initGallery(self):
完成右边主展示面板的初始化显示。

(5)def initDatabase(self):
数据库的初始化,建立数据库连接(如果数据库inspurer.db不存在则先新建),如果数据库中不存在员工信息worker_info和考勤logcat这两个表,则依次创建。

(6)def loadDataBase(self,type):
该模块函数完成从数据库读取数据的操作,包括读取员工信息和考勤信息,第二个参数type用于标识是加载员工信息还是考勤信息,一方面,可以统一接口,打开数据库和得到游标、关闭连接是一样的,将两个读取接口合二为一,提高代码复用度;另一方面,可以减少加载的工作量,减少IO,提高程序运行速度;最后,因为读取信息前对上一次读取的信息列表做了清空处理,用type标识可以避免读取一个表时对另一个表造成的误操作。

(7)def insertARow(self,Row,type):
该模块函数完成写数据库操作,第二个参数为准备写的一条记录,第三个参数type表示要对哪一个表进行写操作。

(8)def adapt_array(self,arr):
将提取的人脸特征信息(列表)压缩,入口参数就是待压缩的数据,出口参数是压缩后的数据,用于写入数据库。

(9)def convert_array(self,text):
将读取出来的数据解压缩成人脸特征信息,入口参数是待解压得数据,出口参数是解压后的数据。

(10)def return_euclidean_distance(feature_1, feature_2):
计算两个人脸的欧式距离,入口参数是两个人脸的特征数据,出口参数是判定的结果,欧式距离大于0.4判为不同,不大于判为相同。

(11)def OnNewRegisterClicked(self,event):
见名知义,菜单新建录入的监听事件,参数event为事件信息,其他几个菜单(OnFinishRegisterClicked,OnStartPunchCardClicked,OnEndPunchCardClicked,OnOpenLogcatClicked,OnCloseLogcatClicked)类似,在此不再赘述。

(12)def getDateAndTime(self):
得到当前日期和时间,并组装成特定格式作为出口参数返回。

函数调用关系:箭头指向被调用者

4 效果展示





5 实验心得

遇到的问题及解决办法:

(1)opencv自带的视频窗口不支持太多的UI扩展,怎么把视频流嵌到自定义的界面上去是一个棘手的问题,于是我想到了实现实时截图,然后把图片显示到面板上去,这里有一个延时的问题,opencv只允许整秒整秒地设置延时时间,设置成0s,程序会卡死,只好设置成1s,于是我们看到的‘视频流’会有少许的延时和卡顿,后面看到opencv还有一个设置刷新率fps的接口,但是尝试了也没用,估计和延时有冲突,最最后面只好开了一个子线程来做这些处理,防止主线程阻塞。

(2) 识别人脸的时候如果有多张人脸入境,最开始我是只取所有识别到的人脸的第一张人脸,但是无法保证在许多时刻点都是同一个人脸,因此做了改进,取距离屏幕最近的人脸,具体做法是求最大的人脸面积,一般来说距离屏幕越近面积越大。

(3)其他的大都是编写程序过程中遇到的问题,比如什么中文设置问题,变量没有按照预期演化,这个时候,一般百度或者google,在csdn或者stackoverflow能找到解决办法,或者在pycharm开启debug模式,追踪变量等,在此不在赘述。

总而言之,此员工考勤系统最核心的就是人脸识别,在此我直接用的是python 第三方库dlib自带的人脸预测器、特征提取器,对于同一人多份特征的处理也仅仅是取平均脸而已,平均脸的缺点有
(1)受环境影响大,如果在光线弱的环境录入人脸,在光线好的地方可能就会出现识别错误,但是这个问题可以用取光线弱和光线好的环境下的人脸取平均来解决,显然比较麻烦。
(2)计算量比较大,每一条特征有128个数据,10张截图求平均就有1280次加法和128次除法。
而利用卷积神经网络来实现人脸识别可以有效地提高人脸识别准确度,后续我将学习用卷积神经网络和聚类来构建训练模型。
比如模型训练阶段

其中神经网络部分:

然后根据模型去识别人脸,最高识别准确率可达99%以上。

6 项目源码

#coding=utf-8
import wx
import wx.grid
import sqlite3
from time import localtime,strftime
import os
from skimage import io as iio
import io
import zlib
import dlib  # 人脸识别的库dlib
import numpy as np  # 数据处理的库numpy
import cv2  # 图像处理的库OpenCv
import _thread
ID_NEW_REGISTER = 160
ID_FINISH_REGISTER = 161
ID_START_PUNCHCARD = 190
ID_END_PUNCARD = 191
ID_OPEN_LOGCAT = 283
ID_CLOSE_LOGCAT = 284
ID_WORKER_UNAVIABLE = -1
PATH_FACE = "data/face_img_database/"
# face recognition model, the object maps human faces into 128D vectors
facerec = dlib.face_recognition_model_v1("model/dlib_face_recognition_resnet_model_v1.dat")
# Dlib 预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('model/shape_predictor_68_face_landmarks.dat')
def return_euclidean_distance(feature_1, feature_2):feature_1 = np.array(feature_1)feature_2 = np.array(feature_2)dist = np.sqrt(np.sum(np.square(feature_1 - feature_2)))print("欧式距离: ", dist)if dist > 0.4:return "diff"else:return "same"
class WAS(wx.Frame):def __init__(self):wx.Frame.__init__(self,parent=None,title="员工考勤系统",size=(920,560))self.initMenu()self.initInfoText()self.initGallery()self.initDatabase()self.initData()def initData(self):self.name = ""self.id =ID_WORKER_UNAVIABLEself.face_feature = ""self.pic_num = 0self.flag_registed = Falseself.puncard_time = "09:00:00"self.loadDataBase(1)def initMenu(self):menuBar = wx.MenuBar()  #生成菜单栏menu_Font = wx.Font()#Font(faceName="consolas",pointsize=20)menu_Font.SetPointSize(14)menu_Font.SetWeight(wx.BOLD)registerMenu = wx.Menu() #生成菜单self.new_register = wx.MenuItem(registerMenu,ID_NEW_REGISTER,"新建录入")self.new_register.SetBitmap(wx.Bitmap("drawable/new_register.png"))self.new_register.SetTextColour("SLATE BLUE")self.new_register.SetFont(menu_Font)registerMenu.Append(self.new_register)self.finish_register = wx.MenuItem(registerMenu,ID_FINISH_REGISTER,"完成录入")self.finish_register.SetBitmap(wx.Bitmap("drawable/finish_register.png"))self.finish_register.SetTextColour("SLATE BLUE")self.finish_register.SetFont(menu_Font)self.finish_register.Enable(False)registerMenu.Append(self.finish_register)puncardMenu = wx.Menu()self.start_punchcard = wx.MenuItem(puncardMenu,ID_START_PUNCHCARD,"开始签到")self.start_punchcard.SetBitmap(wx.Bitmap("drawable/start_punchcard.png"))self.start_punchcard.SetTextColour("SLATE BLUE")self.start_punchcard.SetFont(menu_Font)puncardMenu.Append(self.start_punchcard)self.end_puncard = wx.MenuItem(puncardMenu,ID_END_PUNCARD,"结束签到")self.end_puncard.SetBitmap(wx.Bitmap("drawable/end_puncard.png"))self.end_puncard.SetTextColour("SLATE BLUE")self.end_puncard.SetFont(menu_Font)self.end_puncard.Enable(False)puncardMenu.Append(self.end_puncard)logcatMenu = wx.Menu()self.open_logcat = wx.MenuItem(logcatMenu,ID_OPEN_LOGCAT,"打开日志")self.open_logcat.SetBitmap(wx.Bitmap("drawable/open_logcat.png"))self.open_logcat.SetFont(menu_Font)self.open_logcat.SetTextColour("SLATE BLUE")logcatMenu.Append(self.open_logcat)self.close_logcat = wx.MenuItem(logcatMenu, ID_CLOSE_LOGCAT, "关闭日志")self.close_logcat.SetBitmap(wx.Bitmap("drawable/close_logcat.png"))self.close_logcat.SetFont(menu_Font)self.close_logcat.SetTextColour("SLATE BLUE")logcatMenu.Append(self.close_logcat)menuBar.Append(registerMenu,"&人脸录入")menuBar.Append(puncardMenu,"&刷脸签到")menuBar.Append(logcatMenu,"&考勤日志")self.SetMenuBar(menuBar)self.Bind(wx.EVT_MENU,self.OnNewRegisterClicked,id=ID_NEW_REGISTER)self.Bind(wx.EVT_MENU,self.OnFinishRegisterClicked,id=ID_FINISH_REGISTER)self.Bind(wx.EVT_MENU,self.OnStartPunchCardClicked,id=ID_START_PUNCHCARD)self.Bind(wx.EVT_MENU,self.OnEndPunchCardClicked,id=ID_END_PUNCARD)self.Bind(wx.EVT_MENU,self.OnOpenLogcatClicked,id=ID_OPEN_LOGCAT)self.Bind(wx.EVT_MENU,self.OnCloseLogcatClicked,id=ID_CLOSE_LOGCAT)def OnOpenLogcatClicked(self,event):self.loadDataBase(2)grid = wx.grid.Grid(self,pos=(320,0),size=(600,500))grid.CreateGrid(100, 4)for i in range(100):for j in range(4):grid.SetCellAlignment(i,j,wx.ALIGN_CENTER,wx.ALIGN_CENTER)grid.SetColLabelValue(0, "工号") #第一列标签grid.SetColLabelValue(1, "姓名")grid.SetColLabelValue(2, "打卡时间")grid.SetColLabelValue(3, "是否迟到")grid.SetColSize(0,100)grid.SetColSize(1,100)grid.SetColSize(2,150)grid.SetColSize(3,150)grid.SetCellTextColour("NAVY")for i,id in enumerate(self.logcat_id):grid.SetCellValue(i,0,str(id))grid.SetCellValue(i,1,self.logcat_name[i])grid.SetCellValue(i,2,self.logcat_datetime[i])grid.SetCellValue(i,3,self.logcat_late[i])passdef OnCloseLogcatClicked(self,event):self.initGallery()passdef register_cap(self,event):# 创建 cv2 摄像头对象self.cap = cv2.VideoCapture(0)# cap.set(propId, value)# 设置视频参数,propId设置的视频参数,value设置的参数值# self.cap.set(3, 600)# self.cap.set(4,600)# cap是否初始化成功while self.cap.isOpened():# cap.read()# 返回两个值:#    一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾#    图像对象,图像的三维矩阵flag, im_rd = self.cap.read()# 每帧数据延时1ms,延时为0读取的是静态帧kk = cv2.waitKey(1)# 人脸数 detsdets = detector(im_rd, 1)# 检测到人脸if len(dets) != 0:biggest_face = dets[0]#取占比最大的脸maxArea = 0for det in dets:w = det.right() - det.left()h = det.top()-det.bottom()if w*h > maxArea:biggest_face = detmaxArea = w*h# 绘制矩形框cv2.rectangle(im_rd, tuple([biggest_face.left(), biggest_face.top()]),tuple([biggest_face.right(), biggest_face.bottom()]),(255, 0, 0), 2)img_height, img_width = im_rd.shape[:2]image1 = cv2.cvtColor(im_rd, cv2.COLOR_BGR2RGB)pic = wx.Bitmap.FromBuffer(img_width, img_height, image1)# 显示图片在panel上self.bmp.SetBitmap(pic)# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arrshape = predictor(im_rd, biggest_face)features_cap = facerec.compute_face_descriptor(im_rd, shape)# 对于某张人脸,遍历所有存储的人脸特征for i,knew_face_feature in enumerate(self.knew_face_feature):# 将某张人脸与存储的所有人脸数据进行比对compare = return_euclidean_distance(features_cap, knew_face_feature)if compare == "same":  # 找到了相似脸self.infoText.AppendText(self.getDateAndTime()+"工号:"+str(self.knew_id[i])+" 姓名:"+self.knew_name[i]+" 的人脸数据已存在\r\n")self.flag_registed = Trueself.OnFinishRegister()_thread.exit()# print(features_known_arr[i][-1])face_height = biggest_face.bottom()-biggest_face.top()face_width = biggest_face.right()- biggest_face.left()im_blank = np.zeros((face_height, face_width, 3), np.uint8)try:for ii in range(face_height):for jj in range(face_width):im_blank[ii][jj] = im_rd[biggest_face.top() + ii][biggest_face.left() + jj]# cv2.imwrite(path_make_dir+self.name + "/img_face_" + str(self.sc_number) + ".jpg", im_blank)# cap = cv2.VideoCapture("***.mp4")# cap.set(cv2.CAP_PROP_POS_FRAMES, 2)# ret, frame = cap.read()# cv2.imwrite("我//h.jpg", frame)  # 该方法不成功# 解决python3下使用cv2.imwrite存储带有中文路径图片if len(self.name)>0:cv2.imencode('.jpg', im_blank)[1].tofile(PATH_FACE + self.name + "/img_face_" + str(self.pic_num) + ".jpg")  # 正确方法self.pic_num += 1print("写入本地:", str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg")self.infoText.AppendText(self.getDateAndTime()+"图片:"+str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg保存成功\r\n")except:print("保存照片异常,请对准摄像头")if  self.new_register.IsEnabled():_thread.exit()if self.pic_num == 10:self.OnFinishRegister()_thread.exit()def OnNewRegisterClicked(self,event):self.new_register.Enable(False)self.finish_register.Enable(True)self.loadDataBase(1)while self.id == ID_WORKER_UNAVIABLE:self.id = wx.GetNumberFromUser(message="请输入您的工号(-1不可用)",prompt="工号", caption="温馨提示",value=ID_WORKER_UNAVIABLE,parent=self.bmp,max=100000000,min=ID_WORKER_UNAVIABLE)for knew_id in self.knew_id:if knew_id == self.id:self.id = ID_WORKER_UNAVIABLEwx.MessageBox(message="工号已存在,请重新输入", caption="警告")while self.name == '':self.name = wx.GetTextFromUser(message="请输入您的的姓名,用于创建姓名文件夹",caption="温馨提示",default_value="", parent=self.bmp)# 监测是否重名for exsit_name in (os.listdir(PATH_FACE)):if self.name == exsit_name:wx.MessageBox(message="姓名文件夹已存在,请重新输入", caption="警告")self.name = ''breakos.makedirs(PATH_FACE+self.name)_thread.start_new_thread(self.register_cap,(event,))pass

7 最后

【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统相关推荐

  1. OpenCV+ Qt Designer 开发人脸识别考勤系统

    文章目录 1. 系统介绍 2. 系统架构 3. 开发步骤 3.1 安装必要的库 3.2 设计用户界面 3.3 编写代码 3.3.1 导入库 3.3.2 连接数据库 3.3.3 定义主窗口类 3.3.4 ...

  2. 基于JSP/SERVLET实现的人脸识别考勤系统

    人脸识别考勤系统使用说明书 此系统是人脸识别考勤系统的后台管理系统,考勤数据从人脸识别机器上获取,自动识别员工信息记录考勤.系统基于JSP/SERVLET来开发实现,开发工具采用IDEA或ECLIPS ...

  3. 基于深度卷积神经网络的人脸识别考勤系统-VGG-PYTHON-QT(1)

    本项目设计并实现了一个应用于小型企业员工考勤的刷脸考勤系统,整个系统使用Python语言开发,并利用Pyqt5作为桌面端系统界面的开发工具,以SQL Server作为数据库管理系统,最终集成所有刷脸考 ...

  4. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  5. python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...

  6. 基于OpenCV的人脸识别考勤系统

    考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...

  7. (开源)简单的人脸识别考勤系统(python+opencv+dilb)

    简单的毕业设计,python+opencv+dlib,注意配置环境,打开工程文件直接运行.演示视频前往B站(开源)人脸识别签到系统_哔哩哔哩_bilibili 源文件及使用说明百度网盘下载链接: ht ...

  8. 基于opencv和pillow实现人脸识别系统(附demo)

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net 茂名一技http://www.enechn.com p ...

  9. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

最新文章

  1. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)
  2. Android常用逆向工具总结(未完待续)
  3. stdthread(2)创建
  4. man iptables by iptables-save v1.3.5
  5. 活动的批输入监控ENV
  6. PHP下操作Linux消息队列完成进程间通信的方法
  7. Cell重磅综述:关于人类转录因子,你想知道的都在这
  8. 提高代码的运行效率(1)
  9. 连设计图都不会画,你还想做“系统架构师”?
  10. 唯一标识 微信小程序_微信小程序中用户唯一ID的获取
  11. 手机怎么下载python呢_安卓手机端怎么安装Python?
  12. 感性负载与容性负载的区别
  13. 这次,多地消防控制室双人值守可变单人值守
  14. dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
  15. c++ 11 for循环
  16. 基于JAVA视频点播系统计算机毕业设计源码+系统+lw文档+部署
  17. 如何卸载有密码保护的Symantec Endpoint Protection v11
  18. HTML卡片式布局源码,html5自适应卡片式设计动态加载整站源码_
  19. 学计算机专业还是数学专业课,数学专业的数学和计算机专业的数学的比较.doc...
  20. 我们的时间去了哪里?

热门文章

  1. html在线转换swf,swf格式转换成html(Swf format conversion HTML).doc
  2. 绿坝其实是死在了自己手里
  3. JSP使用Websocket技术实现聊天功能--H5网页前端部分(二)
  4. Topographic Laser Ranging and Scanning_Principles and Processing——第一章 1.4
  5. 11 个对开发有帮助的 JS 技巧,进收藏夹当小词典吧!
  6. Postman:测试下载文件时默认打开文件改为弹出下载框
  7. 分享5款电脑办公软件让工作更方便
  8. Linux tasklet
  9. python爬虫系列--小练爬取花田首页源码
  10. C语言 一维数组、二维数组的创初始化、使用和存储