树莓派简易人脸追踪云台

2023-05-16

前言:

这篇文章属于此系列:

一个用树莓派做的会聊天,能人脸识别(支持云台追踪)和发送邮件的小玩具

https://blog.csdn.net/yonglisikao/article/details/82804318

硬件

树莓派及基本配件,摄像头(Picamera或Webcam),双舵机小云台

语言

Python

云台控制

请参考这篇文章:

http://shumeipai.nxez.com/2018/06/21/pan-tilt-multi-servo-control.html

算法设计

我想到的算法是:

1.拍一张照片;

2.确定照片里脸的中心到照片中心的水平和垂直距离;

3.照片里的距离与实际的角度有一定的对应关系,根据这个关系得到相应的角度;

4.控制云台转动相应的角度,实现人脸追踪。

算法实现

脸位置的确定:使用face_recognition库里的face_locations()函数,这个函数在我的其他文章里介绍过,它能够返回一个元组类型的数据,具体信息是这样的:(上,右,下,左)到图片右上顶点的距离,单位是像素。分别把上下和左右取平均即得到脸中心的位置。

对应关系的确定:因为我们要实现简易的人脸追踪,所以对精度要求不高。假设它们是线性关系,即

α(角度) = k(比例系数) * d(距离)

然后我们来确定比例系数,如果你知道你使用的摄像头的视野角度,直接用视野角度除以照片的对应维度的像素点的数量即得到比例系数,即

k(比例系数) = β(视野角度) / D(对应维度的像素点的个数)

如果不知道,可以像我这样粗略估计一下

1.制作一个像下图这样的东西,像对准待测摄像头;

2.用待测摄像头拍一张照片,如下图;

3.根据拍摄的照片,像下图这样作图,并测出角度,我得到的视野角度大致是50°;

4.我用摄像头拍摄的照片的分辨率是640×480,因为我刚测的水平的视野角度,所以像素点的个数取640;

5.50 / 640 = 0.078125 就是所求的比例系数。

具体代码

需要注意,你可能会想在while语句前创建视频对象,然后在每次循环中读取一次,但是因为它实际上堆积了之前的数据,也就是说,它会读到很久之前的数据,而我们希望它读到实时的数据,所以我们只能在每次循环中都创建然后释放对象,这导致差不多一秒才能读取一次数据,将来或许可以想到其他办法来解决速度的问题。

# coding = utf-8
import face_recognition
import cv2
import RPi.GPIO as GPIO
import time

def setServoAngle(servo, angle):
    '''
    :param servo 控制舵机的引脚编号,这取决于你,我用的分别是17和27
    :param angle 舵机的位置,范围是:0到180,单位是度
    return: None
    '''
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)
    GPIO.setup(servo, GPIO.OUT)
    pwm = GPIO.PWM(servo, 50)
    pwm.start(8)
    dutyCycle = angle / 18. + 3.
    pwm.ChangeDutyCycle(dutyCycle)
    time.sleep(0.3)
    pwm.stop()
    GPIO.cleanup()


# 设置舵机的初始位置
x0, y0 = 80, 30
setServoAngle(27, x0)
setServoAngle(17, y0)

while True:
    # 创建视频对象,打开摄像头
    video_capture = cv2.VideoCapture(0)
    ret, pframe = video_capture.read()
    # 释放视频对象
    video_capture.release()
    frame = cv2.resize(pframe, (0, 0), fx=0.25, fy=0.25)  # 这里将分辨率缩小为1/4,故比例系数增大为4倍,现在是0.078125*4 = 0.3125
    output = frame[:, :, ::-1]
    
    # 确定脸的位置
    face_locations = face_recognition.face_locations(output)
    if face_locations:
        x = (face_locations[0][1] + face_locations[0][3])/2
        y = (face_locations[0][0] + face_locations[0][2])/2
        print(x, y)  # 输出脸中心到右上顶点的水平和垂直距离
    else:
        x, y = 80, 60  # 如果没有脸则让舵机保持不动,相当于脸在中央(这时的分辨率为160*120)
        # 计算出舵机应该移动的角度,正负与你舵机的安装方式有关
    dx = (80 - x) * 0.3125
    dy = -(60 - y) * 0.3125

    if abs(dx) >= 3:  # 设置一个阈值,当角度大于3时,才移动,避免舵机一直在原地抖动,下同
        x0 += dx
        if x0 > 180:  # 设置界限,超出范围不再转动,下同
            x0 = 180
        elif x0 < 0:
            x0 = 0
        setServoAngle(27, x0) # 水平方向的舵机控制
    
    if abs(dy) >= 3:  # 设置阈值
        y0 += dy
        if y0 > 180:
            y0 = 180
        elif y0 < 0:
            y0 = 0
        setServoAngle(17, y0)  # 垂直方向的舵机控制

总结

总体效果:准确度上还不错,速度上较慢。

代码

