树莓派4B_OpenCv学习笔记19:OpenCV舵机云台物体追踪

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

 Opencv 版本是4.5.1:

 Python 版本3.7.3:

​​

今日学习:OpenCV舵机云台物体追踪  代码是 创乐博的,本文只作解释分析......

前置学习条件如下:

IIC驱动_PCA9685(16路舵机驱动模块)     文章网址 如下:

树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)-CSDN博客

 Python多线程编程     文章网址 如下:

树莓派4B学习笔记14:Python多线程编程_线程间的同步通信_(锁‘threading.Lock’)_树莓派多线程-CSDN博客

文章提供测试代码讲解,整体代码贴出、测试效果图

目录

测试效果视频:

代码贴出:

例程测试步骤:

例程测试步骤相关工程下载:

网上查阅资料网址:


测试效果视频:

OpenCV舵机云台物体追踪

代码贴出:

# -*- coding: utf-8 -*-from __future__ import divisionimport time
import cv2
import numpy as np
import Adafruit_PCA9685
import RPi.GPIO as GPIO
import threading#初始化PCA9685和舵机
servo_pwm = Adafruit_PCA9685.PCA9685()  # 实例化舵机云台# 设置舵机初始值,可以根据自己的要求调试
servo_pwm.set_pwm_freq(60)  # 设置频率为60HZ
servo_pwm.set_pwm(5,0,325)  # 底座舵机
servo_pwm.set_pwm(4,0,325)  # 倾斜舵机
time.sleep(1)#初始化摄像头并设置阙值
usb_cap = cv2.VideoCapture(0)# 设置球体追踪的HSV值,上下限值
ball_yellow_lower=np.array([171,161,186])
ball_yellow_upper=np.array([178,188,255])# 设置显示的分辨率,设置为320×240 px
usb_cap.set(3, 320)
usb_cap.set(4, 240)#舵机云台的每个自由度需要4个变量
pid_thisError_x=500       #当前误差值
pid_lastError_x=100       #上一次误差值
pid_thisError_y=500
pid_lastError_y=100pid_x=0
pid_y=0# 舵机的转动角度
pid_Y_P = 325
pid_X_P = 325           #转动角度
pid_flag=0# initialize LED GPIO
redLed = 18    # LED灯
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(redLed, GPIO.OUT)# 舵机旋转
def Robot_servo(X_P,Y_P):servo_pwm.set_pwm(5,0,650-pid_X_P)servo_pwm.set_pwm(4,0,650-pid_Y_P)# 关闭LED
GPIO.output(redLed, GPIO.LOW)
ledOn = False# loop over the frames from the video stream
while True:ret,frame = usb_cap.read()#高斯模糊处理frame=cv2.GaussianBlur(frame,(5,5),0)hsv= cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#ROI及找到形态学找到小球进行处理mask=cv2.inRange(hsv,ball_yellow_lower,ball_yellow_upper) # 掩膜处理mask=cv2.erode(mask,None,iterations=2)mask=cv2.dilate(mask,None,iterations=2)mask=cv2.GaussianBlur(mask,(3,3),0)res=cv2.bitwise_and(frame,frame,mask=mask)cnts=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]  #发现小球# only proceed if at least one contour was foundif len(cnts) > 0:cap_cnt=max(cnts,key=cv2.contourArea)(pid_x,pid_y),radius=cv2.minEnclosingCircle(cap_cnt)cv2.circle(frame,(int(pid_x),int(pid_y)),int(radius),(255,0,255),2)       # 误差值处理pid_thisError_x=pid_x-160pid_thisError_y=pid_y-120#PID控制参数pwm_x = pid_thisError_x*3+1*(pid_thisError_x-pid_lastError_x)pwm_y = pid_thisError_y*3+1*(pid_thisError_y-pid_lastError_y)#迭代误差值操作pid_lastError_x = pid_thisError_xpid_lastError_y = pid_thisError_ypid_XP=pwm_x/100pid_YP=pwm_y/100# pid_X_P pid_Y_P 为最终PID值pid_X_P=pid_X_P+int(pid_XP)pid_Y_P=pid_Y_P+int(pid_YP)GPIO.output(redLed, GPIO.HIGH)#限值舵机在一定的范围之内if pid_X_P>650:pid_X_P=650if pid_X_P<0:pid_X_P=0if pid_Y_P>650:pid_Y_P=650if pid_X_P<0:pid_Y_p=0# 如果没有检测到球,关闭LED灯else:GPIO.output(redLed, GPIO.LOW)servo_tid=threading.Thread(target=Robot_servo,args=(pid_X_P,pid_Y_P))  # 多线程servo_tid.setDaemon(True)servo_tid.start()   # 开启线程cv2.imshow("MAKEROBO Robot", frame)  # 显示图像# 等待键盘输入,如果按下'q'则退出循环key = cv2.waitKey(1) & 0xFFif key == ord('q'):break    # do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff \n")
GPIO.cleanup()
cv2.destroyAllWindows()
usb_cap.stop()

