看了标题有点蒙?没关系其实就是基于野生ubuntu20.04的树莓派镜像结合人脸识别库face_recognition库 ,opencv库和其它库操控SG90舵机及打印出来的舵机云台实现的人脸识别和云台追踪。在过程中遇见ubuntu 引脚库权限问题,也一并解决了。
过程不易请多多点赞啊
树莓派
usb摄像头
SG90舵机两个
杜邦线
舵机云台(可以根据教程3d打印也可以去某宝买一个)
这过程可谓一波三折啊,翻车不断接下来请欣赏翻车集锦。
我的理想
现实
第一次打印成品
不能称之为成品,根本看不出来是啥。 分析问题是切片导出时出现了问题 而且第一次的时候厚度只打了1毫米还是两毫米。最后就是这东西。
第二次打印
看起来有点像模像样 其实根本就不合身,把舵机放上去就像让小孩子穿大人衣服一样 根本不合适啊喂。
第三次成品 看起来还行 但是在长度宽度还是有1-2毫秒的偏差
这张图可以看见舵机底部并没有贴紧
舵机:“我被架空了”
其实这样的建模打印我已经重复了6-7次 只是有些并没有留下照片。
后来我换了个云台复刻
最后成品
(摄像头是之前使用过的 上面是热熔胶)
事后我对这件事进行了反思 我没有系统的学习过建模 使用的是123D来建模。而关于SG90的参数网上参差不齐,云台并不大,1-2毫米的偏差这套材料就报废了,所以最开始都是手动测量,本身就存在极大误差。关于建模我肯定会进行系统的学习,如果有机会后续我也会出相关教程,请关注我的博客。
是不是好奇为什么建模技术突飞猛进?因为网上有这个舵机的3D模型我直接拿来打印了哈哈哈哈。如果有需要模型的请私信我。
这里不得不提到这个重要的库
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()
需要完整代码请私聊我或者对我上传的资源进行下载。
如果你也是用的野生ubuntu镜像 可能会出现运行人脸识别及操控舵机文件时
如果用
python3 filename
则报错 RPi.GPIO无权限
如果用
python3 filename
则出现找不到视频流的问题
这里我已经解决问题 请参考我的博客
树莓派ubuntuRPi.GPIO库权限问题
部分图片来源于网络
csdn无法上传视频 但是本人以及验证过 虽然在运动控制中并不是特别完美,但用来练手也是很有成就感的,如果在过程中出现问题欢迎留言或者私信我。