基于 OpenCV 的人脸追踪
作者 | 努比
来源 | 小白学视觉
在Raspberry上启动项目很简单,所以让我们开始吧。
01. 产品清单
Raspberry Pi 4 Model B — 4GB
适用于Raspberry Pi的Pan-Tilt HAT
Pi Camera v2 8MP
微型SD卡
迷你HDMI电缆
Raspberry Pi摄像头电缆—尺寸:457mm x 16mm(18“ x 0.6”)
USB-C充电器
USB-C外接电池(强烈建议选购)
云台HAT的选择是非常重要的。因为我们必须找到一种控制Pan-Tilt HAT的方法。我们使用的是Waveshare的Pan-Tilt HAT,小伙伴们可能需要花费一些时间来了解如何通过键盘或者通过HAT手动控制伺服电机。USB-C输出的电池对于Raspberry上的项目(其中Raspberry必须是可移动的)非常有用。
02. 软件安装
安装Raspberry操作系统:您可以选择任何Python可以正常运行的系统。这是Raspberry OS的官方页面:https : //www.raspberrypi.org/downloads。推荐使用Raspberry Pi OS
为树莓派启用Pi相机
在Raspberry上启用SSH
安装Python,建议使用版本3
建议安装OpenCV 4.2版
如果Python缺少某些模块,请不要担心,并在Raspberry或Python社区中搜索其安装
03. 通过键盘控制云台相机
这部分对我们来说比较困难,为什么会有一定的困难?因为,有两种方法可以控制伺服电机:
直接将伺服电机插入Raspberry,然后直接通过Raspberry控制它们,在这种情况下,需要使用GPIO接口
将伺服电机插入HAT平台,然后将HAT插入Raspberry。因此,我们需要先控制HAT平台,然后再由HAT平台控制我们的伺服电机。在这种情况下可以使用waveshare PCA9685提供的给定驱动程序
04. 云台伺服电机校准
这部分虽然不是强制性的,但强烈建议使用。
伺服轴的螺丝
重要的是,一开始就不要拧紧伺服轴的螺钉,只需以可以自由旋转的方式稍微固定一下即可。使用键盘上的控件,大家可以尝试在0位置旋转舵机,然后将摄像机移动到首选的起始位置,现在可以拧紧伺服轴的螺钉。(云台螺钉在底座下方,因此我们需要在基座上安装云台,然后进行校准,拆卸和拧紧云台螺钉,然后再重新安装)
05. 人脸跟踪编码
>使用默认情况下随OpenCV一起提供的预安装CascadeClassifier来使操作变得简单。我们的工作重点是如何控制平移和倾斜角度。
CascadeClassifier具有在OpenCV目录+ /data/haarcascade_frontalface_default.xml中找到的正面人脸识别的预训练
所述CascadeClassifier给我们直接一组用于帧中的每个检测到的面部信息(X,Y,W,H)。(x,y)是检测到的面部的左上角的位置,(w,h)是检测到的面部的高度和与之的距离,根据这些信息,我们可以计算出检测到的面部的中心。
>脸部中心
当我们得到(x,y)时,将控制我们的摇摄和俯仰伺服器将摄像机移动到面部中心应靠近镜框中心的位置
>伪PD控制器
为什么是伪PD?因为我们的伺服器没有位置传感器,所以我们不知道机器人摄像头的摇摄角度和倾斜角度。因此,我们不能严格使用反馈控制。我使用了一个伪PD控制器,该控制器仅使用delta_PAN来递增/递减相机的pan-angle(resp。til-angle):
delta_PAN = k_PAN * delta_x + kd_PAN * delta_x_dot
大致来说,它是一种前馈控制器。
如果您在我们没有有关伺服器位置的信息时找到了一种更好的控制方式,请给我发送电子邮件告知我。
>拓展
我尝试添加一些随机消息模块:
bonjour:相机第一次检测到脸部时的随机欢迎消息
cachecache:当我们在相机前停留太长时间时,随机显示“远离我”消息
缺少:什么都没检测到的随机消息
但是,添加这些消息有时会使算法产生一定的滞后。因此,大家可以消除这些模块以使相机更快。
>多脸检测
CascadeClassifier可以在一帧中找到多张脸,但是我将PD控制器限制为仅检测到一张脸1张脸的情况。轮到您改善此问题了。一种想法是计算检测到的面部的质心。
代码链接:
https : //github.com/nguyenrobot/palt-tilt-cam
相关文章:

