0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用树莓派与OpenCV实现面部和运动追踪的云台系统?

上海晶珩电子科技有限公司 ? 2025-08-14 17:45 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,这是一个树莓派和OpenCV的连载专题。

使用树莓派与OpenCV实现姿态估计和面部特征点追踪

使用树莓派与OpenCV实现面部和运动追踪的云台系统

使用树莓派和OpenCV实现手部识别与手指识别

使用树莓派和OpenCV实时扫描并存储二维码

使用树莓派和OpenCV实现物体与动物识别

使用树莓派、摄像头和OpenCV进行速度检测

用树莓派 + OpenCV 打造人脸识别技术!

今天是第二部分:使用树莓派与OpenCV实现面部和运动追踪的云台系统

如果大家对这个专题感兴趣,记得关注树莓派开发者,这样你将会第一时间收到我们的内容更新通知。

本文将介绍如何使用树莓派单板计算机控制一个云台系统,使其将你的面部保持在画面中心。本文不仅旨在创建一个易于使用的带云台帽的面部追踪系统,还希望以一种便于扩展的方式来实现,无论你选择使用何种系统或添加何种代码。此外,我还将演示如何控制旋转速度,使其非常平滑或非常快。

完成上述步骤后,下一步是为云台系统编写一个巡逻阶段代码。因此,当它没有看到任何面部时,它会在其自由度范围内进行逻辑移动以搜索面部。然后,为了进一步辅助这个巡逻阶段,我们可以在代码中添加自动转向任何识别到的移动物体的功能。

本页面广泛使用了Pimironi Picade云台帽,它可以让你将云台模块安装在树莓派掌上电脑的顶部。


你需要准备什么

Open-CV和其他必需的软件包

功能性面部追踪代码

从巡逻到运动追踪再到面部追踪

接下来做什么

在树莓派“Buster”操作系统上安装Open-CV

下载内容


本设置将使用Open-CV来识别面部和运动。这是一个强大的资源库,有助于解决实时计算机视觉和图像处理问题。下图是摄像头正确追踪我的面部的画面。

70025e9e-78f3-11f0-9080-92fbcf53809c.png

现在,我们始终将动作保持在画面中!运行此系统的代码可以从本页底部的链接下载。一如既往,如果你有任何问题、疑问或希望看到新增的内容,请告诉我们你的想法!


你需要准备什么

以下是让本系统快速运行所需的组件列表。硬件构建过程可以在我之前发布的Pimoroni Picade云台帽指南中找到,该指南将为你提供组装此帽和树莓派所需的所有知识。

https://core-electronics.com.au/guides/raspberry-pi/pan-tilt-hat-raspberry-pi/

树莓派4B(这款树莓派提供的额外计算能力对这项任务非常有帮助)

树莓派官方摄像头模块V2(但也可以与任何具有类似外形尺寸的摄像头一起使用,广角摄像头模块在这里效果很好)

Pimoroni云台帽

Micro SD卡(已安装树莓派操作系统,连接到互联网,并在配置设置中启用了摄像头)

电源

显示器

HDMI线

鼠标和键盘


Open-CV和其他必需的软件包

要使本系统正常运行,你需要几个软件包。重要的是,为了实现这一功能,我们将利用Open-CV软件包的强大功能,为我们的面部追踪系统创建更简单的代码。要安装它,我们将在终端中输入在“在树莓派操作系统上安装Open-CV”部分中找到的命令行。

https://core-electronics.com.au/guides/raspberry-pi/face-tracking-raspberry-pi/#Setting

使用屏幕左上角的黑色按钮打开一个新终端。下面你可以看到在树莓派“Buster”桌面上打开终端的样子,图中有一个大箭头指向用鼠标点击打开终端的图标。

如果提示,请输入 | Y | 并按回车键继续安装过程。安装每个软件包可能需要一些时间。进一步往下看,你可以看到正在下载第二行的图像。这里的每一行大多用于将当前软件包更新和安装到当前设置中,并以 | sudo | 命令开头。以 | sudo | 开头的每一行都将以管理员权限运行。

702f9b8e-78f3-11f0-9080-92fbcf53809c.png

你还需要像之前一样在终端中输入以下两行命令。这将使我们的Pimoroni Picade云台帽能够与树莓派高效配合工作。有关此软件包的更多信息,请点击此处。

https://core-electronics.com.au/guides/raspberry-pi/pan-tilt-hat-raspberry-pi/

