大象机械臂mechArm pi人脸识别项目

本文介绍了通过OpenCV进行人脸识别,并结合六轴机械臂mechArm270-Pi进行动态追踪的项目。作者计划利用Python库pymycobot控制机械臂,并探讨了手眼标定的eyetohand和eyeinhand两种方法,但遇到eyeinhand坐标转换的问题,项目暂时停滞,待进一步研究解决。
摘要由CSDN通过智能技术生成

看过钢铁侠的人都知道里面的贾维斯在帮助托尼斯塔克制作装备的时候,有许多械臂提供帮助制作装备,让装备的制作提高了效率。贾维斯是一个超级强大的人工智能系统,有了它的帮助如鱼的水。我脑海中浮现出来一个想法,让机械臂末端实现人脸识别和跟踪的功能,也有看到有人实现了机械臂末端物体的动态跟踪,看着这个项目好像很容易实现,让我来试一试吧!



项目设备

本次项目需要的设备在下表格里。

1268628dc7fef6ee0a54466b4d92f124.jpeg


mechArm 270-Pi


这是一款大象机器人生产的小六轴机械臂,以树莓派4B为微处理器,ESP32为辅助控制,结构是中心对称结构(仿工业结构)。mechArm 270-Pi本体重量1kg, 负载250g,工作半径270mm,设计紧凑便携,小巧但功能强大,操作简单,能与人协同、安全工作。


e1a1739a6fa5ad70f272f683c4465955.jpeg

4ea57b9ef563a0cc4f13e4b0881cd984.jpeg


mechArm 的资料丰富,提供了许多python的api接口可以方便提供给我来进行使用。它的末端的接口规格都可以从官网获取到资料,可以使用3d打印技术设计一款合适的设备。


计算机视觉


USB无畸变镜头

这里是摄像头的参数,主要是用于人脸识别。


67d93367313cb94045ca6a8673538950.jpeg


项目流程介绍


整体项目的流程图


这个项目的流程如下图所示,最主要的是解决OpenCV的人脸识别功能和机械臂手眼标定是选择eye in hand 还是eye to hand。

ceabde3e4fecfb73ee0d9f591ede42c4.jpeg


接下来我将简单介绍一下这两个功能有什么作用在项目当中。

OpenCV-人脸识别

302e38f5cde19a6476f4feb6c8704ea2.jpeg

OpenCV的全名是Open Source Computer Vision Library,是一个跨平台的电脑视觉库。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。


人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人。我们常说的人脸识别一般包含了人脸检测人脸识别两部分。


人脸检测中,其主要任务是构造能够区分包含人脸实例和不包含人脸实例的分类器。

opencv中提供了三种训练好的级联分类器。级联分类器顾名思义即通过不同的特征进行一步步筛选,最终得出所属的分类,它将一个复杂的分类问题拆解为一个个简单的分类问题,随着级联条件的判断,能够一步步筛出大量的负样本,极大的提升了后面分类的速度。


opencv人脸识别库是开源的,还能够支持python的接口,可以直接进行调用。


这里是分类器的下载地址:http://face-rec.org/databases/



手眼标定


手眼标定实际上就是为了让机械臂知道相机拍出来的物体相对于机械臂在什么位置,换一种说法就是建立相机坐标系与机械臂坐标系的映射关系。

有两种方式

一种是eye to hand,眼在手外面,就是将相机固定在机械臂外面。

2b1c7df7a6ba60caa5d65c06e66ad208.jpeg


由于眼在手外标定时,Base坐标系和Cam坐标系的位置是固定的,因此眼在手外主要是求这两个坐标系的关系。


另一种是eye in hand,眼在手上,就是将相机固定在机械臂末端。

68fc6753c746670a508fee222b523d5f.jpeg

相机坐标系和工具坐标系的位置是相对不变的。因此,标定的就是cam坐标系和tool坐标系的关系。


项目开始

python对mechArm的控制

pymycobot 是用python控制mechArm的库,可以直接调用里面的方法。

介绍几个主要的方法:

release_all_servos()

release all robot arms

get_angles()

get the degree of all joints.

send_angle(id, degree, speed)

Send one degree of joint to robot arm.

send_angles(degrees, speed)

Send the degrees of all joints to robot arm.

degrees: a list of degree value(List[float]), length 6 or 4.

speed: (int) 0 ~ 100


from pymycobot.mycobot import MyCobot
import time


mc = MyCobot('/dev/ttyAMA0',1000000)
time.sleep(4)
for count in range(2):
mc.send_angles([0,0,0,0,0,0],70)
time.sleep(2)
mc.send_angles([0,38.32,(-6.76),10.01,99.22,(-19.77)],70)
time.sleep(2)
mc.send_angles([(-13.18),(-22.14),17.66,147.12,99.22,(-19.77)],70)
time.sleep(2)
mc.send_angles([98.43,(-2.98),(-95.88),161.01,(-1.23),(-19.77)],70)
time.sleep(2)
print(mc.get_angles())
print(mc.get_coords())
mc.send_angles([0,0,0,0,0,0],70)


视频演示

https://www.bilibili.com/video/BV1VW4y1M7Gv/?vd_source=dd6f4a47482e4e14e33125a26c155808


mechArm Pi还是可以很轻易上手的一款机械臂操控性很强。


接下来我们来研究一下如何实现人脸识别功能。


openCV 人脸识别的代码

在前面我介绍到了分类器,让我来演示一下大概的流程是怎么样的。

45df817900af8710dbfb636e3f3019ff.jpeg

执行一下代码来看一下效果


import cv2
import matplotlib.pyplot as plt
import time

def video_info():
# Loading classifiers
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# Input video stream
cap = cv2.VideoCapture(0)
# To use a video file as input
#cap = cv2.VideoCapture('demo.mp4')

while True:
_, img = cap.read()
# Conversion to greyscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detecting faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Drawing the outline
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
center_x = (x+w-x)//2+x
center_y = (y+h-y)//2+y
cv2.circle(img,(center_x,center_y),10,(0,255,255),2)

# Display effects
cv2.imshow('img', img)
k = cv2.waitKey(30) & 0xff
if k==27:
break
cap.release()


9ea25e4aef46366a3fc5b9e216fb7eba.jpeg

不得不说,opencv锻炼的分类器是十分强大的!很快速的就识别出来了人脸。

就这样我完成了前两项技术的问题:机械臂的基础操作人脸识别功能的复现。手眼标定在查询资料的时候遇到了困难,在eye in hand 当中换算坐标的时候出现了一些问题,短时间没有办法能够解决,决定去查询更多的资料再来跟大家分享。

总结

这次记录的项目到这里就结束了,因为一些技术上的原因,手眼标定涉及的知识面比较广,需要查询许多资料和寻求多方面的帮助。待我归来之时,我的项目必将成功!如果你喜欢这篇文章的话,点赞留言支持我!

我们下次再见,很快就会回来的。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值