opencv库几个内置函数的功能和使用

本次分享的是一个可以用于毕业设计参考的人脸识别项目,由fjnuthomas分享。如果有做人脸识别毕设的同学,可以在此基础上,做更深入的研究,源码下载方式见文末。下面是设计步骤:  硬件及环境:
树莓派3b v1.2
摄像头罗技c170
树莓派系统:bullseye
python 3.9.2
opencv-python 4.5.3.56
opencv-contrib-python 4.5.3.56
numpy 1.21.0
关于树莓派安装opencv的步骤,可以参考下面这篇博文:
https://blog.csdn.net/m0_46190150/article/details/121501093
 人脸检测
我们实现人脸识别的前提事件是人脸检测,只有检测到人脸,才能够收集到人脸的数据。我们用的是opencv自带的分类器:
haarcascade_frontalface_default.xml  代码实现:
import cv2facecascade = cv2.cascadeclassifier('cascades/haarcascade_frontalface_default.xml')        cap = cv2.videocapture(0) cap.set(3, 640) # set weight        cap.set(4, 480)  # set height while true: ret, img = cap.read() img = cv2.flip(img, 1) #如果摄像头倒置,将1改成-1 gray = cv2.cvtcolor(img, cv2.color_bgr2gray) faces = facecascade.detectmultiscale(                gray, scalefactor=1.2,                minneighbors=5, minsize=(20, 20) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray[y:y + h, x:x + w]                roi_color = img[y:y + h, x:x + w] cv2.imshow('video', img) k = cv2.waitkey(30) & 0xff if k == 27: # esc for quit break cap.release() cv2.destroyallwindows()  在python3下运行如上代码可以完成人脸检测的功能。  
 图像采集
人脸识别的本质其实就是构建一个人脸信息的数据库,电脑比对摄像头采集到的人脸信息和数据库中存放的数据,从而得到一个比对的结果。 图像采集需要我们在.py文件同目录下新建一个文件夹,用于存放采集得到的图片。
mkdir data  采集得到的图片越多,构建的数据库越完善,判断成功的概率也越高,但图片太多同样会降低比对时的速度。 我这里是设置了每0.2s拍一张照片,按ecs或拍满40张照片时退出。
k = cv2.waitkey(200) & 0xff # esc退出and每0.2s拍一张 if k == 27: break elif count >= 40: # 拍40张照片 break  图像采集示例(这边需要我们在终端输入id号,我这边输入4) 采集得到的图片:  
 开始训练
训练是opencv人脸识别的重中之重。opencv为我们提供了多个内置函数,调用这些函数能够帮助我们训练得到自己的训练集这边我采用的是:
recognizer.train()  在开始训练之前,我们需要新建一个空目录用于存放得到的模型:
mkdir trainer  模型保存为.xml文件,要注意我们的代码是在树莓派下跑的,在树莓派下recognizer.write()是不能够使用的,因此我们用:
recognizer.write('trainer/trainer.yml')  进行保存,训练成功实例    
 人脸识别
通过了前三个步骤,我们已经有了一个在data文件夹中保存采集到的图像、在trainer文件夹中保存自己训练的trainer.xml模型的文件了,我们就进入到了最后一步,也就是传说中的人脸识别了。人脸识别实例: 可以看到,系统识别出我有73%的概率是彭于晏,识别的成功率还是很高的、关于输出名字的问题,在代码的这个部分:
id = 0 names = ['none', 'pengyuyan', 'xsy', 'rhy']我们可以在这里修改成自己想要的名字,在代码中还有这样的部分:
id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) # 判断成功概率>45时,输出id,否则输出unknow if (confidence < 55):      id = names[id]       confidence =   {0}%.format(round(100 - confidence)) else:          id = unknown          confidence =   {0}%.format(round(100 - confidence))  用于修改自己想要的判断概率。 到这里我们的人脸识别就基本完成了。  
 总结
通过本项目,可以获得以下技能:
学会树莓派的配置,并在树莓派上配置了环境
对opencv库有了个基本的了解,熟悉几个内置函数的功能和使用
对linux有了更深刻的理解
增加了python能力
不足之处: 在调试的过程中,发现在树莓派上运行项目还是有比较明显的卡顿的,因此有对代码进行优化的想法,查阅资料以后了解到了有一个东西叫做pypy,尝试过用pypy对文件进行编码,奈何写的代码是基于python3.9,和当前的pypy版本不太匹配,只好暂时作罢。在之后应该会尝试进行一次重新编译,感兴趣的同学可以尝试看看。


ST发布基于ARM内核的移动平台专用PGI OpenCL开发框架
越拍越AI拍!汇威AICALL V9手机拍摄功能测评
如何提高I2C调试效率?
气密性检测仪设备有哪些主要用途和使用领域
制动单元的工作原理_制动单元的作用
opencv库几个内置函数的功能和使用
内存条如何安装与拆卸
共模电压是什么意思_共模电压怎么算
嵌入式系统C语言位操作的移植与优化
传日本Rapidus将为加拿大公司代工2nm AI芯片
并联电路中总电阻与分电阻的关系 并联电路电流分配规律
抢跑6G,美国联邦通信委员会公布6G试验频率段!
单极性ADC的输入范围和配置介绍
万物互联时代:盘点人机交互四大变革浪潮
国网投资1128亿元特高压建设项目
三星讲解红米AMOLED屏幕:最低蓝光比例仅为LCD的三分之一
T3出行首创V.D.R安全防护系统
下午发布的荣耀V9将更名荣耀8 Pro亮相MWC
奖员工3万搬迁费 小米“南飞”真相:深化武汉南京两大中心
智能家居使用IoTwebOS:物联网与浏览器的完美结合!