完成这些步骤后,你就可以使用本应用程序所需的所有软件包了。快速重启系统以锁定所有这些更改。

sudo apt-getupdate && sudo apt-getupgradecurl https://get.pimoroni.com/pantilthat | bashsudo apt-getinstall python-opencv python3-opencv opencv-data


功能性面部追踪代码

以下是我们将用于运行Pimoroni Picade帽面部追踪系统的代码。它将识别面部,并尝试通过伺服电机进行平移和倾斜,使面部保持在捕捉视频的中心。代码有完整的注释,因此你可以理解每个部分的作用和目的。

#!/usr/bin/env python#Below we are importing functionality to our Code, OPEN-CV, Time, and Pimoroni Pan Tilt Hat Package of particular note.importcv2, sys, time, osfrompantilthatimport*# Load the BCM V4l2 driver for /dev/video0. This driver has been installed from earlier terminal commands. #This is really just to ensure everything is as it should be.os.system('sudo modprobe bcm2835-v4l2')# Set the framerate (not sure this does anything! But you can change the number after | -p | to allegedly increase or decrease the framerate).os.system('v4l2-ctl -p 40')# Frame Size. Smaller is faster, but less accurate.# Wide and short is better, since moving your head up and down is harder to do.# W = 160 and H = 100 are good settings if you are using and earlier Raspberry Pi Version.FRAME_W =320FRAME_H =200# Default Pan/Tilt for the camera in degrees. I have set it up to roughly point at my face location when it starts the code.# Camera range is from 0 to 180. Alter the values below to determine the starting point for your pan and tilt.cam_pan =40cam_tilt =20# Set up the Cascade Classifier for face tracking. This is using the Haar Cascade face recognition method with LBP = Local Binary Patterns. # Seen below is commented out the slower method to get face tracking done using only the HAAR method.# cascPath = 'haarcascade_frontalface_default.xml' # sys.argv[1]cascPath ='/usr/share/opencv/lbpcascades/lbpcascade_frontalface.xml'faceCascade = cv2.CascadeClassifier(cascPath)# Start and set up the video capture with our selected frame size. Make sure these values match the same width and height values that you choose at the start.cap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320);cap.set(cv2.CAP_PROP_FRAME_HEIGHT,200);time.sleep(2)# Turn the camera to the Start position (the data that pan() and tilt() functions expect to see are any numbers between -90 to 90 degrees).pan(cam_pan-90)tilt(cam_tilt-90)light_mode(WS2812)# Light control down here. If you have a LED stick wired up to the Pimoroni HAT it will light up when it has located a face.deflights(r,g,b,w): forxinrange(18): set_pixel_rgbw(x,rifxin[3,4]else0,gifxin[3,4]else0,b,wifxin[0,1,6,7]else0) show()lights(0,0,0,50)#Below we are creating an infinite loop, the system will run forever or until we manually tell it to stop (or use the "q" button on our keyboard)whileTrue: # Capture frame-by-frame ret, frame = cap.read() # This line lets you mount the camera the "right" way up, with neopixels above frame = cv2.flip(frame, -1)
ifret ==False: print("Error getting image") continue # Convert to greyscale for easier faster accurate face detection gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.equalizeHist( gray ) # Do face detection to search for faces from these captures frames faces = faceCascade.detectMultiScale(frame,1.1,3,0, (10,10))
# Slower method (this gets used only if the slower HAAR method was uncommented above. '''faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=4, minSize=(20, 20), flags=cv2.cv.CV_HAAR_SCALE_IMAGE | cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT | cv2.cv.CV_HAAR_DO_ROUGH_SEARCH )'''
lights(50iflen(faces) ==0else0,50iflen(faces) >0else0,0,50) #Below draws the rectangle onto the screen then determines how to move the camera module so that the face can always be in the centre of screen. for(x, y, w, h)infaces: # Draw a green rectangle around the face (There is a lot of control to be had here, for example If you want a bigger border change 4 to 8) cv2.rectangle(frame, (x, y), (x w, y h), (0,255,0),4) # Track face with the square around it
# Get the centre of the face x = x (w/2) y = y (h/2) # Correct relative to centre of image turn_x =float(x - (FRAME_W/2)) turn_y =float(y - (FRAME_H/2)) # Convert to percentage offset turn_x /=float(FRAME_W/2) turn_y /=float(FRAME_H/2) # Scale offset to degrees (that 2.5 value below acts like the Proportional factor in PID) turn_x *=2.5# VFOV turn_y *=2.5# HFOV cam_pan = -turn_x cam_tilt = turn_y print(cam_pan-90, cam_tilt-90) # Clamp Pan/Tilt to 0 to 180 degrees cam_pan =max(0,min(180,cam_pan)) cam_tilt =max(0,min(180,cam_tilt)) # Update the servos pan(int(cam_pan-90)) tilt(int(cam_tilt-90)) break #Orientate the frame so you can see it. frame = cv2.resize(frame, (540,300)) frame = cv2.flip(frame,1)
# Display the video captured, with rectangles overlayed # onto the Pi desktop cv2.imshow('Video', frame) #If you type q at any point this will end the loop and thus end the code. ifcv2.waitKey(1) &0xFF==ord('q'): break# When everything is done, release the capture information and stop everythingvideo_capture.release()cv2.destroyAllWindows()

