使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言

由于YouTube和Netflix的出现,我们开始躺着看手机。然而,长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架,让你无需用手拿着手机。请务必试试!

准备工作

这次我们使用了Elephant Robotics公司的机械臂。与其他产品相比,它价格便宜,作为初学者也相对容易上手。

myCobot 280 Pi- 6 DOF Collaborative Robot (Raspberry Pi version)

为了让摄像头跟踪面部,我们采用了OAK-D OpenCV DepthAI摄像头。它不仅仅是进行视频捕捉,还能辅助进行面部识别所需的神经网络运算,因此即使微控制器没有GPU,也能高速进行面部识别。

这是一个可以始终将显示屏调整到眼前适当距离的手机支架。主要由OAK-D摄像头和机械臂“myCobot”构成。OAK-D摄像头不仅可以获取视频,还可以获取深度信息,从而计算出摄像头到脸部的距离。myCobot是一款具有6个旋转轴的机械臂,能够实现多种动作。通过OAK-D摄像头获取的图像来计算脸部的三维位置,myCobot可以将手机显示屏移动到眼前。这样一来,即使不用手拿着手机也能享受视频。

将OAK-D摄像头和手机安装到myCobot上

myCobot的末端有四个M2.6的螺丝孔。我们3D打印了一个手机壳,并利用这些螺丝孔将壳子固定到myCobot上,从而固定手机。

另一方面,OAK-D摄像头有一个1/4英寸的螺丝孔。我们在3D打印的壳子上也开了一个用于1/4英寸螺丝的孔,以便固定摄像头。

作为参考,这里放置了此次使用的STL数据。

Smartphone holders with a camera for myCobot by techlife_hacking - Thingiverse

机械臂的动作

X方向的移动:J1轴的旋转

Y方向的移动:J4轴的旋转

Z方向的移动:J2和J3轴的旋转(J2和J3反向旋转)

使用J2和J3轴来进行深度方向的移动。仅移动J2会影响Y方向,因此让J3以与J2轴相反的方向旋转相同的量,以减小影响。

3D Face Tracking

在XY平面上跟踪面部

通过对OAK-D摄像头获取的图像进行面部检测,可以获取相机画面中面部的坐标(x, y)。

将OAK-D摄像头画面的中心坐标设为目标值,将面部识别获得的面部坐标(x, y)作为反馈值进行PID控制。

深度方向(Z方向)上的面部跟踪

由于OAK-D摄像头配备了立体摄像头,因此不仅可以获取平面上的面部坐标,还可以获取深度方向的面部坐标z。将面部与显示屏之间既不过近也不过远的距离设为目标值,利用立体摄像头测量的面部坐标(z)作为反馈值进行PID控制。

myCobot和OAK摄像头

将OAK摄像头和myCobot附带的Raspberry Pi通过USB连接。OAK摄像头计算出面部的目标坐标,myCobot附带的Raspberry Pi根据这些坐标进行PID控制,以调整摄像头的方向。

环境

为myCobot附带的Raspberry Pi进行环境构建。

myCobot

在myCobot的Raspberry Pi版本中,只要接通电源,就可以立即使用。机械臂可以通过Python进行操作,并且官方也提供支持。

# test
from pymycobot.mycobot import MyCobotmycobot = MyCobot('/dev/ttyUSB0')
# 使其直立
# go zero
mycobot.send_angles([0,0,0,0,0,0], 80)

OAK-D OpenCV DepthAI摄像头

安装用于操作OAK-D摄像头的depthai库。

# install dependency
sudo curl -fL http://docs.luxonis.com/_static/install_dependencies.sh | bash# get sources
git clone https://github.com/luxonis/depthai.git# install depthai
python3 install_requirements.py

演示

环境搭建完成后,请运行演示程序。若摄像头能够在保持一定距离的同时追踪面部,则说明系统运行正常。

# get demo sources
git clone https://github.com/tech-life-hacking/depthai.git# execute demo
python3 depthai_demo.py

PID的调整

如果myCobot的动作不稳定,请调整PID值。