例程测试步骤:

用到的程序会统一打包在文后下载

1、先拍摄一张照片,使用PS软件获取其BGR色域:78 54 208:

2、再转入HSV色域:(这是大致色域)

{165,100,100}

{185,255,255}

3、放入HSV程序进行微调:得到比较稳定色域:

{145,161,189}

{179,196,246}

4、将HSV色域填入程序:

然后就能进行测试了:

例程测试步骤相关工程下载:

https://download.csdn.net/download/qq_64257614/89521481?spm=1001.2014.3001.5503

网上查阅资料网址:

[树莓派基础]12.树莓派OpenCV舵机云台物体位置追踪_哔哩哔哩_bilibili

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

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

相关文章

RAG 工业落地方案框架(Qanything、RAGFlow、FastGPT、智谱RAG)细节比对!CVPR自动驾驶最in挑战赛赛道,全球冠军被算力选手夺走了

RAG 工业落地方案框架&#xff08;Qanything、RAGFlow、FastGPT、智谱RAG&#xff09;细节比对&#xff01;CVPR自动驾驶最in挑战赛赛道&#xff0c;全球冠军被算力选手夺走了。 本文详细比较了四种 RAG 工业落地方案 ——Qanything、RAGFlow、FastGPT 和智谱 RAG&#xff0c;重…

不仅是输出信息,console.log 也能玩出花

console.log 是 JavaScript 中一个常用的函数&#xff0c;用于向控制台输出信息。 console.log 虽然主要用于调试目的&#xff0c;但也包含了一些有趣的用法&#xff0c; console.log 不仅能输出文本&#xff0c;还能以更丰富的方式展示信息。 比如我们打开 B 站&#xff0c;然…

79. UE5 RPG 创建技能冷却和消耗

在这一篇里面&#xff0c;我们接着优化技能&#xff0c;现在角色添加的主动技能能够同步到ui上面。我们在这一篇文章里面&#xff0c;完善技能的消耗&#xff08;释放技能减少蓝量&#xff09;和冷却机制。 我们可以看到&#xff0c;在技能类默认值这里&#xff0c;可以设置它的…

【YashanDB知识库】YashanDB 开机自启

【问题分类】 YashanDB 开机自启 【关键字】 开机自启&#xff0c;依赖包 【问题描述】 数据库所在服务器重启后只拉起monit、yasom、yasom进程&#xff0c;缺少yasdb进程&#xff1a; 【问题原因分析】 数据库安装的时候未启动守护进程 【解决 / 规避方法】 进入数据库之前…

问题清除指南|Dell OptiPlex 7070 升级 win11 开启 TPM 2.0 教程