现在,让我们在Thonny IDE中打开上面的代码。你可以通过将上面的代码复制、粘贴并保存到Thonny IDE中,然后右键单击 | facetracker.py | Python代码并在Thonny IDE中打开它。然后,只要你运行它(通过按下那个大的绿色运行按钮),它就会启动面部追踪。它会保持静止,直到找到面部,然后它会尝试将该面部保持在画面中心,即使你试图让它离开画面。请参见下图。

704627d2-78f3-11f0-9080-92fbcf53809c.jpg

对于那些看过《树莓派面部识别》指南的人来说,你会注意到这里用于识别面部的系统与该指南中使用的系统不同。这里的面部检测使用的是一种称为Haar级联的系统。Haar级联检测是最古老但功能强大的人脸检测算法之一。该算法由Viola和Jones于2001年首次发表,远在深度学习获得广泛关注之前。这个系统无法识别不同的面部,但作为交换,它在寻找人脸方面要快得多。这里使用的是Haar级联的一种变体,称为LBP(局部二值模式),它比原始的Haar级联方法更快,但略不准确。由于这个速度原因,它被有效地应用在我们的单板面部追踪系统中。下面显示的是你运行上述代码时在桌面上看到的内容。

7055c0ca-78f3-11f0-9080-92fbcf53809c.png

值得编辑代码的地方。在代码中,你会找到一个名为“将偏移量缩放为角度”的部分(你也可以在上面的图像中看到这个部分)。默认的缩放偏移量值为2.5,但在这里你可以降低该值以使伺服操作更平滑,或者增加该值以使摄像头调整得更远。在这里进行微小的更改可以产生很大的不同。在同一部分中,你还可以更改 | turn_x | 和 | turn_y | 值的正负号。这将使摄像头变得非常害羞,永远不会盯着人看。这段代码还有很多LED灯条控制功能,你可以轻松利用并根据自己的喜好进行编辑。


巡逻和运动感应

另一个值得添加到系统中的功能是当它没有看到任何面部时的巡逻设置。更进一步的是,如果你看到任何运动,就将摄像头转向该运动方向。然后,如果你看到面部,就锁定该面部并忽略前两个阶段。好吧,在下面的下载内容中,正是提供了实现这一功能的代码。

https://core-electronics.com.au/media/kbase/507/Face-Tracking-Pimoroni-Codes.zip

非常感谢Claude Pageau,因为我基于他之前的工作(特别是面部追踪演示)编写了下面的很多代码。有很多设置你可以调整,值得查看 | config.py | 文件以了解你可以更改的内容。因此,以下面的方式下载并运行 | Face-Track-Pan-Tilt-HAT-Pimoroni.py | 代码。请参见下图,了解伺服电机在哨兵模式下将执行的默认位置。在每个位置,它会暂停一秒钟,然后再进入下一个位置。这完全可定制,并且每当它无法看到人或运动时都会发生。

7071c2de-78f3-11f0-9080-92fbcf53809c.png

然后,当识别到运动时,它会使用平移和倾斜功能将摄像头画面的中心对准运动方向。你可以看到,当我侧身走过(不向摄像头展示我的面部)时,它始终将我保持在画面中。每当它看到运动时,它会在视频画面上放置一个绿色圆圈,以指示它估计的运动中心位置。

7090cb16-78f3-11f0-9080-92fbcf53809c.png

