树莓派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 division

import 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=100

pid_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 found
    if 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-160
        pid_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_x
        pid_lastError_y = pid_thisError_y
        
        pid_XP=pwm_x/100
        pid_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=650
        if pid_X_P<0:
            pid_X_P=0
        if pid_Y_P>650:
            pid_Y_P=650
        if 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) & 0xFF
    if 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Seata应用侧启动过程剖析——RM TM如何与TC建立连接

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata应用侧启动过程剖析——RM & TM如何与TC建立连接 前言 看过官网 README 的第…

Python | Leetcode Python题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution(object):def containsDuplicate(self, nums):if len(set(nums)) ! len(nums):return Trueelse:return False

TCP一定可靠吗

背景 公司某个服务发送TCP报文后,得到的响应是非预期数据 原因竟然是:TCP包的 payload 数据某个bit位被翻转,但是 checksum 的值一样,错误的包被分发给了上层服务 Checksum介绍 IP 头有自己的 Checksum,TCP、UDP 也有自己的 Checksum,分别校验不同部分的数据 IP 头的 …

赛元单片机开发工具SOC_Programming_Tool_Enhance_V1.50 分享

下载地址&#xff1a; SOC_Programming_Tool_Enhance_V1.50(LIB0D30).rar: https://545c.com/f/45573183-1320016694-557ebd?p7526 (访问密码: 7526)

使用Spring Boot和自定义缓存注解优化应用性能

在现代应用开发中&#xff0c;缓存是提高系统性能和响应速度的关键技术之一。Spring Boot提供了强大的缓存支持&#xff0c;但有时我们需要更灵活的缓存控制。本文将介绍如何使用Spring Boot和自定义缓存注解来优化应用性能。 1. 为什么需要自定义缓存注解&#xff1f; Sprin…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#xff01;&#xff01;&#xff01;感谢支持&#xff01;&#xff01;&#xff01;

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

Vue3中生成本地pdf并下载

1. 前言 前端中经常会遇到在系统中根据数据导出一个pdf文件出来,一般都是后端来实现的,既然后端可以实现,前端为什么就不行呢,正好有一次也写了这个需求,就写了个小demo 示例图: 2. 实现步骤 首先下载html2pdf.js这个库yarn add html2pdf.js // 或 npm i html2pdf.js在项…

欧洲杯数据控@20240706

点击标题下「蓝色微信名」可快速关注 上半区西班牙、法国脱颖而出&#xff0c;将会争夺一个决赛的席位&#xff0c;下半区两场比赛&#xff0c;将会决出另外两支进入半决赛的球队&#xff0c; 今日射手榜&#xff0c;随着球队的淘汰&#xff0c;能争夺金靴的球员越来越少了&…

17.优化算法之解决拓扑排序4

0.基础 1.课程表1 207. 课程表 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canFinish(int n, int[][] p) {// 1. 准备⼯作int[] in new int[n]; // 统计每⼀个顶点的⼊度Map<Integer, List<Integer>> edges new HashMap<>…

整洁架构SOLID-开闭原则(OCP)

文章目录 1 定义2 最佳实践2.1 需求2.2 需求变更2.3 变更原则2.4 实现逻辑2.4.1 组件化2.4.2 组件关系 2.5 依赖方向的控制 3 本章小结 1 定义 开闭原则(OCP)是Bertrand Meyer在1988年提出的&#xff0c;该设计原则认为&#xff1a; 设计良好的计算机软件应该易于扩展&#xf…

认识并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享说前端面试的时候遇到了关于webSocket的问题&#xff0c;一看自己都没见过这个知识点&#xff0c;赶紧学习一下&#xff0c;在此记录&#xff01; WebSocket 是一种网络通信协议&#xff0c;提供了全双工通信渠道&#xff0c;即客户端和服…

Unity3D游戏 RPG

丛林探险游戏 人物进行探险游戏 拥有登录&#xff0c;首页&#xff0c;3D物体旋转浏览的功能&#xff0c;还能进行种植树等功能

GD32 MCU ADC采样率如何计算?

大家在使用ADC采样的时候是否计算过ADC的采样率&#xff0c;这个问题非常关键&#xff01; 以下为GD32F303系列MCU中有关ADC的参数&#xff0c;其中ADC时钟最大值为40MHz&#xff0c;12位分辨率下最大采样率为2.86MSPS.如果ADC时钟超频的话&#xff0c;可能会造成ADC采样异常&…

【总线】AXI4第七课时:AXI的额外的控制信息(PROT和CACHE)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

STM32F103C8T6核心板原理图和PCB分享

PCB图 原理图 资料下载地址&#xff1a; 原理图PCB库: https://545c.com/d/45573183-61875742-29897c?p7526 (访问密码: 7526)

第3章.中央服务器的物联网模式--企业系统集成

为了从物联网实施中获得最大价值&#xff0c;物联网系统需要与企业中的现有软件系统集成。事实上&#xff0c;与外部系统的集成允许网络世界和物理世界之间的交互——代表物理世界的物联网系统和驻留在网络/虚拟世界中的外部系统。用于此模式的符号如下图所示&#xff1a; 图3.…

mac怎么压缩pdf文件大小,mac压缩pdf文件大小不改变清晰度

在数字化时代&#xff0c;pdf格式因其良好的兼容性和稳定性&#xff0c;成为了文档分享和传输的首选。然而&#xff0c;随着文件内容的丰富&#xff0c;pdf文件的体积也越来越大&#xff0c;给存储和传输带来了不小的困扰。本文将揭秘几种简单有效的pdf文件压缩方法&#xff0c…

图神经网络实战(16)——经典图生成算法

图神经网络实战&#xff08;16&#xff09;——经典图生成算法 0. 前言1. 图生成技术2. Erdős–Rnyi模型3. 小世界模型小结系列链接 0. 前言 图生成算法是指用于创建模拟图或网络结构的算法&#xff0c;这些算法可以根据特定的规则和概率分布生成具有特定属性的图&#xff0c…