树莓派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.mzph.cn/pingmian/44971.shtml

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

相关文章

【数据结构】排序——快速排序

前言 本篇博客我们继续介绍一种排序——快速排序&#xff0c;让我们看看快速排序是怎么实现的 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 …

前端JS特效第30波:jquery图片列表按顺序分类排列图片组效果

jquery图片列表按顺序分类排列图片组效果&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &…

Profibus协议转Profinet协议网关模块连接智能电表通讯案例

一、背景 在工业自动化领域&#xff0c;Profibus协议和Profinet协议是两种常见的工业通讯协议&#xff0c;而连接智能电表需要用到这两种协议之间的网关模块。本文将通过一个实际案例&#xff0c;详细介绍如何使用Profibus转Profinet模块&#xff08;XD-PNPBM20&#xff09;实…

vue2 实现原生 WebSocket

原生WebSocket&#xff1a; new WebSocket WebSocket | ThinkTS官网 export default {data() {return {socket: null};},created() {// 1. 创建 WebSocket 实例this.socket new WebSocket(ws://localhost:3000);// 2. 监听 WebSocket 连接打开事件this.socket.onopen () &g…

MySQL常见的几种索引类型及对应的应用场景

MySQL 提供了多种索引类型&#xff0c;每种索引类型都有其特定的应用场景和优势。以下是 MySQL 中常见的几种索引类型及其具体应用场景&#xff1a; 1. B-Tree 索引 特点&#xff1a; B-Tree&#xff08;Balanced Tree&#xff0c;平衡树&#xff09;是 MySQL 的默认索引类型…

启航IT之旅:为新生绘制的学习路线图

随着七月的热浪悄悄席卷而来&#xff0c;各地高考成绩陆续放榜&#xff0c;对于刚迈过高考这座独木桥的你们&#xff0c;这不仅仅是一个故事的终章&#xff0c;更是另一段冒险的序曲。特别是那些心中有一团IT火焰燃烧的少年们&#xff0c;暑假的钟声已经敲响&#xff0c;是时候…

坑3.上传图片(阿里云空间,oss验证)(未验证)

笔记 20240710 未验证&#xff0c;现在还没有阿里云空间&#xff0c;等买个sit环境就可以验证一下。 前端 页面 <!--页面--> <el-form-item label"优惠券图片" prop"couponImg"><single-upload v-model"dataForm.couponImg"&g…

2493-04A-6 同轴连接器

型号简介 2493-04A-6是Southwest Microwave的连接器。该连接器是一种端子连接器&#xff0c;采用 1.0 毫米插头&#xff08;公头&#xff09;进行连接。它由多个部件组成&#xff0c;包括过渡块、接地板、螺纹夹紧板、发射针、冷板、底座、电路板和外壳等。 型号特点 外壳&…

【数据结构】深入理解哈希及其底层数据结构

目录 一、unordered系列关联式容器 二、底层结构 2.1 哈希的概念 2.2 哈希冲突&#xff08;哈希碰撞&#xff09; 2.3 哈希函数 2.4 哈希冲突处理 2.4.1 闭散列&#xff08;开放定址法&#xff09; 2.4.1.1 代码实现&#xff1a; 2.4.2 开散列&#xff08;链地址法&…

Visual Studio 2022 安装及使用

一、下载及安装 VS 官网&#xff1a;Visual Studio: IDE and Code Editor for Software Developers and Teams 下载免费的社区版 得到一个.exe文件 右键安装 选择C开发&#xff0c;并修改安装位置 等待安装 点击启动 二、VS的使用 1.创建项目 打开VS&#xff0c;点击创建新项…

Python爬虫教程第6篇-使用session发起请求

为什么要使用session 前面介绍了如何使用reqesuts发起请求&#xff0c;今天介绍如何使用session发起请求。session简单理解就是一种会话机制&#xff0c;在浏览器中我们登录完之后&#xff0c;后面再请求服务数据都不需要再登录了&#xff0c;以为Cookie里已经保存了你的会话状…

【Cesium开发实战】火灾疏散功能的实现,可设置火源点、疏散路径、疏散人数

Cesium有很多很强大的功能&#xff0c;可以在地球上实现很多炫酷的3D效果。今天给大家分享一个可自定义的火灾疏散人群的功能。 1.话不多说&#xff0c;先展示 火灾疏散模拟 2.设计思路 根据项目需求要求&#xff0c;可设置火源点、绘制逃生路线、可设置逃生人数。所以点击火…

荷兰花海元宇宙的探索

在数字科技日新月异的今天&#xff0c;我们有幸见证了一个全新的概念——元宇宙的诞生。元宇宙是一个虚拟世界&#xff0c;它通过高科技手段&#xff0c;将现实世界的各种元素和场景数字化&#xff0c;使人们能够在虚拟世界中体验现实世界的生活。而在这个虚拟世界中&#xff0…

java设计模式(十六)职责链模式(Chain of Responsibility Pattern)

1、模式介绍&#xff1a; 职责链模式是一种行为设计模式&#xff0c;其中多个对象按顺序处理请求&#xff0c;直到其中一个对象能够处理请求为止。请求沿着链传递&#xff0c;直到有一个对象处理它为止。 2、应用场景&#xff1a; 职责链模式适用于以下场景&#xff1a;请求…

初学51单片机之UART串口通信

CSDN其他博主的博文&#xff08;自用&#xff09;嵌入式学习笔记9-51单片机UART串口通信_51uart串口通讯-CSDN博客 CSDN其他博主的博文写的蛮好&#xff0c;如果你想了解51单片机UART串口可以点进去看看&#xff1a; UART全称Universal Asynchronous Receiver/Transmitter即通…

常用知识碎片 分页组件的使用(arco-design组件库)

目录 分页组件使用 API 组件代码示例 使用思路&#xff1a; 前端示例代码 html script 后端示例代码 Controller Impl xml 总结 分页组件使用 使用Arco Design之前需要配置好搭建前端环境可以看我另外一篇文章&#xff1a; 手把手教你 创建Vue项目并引入Arco Desi…

生存人数00

题目链接 生存人数 题目描述 注意点 假设所有人都出生于 1900 年至 2000 年&#xff08;含 1900 和 2000 &#xff09;之间birth[i] < death[i]如果有多个年份生存人数相同且均为最大值&#xff0c;输出其中最小的年份 解答思路 初始想到的是遍历birth&#xff0c;更新…

正则表达式语法

普通字符&#xff1a; 匹配 "a" 将匹配文本中的 "a" 字符: 示例: a 匹配 "a" 元字符&#xff1a; \d 匹配 任意数字字符 等价于 [0-9] : 示例: \d 匹配 "1" \D 匹配一个非数字字符 等价于 [^0-9] \w 匹配 任意字母数字字符: 示例:…

B2B领域的客户裂变策略:打造行业内的共赢生态

在日益竞争激烈的B2B市场中&#xff0c;客户裂变作为一种高效的增长策略&#xff0c;不仅能够帮助企业快速扩大客户基础&#xff0c;还能促进行业内资源共享与合作&#xff0c;共同构建一个健康、可持续的共赢生态。本文将探讨B2B领域实施客户裂变策略的关键要素&#xff0c;以…