然后,当它找到面部时,它会迅速对准面部,在视频流上围绕面部绘制一个蓝色方框,并尽一切可能紧紧锁定该面部,使你的面部始终保持在画面中心。请参见下图。一旦它找不到面部,它就会返回哨兵模式。这段代码的运行方式非常类似于《传送门》中的哨兵炮塔(没有危险和声音)。

https://theportalwiki.com/wiki/Turrets

70ab9d2e-78f3-11f0-9080-92fbcf53809c.jpg


接下来做什么

这有很多优秀的拓展方向。例如,当你看到多个面部时该怎么办?根据特定参数将偏好设置给一个面部而不是另一个面部将是一个值得添加的代码功能。想象这样一个场景:你感兴趣的人戴着口罩。在这种情况下,也许我们可以不运行面部检测,而是运行一个对象检测层,仅搜索人员。

有很多种云台方法,我试图使这些方法能够成功集成到代码中。许多云台系统使用缓慢移动的无刷直流电机,有些使用步进电机。稍微修改一下代码,你就可以成功地运行任何云台系统。

另一个值得一提的点是PID(比例积分微分)控制。我们的系统正在全速运行,因此一旦它识别到面部,它就会在面部周围绘制一个方框,并立即确定移动角度。目前代码中没有编程的PID控制器层(但我认为从硬件、软件及其限制的组合中自然会产生一个PID)。这里已经有一些PID控制了,例如,如果你在第一个代码中增加缩放偏移量值,你就是在增加P值。然而,通过在代码中加入特定的PID层,完全有可能使云台帽以平滑的弧线和扫动方式运行。然而,添加这种额外的复杂性会使系统运行速度变慢,但我已经看到有人在树莓派上实现了这一点。

https://www.pyimagesearch.com/2019/04/01/pan-tilt-face-tracking-with-a-raspberry-pi-and-opencv/


在树莓派“Buster”操作系统上安装Open-CV

以下是在树莓派上安装Open-CV以使其适用于对象识别的计算机视觉的详细流程。很快,我将创建一个脚本/单独的教程来简化此流程。打开一台运行着全新树莓派“Buster”操作系统并连接到互联网的树莓派4B。

使用屏幕左上角的按钮打开终端。将每个命令复制并粘贴到树莓派的终端中,按Enter键,并等待其完成后再执行下一个命令。如果提示“你想继续吗?(y/n)”,请按Y键,然后按Enter键继续。

sudo apt-getupdate&&sudo apt-getupgrade

在运行下一组命令之前,我们必须先扩展交换文件。为此,在终端中输入以下行。

sudo nano /etc/dphys-swapfile

将 CONF_SWAPSIZE = 100 更改为 CONF_SWAPSIZE=2048。完成此操作后,按Ctrl-X、Y,然后按Enter键保存这些更改。此更改只是暂时的,完成此操作后你应该将其改回。为了使这些更改生效,我们必须通过向终端输入以下命令来重启交换文件。然后,我们将像往常一样继续输入终端命令。

sudo apt-get install build-essential cmake pkg-configsudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-devsudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-devsudo apt-get install libxvidcore-dev libx264-devsudo apt-get install libgtk2.0-dev libgtk-3-devsudo apt-get install libatlas-base-dev gfortransudo pip3 install numpywget -O opencv.zip https://github.com/opencv/opencv/archive/4.4.0.zipwget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.4.0.zipunzip opencv.zipunzip opencv_contrib.zipcd~/opencv-4.4.0/mkdirbuildcdbuildcmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.4.0/modules \ -D BUILD_EXAMPLES=ON ..make -j $(nproc)

此 | make | 命令将需要超过一个小时来安装,并且不会有任何关于还需多长时间的指示。它也可能会冻结显示器。请耐心等待,它会正常工作的。一旦完成,你就完成了大部分工作。如果它在任何时候失败,你会收到类似 | make: *** [Makefile all] Error 2 | 的消息,只需重新输入并执行上面的 | make -j $(nproc) | 行。不要害怕,它会记住已经完成的所有工作,并从停止的地方继续。一旦完成,我们将继续输入终端命令。

sudomake install && sudo ldconfigsudo reboot


下载内容

以下是运行上述示例所需的所有代码。这些代码都有完整的注释,因此你可以轻松理解并修改它们,以满足你的需求。