-bash: /bin/rm: Argument list too long的解决办法
-bash: /bin/rm: Argument list too long的解决办法 当目录下文件太多时,用rm删除文件会报错: -bash: /bin/rm: Argument list too long 提示文件数目太多。 解决的办法是使用如下命令: ls | xargs -n 10 rm -fr ls 输出所有的文件名(用…

React使用ES6语法重构组件代码
首次使用react,要注意react不同版本库,是ES5还是ES6的写法,如何做到统一。下面对于ES6语法重构组件的代码如下:(1)原始代码: <script type"text/babel">var destinationdocumen…

PHP哈希表碰撞攻击原理
哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招。本文结合PHP内核源码,聊一聊这种攻击的原理及实现。 哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言…

Java8(jdk1.8)中文档注释处理工具javadoc的环境参量配置及使用方法
Java8(jdk1.8)中文档注释处理工具javadoc的环境参量配置及使用方法Java语言提供了一种功能强大的注释形式:文档注释。如果编写Java源代码时添加了合适的文档注释,然后通过JDK提供的javadoc工具可以直接将源代码里的文档注释提取成一份系统的API文档。jav…

如何读取Excel表格中不同sheet表的同一位置单元格数据,并绘制条形图呢?
作者 | 黄伟呢来源 | 数据分析与统计学之美今天,有位朋友在群里面咨询了一个问题:如何读取Excel表格中"不同sheet表"的同一位置单元格数据,并绘制条形图呢?有人提议用vba,但是不得不说,没有学过v…

vue-router学习笔记
配置路由模式 const routernew VueRouter({routes }) hash模式(默认):通过url的hash来模拟一个完整的url,于是当url改变时,页面不会重新加载。history模式:通过history完成url跳转而不需要重新加载页面。注意:为了防止404错误&…

PHP防止注入攻击
注入攻击不多说了PHP addslashes() 函数--单撇号加斜线转义PHP String 函数定义和用法addslashes() 函数在指定的预定义字符前添加反斜杠。这些预定义字符是:单引号 ()双引号 (")反斜杠 (\)NULL语法addslashes(string)参数描述string必需。规定要检查的字符串。…

首届腾讯数字安全创新大赛在京启动,挖掘新锐力量推动产业创新
3月10日,首届腾讯数字安全创新大赛在京正式启动。本次大赛由腾讯安全和中国产业互联网发展联盟联合主办,腾讯安全、KEEN、元起资本、赛博英杰、数世咨询等多家企业联合发起,中国产业互联网发展联盟安全专委会承办。 大赛旨在寻找网络安全新力…

oracle数据库无监听程序
在电脑---服务---启动oracle tns 如果还是出现错误的话,找到Net Manager,将网络的ip监听删除,将本机的主机名配好,即可打开tns服务 转载于:https://www.cnblogs.com/jiangsheng3/p/5025201.html

个人开发者即时到账收款方案 BufPay.com
BufPay 个人即时到账支付平台前言 作为独立开发者,一般只有一个人独立奋战,做出了产品需要收款是非常麻烦的,接入支付宝微信支付都需要公司公户,而注册公司、开公户等一系列操作非常麻烦,成本也很高一年也要 1w 左右。…

用 Python 制作数据大屏,超简单
作者 | 俊欣来源 | 关于数据分析与可视化今天我们用Streamlit模块来制作一个数据面板,将数据更加直观地呈现给别人观看,整个页面大致如下图所示:制作工具栏在页面的左侧是一个工具栏,工具栏中有多个按钮,分别是“About…

Oracle 12C -- 清空audit记录
1.使用job清空 SQL> dbms_audit_mgmt.create_purge_job(audit_trail_type> DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,audit_trail_purge_interval>12,audit_trail_purge_name>audit_trail_pj,use_last_arch_timestamp>TRUE,container>dbms_audit_mgm…

魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法
PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和magic_quotes_runtime, 这两个函数如果在php.ini设置为ON的时候,就会为我们引用的数据碰到单引号和双引号"是自动加上反斜线,帮我们自动转译符号,确保数据操作的…
Unity脚本生成插件:Script Create Dialog
最近写代码又犯懒了...感觉每次新建脚本都要写一堆简单重复的东西好无聊,所以搜索了一下有没有自动生成脚本的插件。结果还真被我发现了,官方在N久之前就制作了自动生成脚本的插件[Script Create Dialog],大概是名字起的和脚本生成器相差太多…

多路IO复用模型 select epoll 等
同步阻塞IO在等待数据就绪上花去太多时间,而传统的同步非阻塞IO虽然不会阻塞进程,但是结合轮询来判断数据是否就绪仍然会耗费大量的CPU时间。多路IO复用提供了对大量文件描述符进行就绪检查的高性能方案。selectselect诞生于4.2BSD,在几乎所有…

可操作性强!Python实现一个电影订票系统!
来源丨Python小二一、效果展示通过Python实现一个电影订票系统,效果如下所示:二、整体结构图三、代码分解3.1 infos.py一部电影的详细信息适合用 字典 结构来存储,我们可以给字典里添加多个键值对来保存电影的名称、座位表和宣传时用的字符画…

centos7 install mysql
1. 下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2. 安装mysql-community-release-el7-5.noarch.rpm包 $ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm 安装这个包后,会获得两个mysql的yum repo源&#x…

unity加载ab后,场景shader不起效问题(物件表现黑色)
需要把unity自带的shader,加入到默认列表转载于:https://www.cnblogs.com/lancidie/p/9293827.html

Linux下各类TCP网络服务器的实现源代码
http://www.linuxeden.com/forum/t146870.html大家都知道各类网络服务器程序的编写步骤,并且都知道网络服务器就两大类:循环服务和并发服务。这里附上源代码来个小结吧。首先,循环网络服务器编程实现的步骤是这样的: 这种服务器模…

ReferenceQueue的使用
转:http://www.iflym.com/index.php/java-programe/201407140001.html 1 何为ReferenceQueue 在java的引用体系中,存在着强引用,软引用,虚引用,幽灵引用,这4种引用类型。在正常的使用过程中,我们…

红帽、Docker、SUSE 在俄罗斯停服
国际局势给技术圈带来的影响依然在蔓延。整理 | 苏宓出品 | CSDN(ID:CSDNnews)继 Oracle、Google、苹果等科技公司和 React 开源项目之后,如今 Linux 发行版也牵扯进俄乌之间冲突的漩涡中。其中一个是全球最大的独立开源软件公…

配置linux-Fedora系统下iptables防火墙
参考地址:https://blog.csdn.net/zhangjingyi111/article/details/78902820 本篇文章为实验课过程记录,较为简略。 1.查看系统是否安装iptables 命令:iptables --version 2.开启iptables 命令:service iptables start 出现错误&am…

output_buffering详细介绍
HTTP Header为什么要使用Output Buffering技术Output Buffering的工作原理基本用法高级用法使事情更为简单哈哈,我成功了我个人认为,Output buffering是比较纯粹的PHP4.0特征。尽管从概念上看来相当简单,但是output buffering功能非常强大&am…

12 个 Pandas 数据处理高频操作
作者 | 老表来源 | 简说Python今天给大家分享几个自己近期常用的Pandas数据处理技巧,主打实用,所以你肯定能用的着,建议扫一遍,然后收藏起来,下次要用的时候再查查看即可。简单说说总结分享统计一行/一列数据的负数出现…

ORACLE初次安装自动安装软件包
一、自动安装所需软件包提前配置好yum仓库定义package.txt包列表文件:以官网RHEL6为例,这里有compat-libstdc有两个包,如果不加*,号后面的compat-libstdc-33-3.2.3-69.el6.x86_64,compat-libstdc-296-2.96-144.el6.i68…

中文详解phpmailer所有对象和属性
2019独角兽企业重金招聘Python工程师标准>>> 2009-03-09 19:13:50 前言: phpmailer是一个优秀的发件程序,但中文资料比较少,于是有牛人手动翻译了phpmailer的elementindex.html,E文的:[url]http://www.bblog.com/api…

php error_reporting 详解
error_reporting设定错误讯息回报的等级。语法: int error_reporting(int [level]);传回值: 整数函式种类: PHP 系统功能内容说明 本函式用来设定错误讯息回报的等级,参数 level 是一个整数的位元遮罩 (bitmask),见下表。value constant 1 E_ERROR 2 E_W…

mysql多个实例
2019独角兽企业重金招聘Python工程师标准>>> 1>、关闭原有的默认端口3306的mysql:service mysqd stop 2>、拷贝或创建数据文件 cp -r /data/mysql/data1 /data/mysql/data_3307 格式 用bin/mysql_install_db --basedirmysql的目录 --datadir数据存放的目录 …

10行 python 代码做出哪些酷炫的事情?
来源 | Python小二Python凭借其简洁的代码,赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代码实现许多有趣的操作。下面我们来看看,我们用不超过10行代码能实…

这是一个不一样的社会公益活动
公益不是每个人的刚需,但是可以,以全链条模式联动更多人需求。 社会公益就是给社会带来帮助的事或物,它包含社区服务,环境保护,知识传播,公共福利,帮助他人,社会援助,社会…