# settings
PID_control.PID(P值, I值, D值)
pidX.setTargetPosition(帧中的点的位置(X方向): 范围0-1, 0.5是中心)
pidY.setTargetPosition(帧中的点的位置(Y方向): 范围0-1, 0.5是中心)
pidZ.setTargetPosition(摄像头和面部的距离(米), 0.5米 = 50厘米)#enPID_control.PID(P value, I value, D value)
pidX.setTargetPosition(Position of the point in the frame (X direction): Range 0-1, 0.5 is the center)
pidY.setTargetPosition(Position of the point in the frame (Y direction): Range 0-1, 0.5 is the center)
pidZ.setTargetPosition(Distance between the camera and the face (meters), 0.5m = 50cm)# default
pidX = PID_control.PID(10, 10, 3.75)
pidY = PID_control.PID(6.5, 5, 2.5)
pidZ = PID_control.PID(50, 30, 20)
pidX.setTargetPosition(0.5)
pidY.setTargetPosition(0.5)
pidZ.setTargetPosition(0.5)

确定目标值

确定myCobot摄像头指向目标值的代码如下。nnData[0]表示OAK-D摄像头检测到的面部包围框的四个角的坐标。将这四个角的坐标和除以2,可以得出包围框的中心点。spatialCoordinates.z是一个方法,用于返回摄像头和面部之间的距离测量结果。

x = (self._nnData[0].xmin + self._nnData[0].xmax) / 2
y = (self._nnData[0].ymin + self._nnData[0].ymax) / 2
z = int(self._nnData[0].spatialCoordinates.z) / 1000

结语

这次我们使用OAK-D摄像头进行面部识别,并利用能够做出复杂动作的机械臂进行面部跟踪。通过计算机视觉捕捉人类的动作,并据此操控机械臂,可以发现它能够进行非常多样的动作。希望这能为大家的开发提供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

名企面试必问30题(二十)——你对薪资的要求?

1.思路 1. 表明您对薪资的看法是基于自身能力、市场行情和公司薪酬体系的综合考量。 2. 强调您希望薪资能够合理反映您的专业技能、经验和对公司可能做出的贡献。 3. 提及您已经对市场和公司薪酬情况做了一定了解,给出一个大致合理的范围。 2.参考解答 话术示例…

Python内置函数print()详解

在Python编程中,print()函数是最常用的内置函数之一,用于将信息输出到标准输出设备,通常是屏幕。这个函数非常灵活,可以输出各种类型的数据,并且支持多种参数来定制输出格式。 函数功能 print()函数的主要功能是输出…

Vue3从入门到精通(三)

vue3插槽Slots 在 Vue3 中&#xff0c;插槽&#xff08;Slots&#xff09;的使用方式与 Vue2 中基本相同&#xff0c;但有一些细微的差异。以下是在 Vue3 中使用插槽的示例&#xff1a; // ChildComponent.vue <template><div><h2>Child Component</h2&…

借助ollama在linux离线环境上部署大模型

在mac上使用ollama下载并部署想要的模型。在linux上离线安装ollama&#xff1a;ollama离线安装。将mac的ollama的.ollama目录&#xff08;~/.ollama/&#xff09;完整拷贝到linux上&#xff08;/usr/share/ollama/.ollama/&#xff09;&#xff1a;拷贝ollama模型&#xff0c;从…

昇思25天学习打卡营第08天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 ps&#xff1a;这里的训练和Stable Diffusion中的训练是一样…

深入理解C#中的文件系统I/O操作

文件系统I/O操作是任何编程语言中的重要组成部分&#xff0c;C#也不例外。无论是读写文件、操作目录&#xff0c;还是处理文件流&#xff0c;C#都提供了丰富且强大的类库来实现这些功能。本文将详细介绍C#中的文件系统I/O操作&#xff0c;并通过代码示例展示如何高效地处理文件…

进程的概念

一.进程和程序的理解 首先抛出结论&#xff1a;进程是动态的&#xff0c;暂时存在于内存中&#xff0c;进程是程序的一次执行&#xff0c;而进程总是对应至少一个特定的程序。 程序是静态的&#xff0c;永久的存在于磁盘中。 程序是什么呢&#xff1f;程序其实就是存放在我们…