https://github.com/LoveThinkinghard/Raspibot

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派简易人脸追踪云台 的相关文章

  • Vuex 学习

    什么是vuex xff1a 专门在Vue中实现集中式状态 xff08 数据 xff09 管理的一个Vue插件 xff0c 对vue应用中多个组件的共享状态进行集中式的管理 xff08 读 写 xff09 xff0c 也是一种组件间通信的方式
  • zookeeper本地安装启动

    下载zookeeper xff1a 链接 xff1a https pan baidu com s 151ZdXYg6QDB A8TRK0wrpw 提取码 xff1a yyds 复制到linux上并解压修改配置文件的名字 xff0c 将 zo
  • zookeeper集群安装

    准备3台服务器 xff0c 安装三个zookeeper xff0c 修改zoo cfg配置 xff0c dataDir 61 opt module zookeeper 3 5 7 zkData 分别在zkData目录下创建一个文件myid
  • zookeeper 启动停止脚本

    bin bash case 1 in 34 start 34 for i in 192 168 66 133 192 168 66 134 192 168 66 129 do echo zookeeper i 启动 ssh i 34 opt
  • ElasticSearch-全文检索

    docker 下载安装 es镜像 docker pull elasticsearch 7 4 2 es的可视化工具 docker pull kibana 7 4 2 mkdir p mydata elasticsearch config m
  • atoi()和stoi()的区别----数字字符串的处理

    相同点 xff1a 都是C 43 43 的字符处理函数 xff0c 把数字字符串转换成int输出 头文件都是 include lt cstring gt 不同点 xff1a atoi 的参数是 const char 因此对于一个字符串str
  • ROS基础教程--CostMap_2D包的一些理解

    本文是在综合了多篇文章的基础之上进行的综合 1 基本概念 Voxel xff1a 体素 xff0c 即顾名思义是体积的像素 用来在三维空间中表示一个显示基本点的单位 类似于二维平面下的pixel xff08 像素 xff09 voxel是三
  • [move_base-24] process has died [exit code -6, cmd lib/move_base/move_base odom:=mobile_base_control

    尝试使用TIAGo机器人进行SLAM时 xff0c 运行 roslaunch tiago 2dnav gazebo tiago mapping launch public sim 61 true 指令时加载TIAGo机器人失败 xff0c
  • geoserver集群搭建及数据共享设置

    Geoserver版本及所需依赖 geoserver 2 16 0geoserver 2 16 SNAPSHOT jms cluster plugingeoserver 2 16 SNAPSHOT activeMQ broker plugi
  • postgresql 9.5 now()函数少8小时

    select now 时获取的时间比系统时间少8小时 xff0c 时区问题 xff0c 可能是postgresql conf中的log timezone timezone没有配置成 PRC SELECT now AT TIME ZONE 3
  • sld样式文件demo

    标注样式为 xff1a 代码为 xff1a lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt StyledLayerDescriptor xmlns 61 34 http w
  • 清理Linux buffer/cache内存的方法

    解决Linux buffer cache内存占用过高的办法 xff08 转载 xff09 Linux中Cache内存占用过高解决办法 xff08 转载 xff09
  • windows10下修改Docker镜像目录

    1 背景需求 Windows 版本 xff08 Windows 10 wsl 2 xff09 docker 默认程序安装到c盘 xff0c 数据存储于C Users 当前用户名 AppData Local Docker wsl data e
  • conda 创建的 python 虚拟环境中安装 gdal

    在 conda 创建的Python虚拟环境中安装 gdal 可以按照以下步骤 xff1a 1 打开Anaconda Prompt或者终端 xff0c 激活创建的虚拟环境 xff0c 比如 xff1a conda activate your
  • Ubuntu远程部署及访问jupyter

    一 Ubuntu下安装jupyter notebook 创建虚拟环境 conda create n myjupyter python 61 3 9 激活虚拟环境 conda activate myjupyter 安装jupyter pip
  • postgresql 日志配置

    配置文件日志部分参数说明 REPORTING AND LOGGING Where to Log log destination 61 39 stderr 39 Valid values are combinations o
  • Postgresql 14配置文件解释说明

    Postgresql 14配置文件postgresql conf的解释说明 Postgresql 14配置文件 xff0c 配置项翻译及解释说明 suntoon 64 postgres14 data sudo nano postgresql
  • C++标准库之迭代器

    迭代器是对指针进行进一步抽象的产物 迭代器是遍历所有容器 xff08 序列 xff09 流的统一界面 xff0c 是标准库泛形算法的基础 迭代器根据其能力分为五种 xff1a categorypropertiesvalid expressi
  • 【STM32】UART串口通信详解

    目录 一 数据通信方式 1 串行与并行通信2 全双工 半双工及单工通讯3 同步通讯与异步通讯 二 串口通讯协议 STM32串口简介1 物理层1 RS232标准2 USB转串口 重点 3原生的串口到串口2 协议层1 xff09 通讯的起始和停

随机推荐