前言&#xff1a;最近想把实验室台式机的系统从 Windows 10 升级到 Windows 11&#xff0c;遇到一点小问题&#xff0c;在此记录一下解决办法。 ⚠️ 注&#xff1a;本教程仅在 Dell OptiPlex 7070 台式机系统中测试有效&#xff0c;并不保证其余型号机器适用此教程。 参考链接…

计算机网络体系结构解析

OSI参考模型 与 TCP/IP模型 如图所示 TCP/IP模型有几层 应用层&#xff1a;只需要专注于为用户提供应用功能 HTTP、SMTP、Telnet等&#xff0c;工作在操作系统中的用户态&#xff0c;传输层及以下工作在内核态传输层&#xff1a;为应用层提供网络支持&#xff08;TCP、UDP传…

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一&#xff0c;拆分配置集二&#xff0c;配置文件中配置多配置集1&#xff0c;引用多配置集2&#xff0c;验证 三&#xff0c;多配置集总结1&#xff0c;使用场景2&#xff0c;优先级 这一节介绍如何加载多个配置集。 大多数情况下&#xff0c;我们把配置全部放在一个…

Linux系统学习 —— 计算机基础(笔记篇)

一、电脑硬件 电脑硬件由输入&#xff0c;控制计算&#xff0c;输出三部分组成。 输入部分包括键鼠&#xff0c;读卡器&#xff08;外部接口&#xff09;&#xff0c;扫描仪&#xff08;打印机的扫描仪&#xff09;。计算控制部分包括CPU &#xff0c; 内存&#xff0c;硬盘&…

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作&#xff1a;将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作&#xff1a;…

『Django』自带的后台

theme: smartblue 本文简介 点赞 关注 收藏 学会了 上一篇讲了 Django 操作 MySQL 的方法&#xff0c;讲了如何创建模型&#xff0c;如何对数据库做增删改查的操作。但每次修改数据都要写代码&#xff0c;多少有点麻烦。 有没有简单一点的方法呢&#xff1f; 有的有的&#…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

C语言 结构体和共用体——结构体所占内存的字节数

目录 结构体所占内存的字节数 结构体所占内存的字节数

极验语序点选验证码识别(一)

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 极验文字点选验证码不必多说,很多小伙伴,借助标注工具或者打码平台标注完数据集后,使用开源的目标检测网络即可完成,欢迎收看我之前的文章: Pytorch利用ddddocr辅助识别点选验证码 或者使…

d3dcompiler_43.dll文件是什么?如何快速有效的解决d3dcompiler_43.dll文件丢失问题

dcompiler_43.dll 是一个Windows系统中的系统文件&#xff0c;属于DirectX软件的一部分。这个dcompiler_43.dll&#xff08;动态链接库&#xff09;文件主要用于处理与3D图形编程有关的任务&#xff0c;是运行许多游戏和高级图形程序必需的组件之一。那么如果电脑丢失d3dcompil…

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

使用 Unity OpenXR 实现Gaze眼部追踪 在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。 Unity …

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果&#xff0c;可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面&#xff0c;主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前&#xff0c;请确保…

聊聊大模型如何为敏捷研发提效

这是鼎叔的第一百零二篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版&#xff08;机械工业出版社&#xff…

红日靶场----(三)2.漏洞利用

上期的通过一句话木马实现对目标主机的持久后门 我使用的是蚁剑&#xff0c;蚁剑安装及使用参考&#xff1a; 下载地址&#xff1a; GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 安装即使用&#xff1a; 1. 快速入门 语雀 通过YXCMS的后台GETSHELL 利用…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

算法day03 桶排序 数据结构分类 时间复杂度 异或运算

学数据结构之前 必看_哔哩哔哩_bilibili 1.认识复杂度和简单排序算法_哔哩哔哩_bilibili 桶排序&#xff08;Bucket sort&#xff09;------时间复杂度为O(n)的排序方法&#xff08;一&#xff09;_多桶排序时间复杂度-CSDN博客 桶排序 测试场景&#xff1a;数组中有10000个随…