https://core-electronics.com.au/media/kbase/507/Face-Tracking-Pimoroni-Codes.zip


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    32

    文章

    647

    浏览量

    43256
  • 树莓派
    +关注

    关注

    122

    文章

    2054

    浏览量

    107827
  • 云台系统
    +关注

    关注

    0

    文章

    2

    浏览量

    1150
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    树莓派上使用OpenCV和Python实现实时人脸检测

    理论知识,因此初学者也能轻松跟着步骤实现。 项目所需设备 硬件: 树莓 3 Model B; 树莓摄像头模块(PiCam)。 语言和库:
    的头像 发表于 03-06 09:00 ?5.2w次阅读

    树莓打造视频监控机器人Verybot

    `在网上有看到一个基于树莓 ( raspberry pi ) 的视频监控机器人平台 Verybot ,顺带把这个机器人的一些图片、视频、设计思路进行公开,让大家都参与到树莓DIY的
    发表于 09-18 15:33

    树莓做的家庭

    设计好了,树莓里的系统确实跟几乎所有的Linux发行版一样,可以是正常使用独立WEB服务器或FTP服务器或数据库平台,邮件, DNS或任何其他服务功能。试图建立一个自由和开放的“
    发表于 11-25 15:23

    树莓之球形追踪

    其他的一些项目。所需材料:树莓支持树莓的USB摄像头一Linux主机(最好是Linux Mint/ Ubuntu),我已经用Linux
    发表于 01-11 18:15

    树莓入门套装

    USB的鼠标键盘,以及网线与显示屏(HDMI),它就可以当一电脑来用了(linux系统), 速度还很快呢! 树莓的英文全名是Raspberry Pi 2Model B,在中国,大家
    发表于 02-22 09:51

    【创龙AM4379 Cortex-A9申请】无人机无线追踪系统

    申请理由:我们已经实现简单的追踪,但是由于我们采用的是树莓3,板子不提供PWM,所以我们通过树莓
    发表于 06-03 14:00

    树莓opencv的程序效果不是很好

    本人在做树莓B+跑opencv的任务,将vs写好的程序移植到树莓中,通过cmake将程序编译出来运行,发现处理效果不是很好,用u***摄
    发表于 04-13 02:14

    树莓与Arduino实现药板自助取药

    树莓与Arduino实现药板自助取药准备工作树莓安装Opencv库Arduino 串口开启准
    发表于 09-02 06:50

    树莓的智能语音控制系统

    近几年,随着科技迅速发展,智能语音在现实生活中的普及率越来越高,特别是语音识别、语音合成、语音对话、语音控制等方面。树莓的智能语音控制系统,该系统使用麦克风对语音进行采集,通过调用语
    发表于 09-07 08:55

    怎么实现树莓Pico电机运动控制MicroPython+pioasm编程?

    怎么实现树莓Pico电机运动控制MicroPython+pioasm编程?
    发表于 10-27 06:37

    树莓3硬件配置_树莓3都能装什么系统_树莓3系统安装教程

    树莓3一直颇受电子发烧友的青睐,这篇文章主要讨论的就是树莓3的硬件配置、树莓3都能装什么
    发表于 12-08 14:36 ?2.7w次阅读

    微雪电子树莓扩展板|Pan-Tilt HAT介绍

     我是专为树莓设计的两自由度扩展板,板载PCA9685芯片和TSL2581环境光传感器,通过I2C接口控制即可实现
    的头像 发表于 11-11 14:24 ?4025次阅读
    微雪电子<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>云</b><b class='flag-5'>台</b>扩展板|Pan-Tilt HAT介绍

    树莓-搭建边缘计算平台

    基于树莓搭建边缘计算平台
    的头像 发表于 12-03 00:17 ?2064次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>-搭建边缘计算<b class='flag-5'>云</b>平台

    树莓运动跟踪枪炮塔

    电子发烧友网站提供《树莓运动跟踪枪炮塔.zip》资料免费下载
    发表于 07-03 09:49 ?1次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>运动</b>跟踪枪炮塔

    如何使用树莓+OpenCV实现姿态估计和面部特征点追踪

    大家好,这是一个树莓OpenCV的连载专题。使用树莓OpenCV
    的头像 发表于 08-13 17:44 ?179次阅读
    如何使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>+<b class='flag-5'>OpenCV</b><b class='flag-5'>实现</b>姿态估计和<b class='flag-5'>面部</b>特征点<b class='flag-5'>追踪</b>?