图像分类-数据驱动方法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09; KNN算法通过比较新样本与训练集中的样本的距离&#xff0c;然后根据最近的K个邻居的投票结果来决定新样本的分类。 如图所示&#xff0c;K越大的边界会更加平滑&#xff0c;本质上是根据某一样本最近…

红薯小眼睛接口分析与Python脚本实现

文章目录 1. 写在前面2. 接口分析3. 算法脚本实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Py…

04.27 - 05.18_111期_Linux_进程间通信

命名管道通信 特点&#xff0c;写端在没有往管道里面写内容时&#xff0c;读端会处于阻塞状态 共享内存 特点&#xff0c;读端在什么时候都可以进行读操作 &#xff0c;拷贝次数少&#xff0c;通信次数快 makefile 中使用g进行编译 要实现将上述两个特点进行融合&#xff…

Microsoft Copilot Studio:定制 AI 解决方案的未来

微软最近为其生成式 AI 和大型语言模型工具套件添加了一项创新功能&#xff0c;即 Copilot Studio。这款新产品在 Microsoft Ignite 2023 大会上亮相&#xff0c;将彻底改变组织与 AI 助手的互动方式。 为每个用户提供定制能力 Copilot Studio 是一款出色的用户友好型平台&am…

【面试题】Reactor模型

Reactor模型 定义 Reactor模型是一种事件驱动的设计模式&#xff0c;用于处理服务请求。它通过将事件处理逻辑与事件分发机制解耦&#xff0c;实现高性能、可扩展的并发处理。Reactor模型适用于高并发、事件驱动的程序设计&#xff0c;如网络服务器等。 特点 事件驱动&#…

递归(三)—— 初识暴力递归之“字符串的全部子序列”

题目1 &#xff1a; 打印一个字符串的全部子序列 题目分析&#xff1a; 解法1&#xff1a;非递归方法 我们通过一个实例来理解题意&#xff0c;假设字符串str “abc”&#xff0c;那么它的子序列都有那些呢&#xff1f;" ", “a”&#xff0c; “b”&#xff0c;…

Vue的民族民俗文化分享平台-计算机毕业设计源码22552

基于Vue的民族民俗文化分享平台设计与实现 摘 要 本文介绍了一种基于Vue.js前端框架和Express后端框架的民族民俗文化分享平台的设计和实现。该平台旨在通过线上方式&#xff0c;促进民族民俗文化的传播与分享&#xff0c;增强公众对多元文化的了解和认同。 平台为普通用户提供…

图论·题解1

原题地址 P3371 【模板】单源最短路径&#xff08;标准版&#xff09; 注意的点&#xff1a; 边有重复&#xff0c;选择最小边&#xff01;对于SPFA算法容易出现重大BUG&#xff0c;没有负权值的边时不要使用&#xff01;&#xff01;&#xff01; 70分代码 朴素板dijsktra…

前后端的导入、导出、模板下载等写法

导入&#xff0c;导出、模板下载等的前后端写法 文章目录 导入&#xff0c;导出、模板下载等的前后端写法一、导入实现1.1 后端的导入1.2 前端的导入 二、基础的模板下载2.1 后端的模板下载-若依基础版本2.2 前端的模板下载2.3 后端的模板下载 - 基于资源文件读取2.4 excel制作…

JVM8为什么要增加元空间 ?

持久代 持久代的大小 为什么移除持久代 &#xff1f; 元空间 元空间的特点&#xff1a; 持久代 持久代中包含了虚拟机中所有可通过反射获取到的数据&#xff0c;比如Class和Method对象。不同的Java虚拟机之间可能会进行类共享&#xff0c;因此持久代又分为只读区和读写区。…

24西安电子科技大学马克思主义学院—考研录取情况

01、马克思主义学院各个方向 02、24马克思主义学院近三年复试分数线对比 PS&#xff1a;马院24年院线相对于23年院线增加15分&#xff0c;反映了大家对于马克思主义理论学习与研究的热情高涨&#xff0c;也彰显了学院在人才培养、学科建设及学术研究等方面的不断进步与成就。 6…

直接更新flowable数据库的流程定义信息的一种方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《绿电交易场景下计及温控负荷的高铁站两阶段调度策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…