本期测评基于opencv来进行一个人脸识别测评。模型是我在网上找的一个开源现成的我会在最后把模型和工程分享给大家。开发板烧录的是Ubuntu系统,得益于Ubuntu下载一些包非常容易且快我们能快速搭建好开发环境。我这里是输入图片,输出人脸识别检测结果的图片。如果自己编译过内核源码可以把摄像头驱动适配上,就可以用摄像头在线检测,我这里由于不想从新编译一个SD的系统,就直接使用官方给的Ubuntu镜像了。SD卡镜像烧录方法请参考官方教程:SD 卡镜像烧录 | LUCKFOX WIKI
下面开始正文,官方给的Ubuntu系统是给了python支持的,我们可以输入下面的命令看看python的版本
python3 --version
我是打算用python来写这个 程序的,因为python代码简单易懂
用python来写opencv就必须要下载opencv的python支持包,我们使用下面的命令来下载
sudo apt update
sudo apt install python3-opencv
我这里已经下载好了。接下来就可以进行人脸识别的代码编写了。
我们新建一个model文件用来装我们的模型,将模型文件放到这个文件夹里面。
然后新建一个picture文件夹装我们的人脸照片。我从网上找了两张人脸的图,他们本来是如下所示:
我们新建一个detect.py文件用来存放我们代码,代码如下所示
import cv2
#加载训练模型
face_detect=cv2.CascadeClassifier(r"./model/lbpcascade_frontalface_improved.xml")
#读取摄像头画面
img=cv2.imread("./picture/face.jpg")
#视频图片经过灰色处理后只有黑白两种颜色,像素的位置并不会改变,便于像素识别
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#进行人脸检测
output_face = face_detect.detectMultiScale(img_gray,scaleFactor=1.02,minNeighbors=5)#将检测图片放大1.02倍,构成检测目标的相邻矩形的最小个数(默认为3个),这里设置了5个。
#判断是否有人脸
if len(output_face):
for x,y,w,h in output_face:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imwrite("output_face,jpg",img)#保存图片
print("图片保存成功")
因为python是解释性语言,代码编写好后我们直接用python3执行,如下所示
这样我们就可以再当前文件夹查看结果了
我们打开着两张图片看一下结果如何
效果看起来还不错。这里我会把我的工程分享给大家。
如果实现了摄像头驱动的朋友可以试试下面的代码,下面的代码我在树莓派上跑过,亲测有效,跑的结果不是很好,有点卡,就是不知道在幸狐上跑的效果如何。当然处理方式和上面一样。
import cv2
import time
#加载训练模型
face_detect=cv2.CascadeClassifier(r"./model/lbpcascade_frontalface_improved.xml")
cap=cv2.VideoCapture(0)
while cap.isOpened():
#读取摄像头画面
frla,img=cap.read()
#画面翻转y轴
img=cv2.flip(img,1)
#视频图片经过灰色处理后只有黑白两种颜色,像素的位置并不会改变,便于像素识别
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#进行人脸检测
faces = face_detect.detectMultiScale(
img_gray, #进行检测的灰度图片
scaleFactor=1.02,#将检测图片放大1.02被
minNeighbors=5)#表示构成检测目标的相邻矩形的最小个数(默认为3个),这里设置了5个。
#判断是否有人脸
if len(faces):
#遍历检测到的人脸
for x,y,w,h in faces:
#绘制人脸矩形框
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
if cv2.waitKey(30) & 0xff == ord('q'):
break
if cv2.waitKey(30)&0xff == ord('s'):#按s键保存图片
timer=time.time()#获取时间戳
name=str(int(timer))+".jpg"#将时间戳转换成字符串类型和.jpg拼接,用作下一步的保存图片的名字
cv2.imwrite(name,img)#保存图片
print("图片保存成功")
#显示人脸
cv2.imshow("face",img)
#释放摄像头
cap.release()
#销毁窗口
cv2.destroyAllWindows()
总结:通过本期测评成功的使用Luckfox幸狐 RV1106开发板实现了人脸识别,从照片的结果来看实现的还算精准。
附件: