从3D打印到python编程,从opencv到人脸识别,从win10到树莓派ubuntu。全教程附代码。


前言

看了标题有点蒙?没关系其实就是基于野生ubuntu20.04的树莓派镜像结合人脸识别库face_recognition库 ,opencv库和其它库操控SG90舵机及打印出来的舵机云台实现的人脸识别和云台追踪。在过程中遇见ubuntu 引脚库权限问题,也一并解决了。


过程不易请多多点赞啊

一、材料

树莓派
usb摄像头
SG90舵机两个
杜邦线
舵机云台(可以根据教程3d打印也可以去某宝买一个)

二、3D打印舵机云台

这过程可谓一波三折啊,翻车不断接下来请欣赏翻车集锦。
我的理想
在这里插入图片描述

现实
第一次打印成品
不能称之为成品,根本看不出来是啥。 分析问题是切片导出时出现了问题 而且第一次的时候厚度只打了1毫米还是两毫米。最后就是这东西。
在这里插入图片描述

第二次打印
看起来有点像模像样 其实根本就不合身,把舵机放上去就像让小孩子穿大人衣服一样 根本不合适啊喂。
在这里插入图片描述
第三次成品 看起来还行 但是在长度宽度还是有1-2毫秒的偏差
在这里插入图片描述

这张图可以看见舵机底部并没有贴紧
舵机:“我被架空了”
在这里插入图片描述
其实这样的建模打印我已经重复了6-7次 只是有些并没有留下照片。
后来我换了个云台复刻
在这里插入图片描述

最后成品
(摄像头是之前使用过的 上面是热熔胶)
在这里插入图片描述
在这里插入图片描述


事后我对这件事进行了反思 我没有系统的学习过建模 使用的是123D来建模。而关于SG90的参数网上参差不齐,云台并不大,1-2毫米的偏差这套材料就报废了,所以最开始都是手动测量,本身就存在极大误差。关于建模我肯定会进行系统的学习,如果有机会后续我也会出相关教程,请关注我的博客。
是不是好奇为什么建模技术突飞猛进?因为网上有这个舵机的3D模型我直接拿来打印了哈哈哈哈。如果有需要模型的请私信我。

三、人脸识别 结合opencv显示

这里不得不提到这个重要的库
face_recognition
这是它在pypi上的主页

pypi:face_recognition
具体使用方法在主页都有介绍

再结合opencv来调用视频,展示视频及结果。

这里我训练了两个人脸。照片是x1 y1。
然后为了对程序进行了测试
我又找来了被遮挡的人脸,戴口罩的人脸,部分人脸进行测试
发现如果对人脸有部分遮挡是无法识别的,如果是半张脸也很难识别。
在这里插入图片描述

四、代码

部分代码参考官网github的例子。
这里附上树莓派引脚图

在这里插入图片描述代码分为六部分
1操控舵机
2人脸训练及识别
3人脸框选
4视频展示
5舵机移动
6释放资源
1 操控舵机 这里我使用的是BOARD的编码格式 信号引脚接的12和32号引脚

def setServo(servo,angle):#每次传舵机引脚和角度
        print('servo is work')
        print('servo:%s,oldangle%s'%(servo,angle))
        GPIO.setmode(GPIO.BOARD)
        GPIO.setwarnings(False)
        GPIO.setup(servo,GPIO.OUT)
        p=GPIO.PWM(servo,50)
        p.start(0)
        p.ChangeDutyCycle(2.5+angle/360*20)
        time.sleep(0.2)
        p.stop()
        GPIO.cleanup()

2人脸训练及识别

yuan_image = face_recognition.load_image_file("y1.jpg")
yuan_face_encoding = face_recognition.face_encodings(yuan_image)[0]
# 训练promis照片
promise_image = face_recognition.load_image_file("x1.jpg")
promise_face_encoding = face_recognition.face_encodings(promise_image)[0]
known_face_encodings = [
    yuan_face_encoding,
    promise_face_encoding
]
known_face_names = [
    "yuan",
    "promise"
]

这里训练了两个人脸并起名一个是yuan 一个是promise。

3框选人脸并显示识别的人名

cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

4视频展示 这需要调用opencv

 ret, frame = video_capture.read()
 ret=video_capture.set(3,640)
 ret=video_capture.set(4,480)

这是部分代码我把视频规定了大小。

5关于舵机运动规划
我这里选取中间部分并取了5%的缓冲部分 每次发现偏差移动一个角度。

 if 72<=left/4<=160 and right/4<=88<=160:
           pass
        else:
            if left/4 <=71:
                angleBOTTOM+=1
            else:
                angleBOTTOM-=1
        setServo(12,angleBOTTOM)
        
 if 54<=top/4<=120 and bottom/4<=66<=120:
                pass
        else:
                if top/4<=53:
                    angleTOP-=1
                else:
                    angleTOP+=1
        setServo(32,angleTOP)


6最后一定一定不要忘了关闭窗口释放资源。

 if cv2.waitKey(1) & 0xFF == ord('q'):
        break
video_capture.release()
cv2.destroyAllWindows()

需要完整代码请私聊我或者对我上传的资源进行下载。

五、RPi.gpio权限问题

如果你也是用的野生ubuntu镜像 可能会出现运行人脸识别及操控舵机文件时
如果用

python3 filename

则报错 RPi.GPIO无权限

如果用

python3 filename

则出现找不到视频流的问题
这里我已经解决问题 请参考我的博客
树莓派ubuntuRPi.GPIO库权限问题


总结

部分图片来源于网络
csdn无法上传视频 但是本人以及验证过 虽然在运动控制中并不是特别完美,但用来练手也是很有成就感的,如果在过程中出现问题欢迎留言或者私信我。