K210学习笔记——三角函数下的目标追踪

各位正在读文章的朋友们你们好,本人为非专业学生,如有不对的地方,期待您的指正。

目标追踪的意思是:识别到目标物体,通过舵机转动,朝向目标物体.

实验器材:二自由度舵机云台加两个SG90舵机,K210。

实验分两步走:一是识别到目标物体,二是识别到色块后返回色块位置坐标,进而控制舵机转动指向目标物体。

一:识别目标色块——image.find_blobs函数:

识别颜色方块,在编程环境中,打开工具中的机器视觉、阈值管理器,在网上找一个颜色方块,或者在缓冲区内,选择最佳的颜色跟踪阈值,通过不断调整,使目标物体在二进制图像中呈现白色,其余为黑色。下面的一串数字即为目标物体特定的颜色阈值。

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

image.find_blobs()函数用来识别目标色块。

thresholds为目标色块的颜色阈值。

roi为感兴趣区,我这里只有一个色块,所以不用理它。

x_stride和y_stride分别是查找的色块在x,y方向上的最小宽度的像素。结合实际摄像头到目标色块的距离,设置它的大小,可排除一些误差。

通过此函数,可以获取以下的值:

blobs[0] = 色块外框的X坐标,blobs[1] = 色块外框的Y坐标,blobs[2] = 色块外框的宽度,blobs[3] = 色块外框的高度,blobs[4] = 色块外框的像素数量,blobs[5] = 色块外框的中心点横坐标,blobs[6] = 色块外框的中心点纵坐标。

利用这些值,我们可以在显示屏上“圈住”目标色块、在旁边写单词,画中心叉等。

最重要的就是获取中心点横纵坐标(blobs[5],blobs[6]),用它们来确定色块的位置。

舵机的转动——Servo函数:

舵机的转动是由PWM控制的,利用内部的定时器生成20ms为一个周期的脉冲,只有在此周期下,SG90舵机才能工作,另通过定时器控制高电平的占空比,函数是打包好的,直接就拿来用了。

def Servo(servo,angle):S1.duty((angle+90)/180*10+2.5)

比如输入angle = 0 则S1.duty(7.5),对应上图 0度在20ms的工作脉冲中为7.5%的占空比。

总:

import sensor,image,lcd,time
import math
from machine import Timer,PWM
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)//自由映射在17引脚
S2 = PWM(tim, freq=50, duty=0, pin=15)//自由映射在15引脚def Servo(servo,angle):S1.duty((angle+90)/180*10+2.5)lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_exposure(1)
sensor.set_auto_gain(1)
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)red_threshold   = ((43, 66, 45, 107, 40, 1))bfive=[];bsix=[]
while True:img=sensor.snapshot()blobs = img.find_blobs([red_threshold],x_strides=100,y_strides=100)if blobs:for b in blobs:tmp=img.draw_rectangle(b[0:4],color=(225,225,225))##在图像上绘制一个矩形。tmp=img.draw_string(b[0],(b[1]-10),"BOX",color=(0,0,255))tmp=img.draw_cross(b[5], b[6])##画十字交叉bfive.append(b[5]);bsix.append(b[6])if len(bfive)==50 and len(bsix)==50:hengzuobiao=max(bfive,key=bfive.count)zongzuobiao=max(bsix,key=bsix.count) print("中心点横坐标为",hengzuobiao)print("中心点纵坐标为",zongzuobiao)x = hengzuobiaoy = 240 - zongzuobiao ##相对于舵机云台b = 300               ##b为平台到图像之间的距离,假设为300(尚未搭建实验台)a = math.sqrt(b*b+(160-x)*(160-x))if x <= 160:jiaoA = math.degrees(math.atan((160-x)/b))##角a为水平方向舵机偏转角度,b为舵机云台到图像的距离,为固定已知值jiaoB = math.degrees(math.atan(y/a))      ##角c为垂直方向偏转角度else:jiaoA = -math.degrees((math.atan((x-160)/b)))jiaoB = math.degrees(math.atan(y/a))bfive=[];bsix=[]print("水平方向舵机应偏转角度为:",jiaoA,"度")print("垂直方向舵机应偏转角度为:",jiaoB,"度")Servo(S1,jiaoA)time.sleep(1)Servo(S2,jiaoB)time.sleep(1)Servo(S1,-jiaoA)Servo(S2,-jiaoB)##复位lcd.display(img)

math.atan()求出反三角正切值,math.degrees()将弧度制转化为角度值。

注意:

本实验因没有搭建实验台,有些数据是模拟的,若假设摄像截取的图片大小在真实平面中为320dm * 240dm,可参考上面代码,这样对应的坐标值就可以当作长度值用于计算。

垂直方向的舵机起并不是在X-Y平面上的,包括水平方向也是的,有一定高度。

舵机云台放置在正对拍摄面(X-Y),居中位置.

K210返回的坐标值是左上角为原点,水平向右为X轴正方向,垂直向下为Y轴正方向。

实验现象:

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

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

相关文章

Vue2项目练手——通用后台管理项目第四节

Vue2项目练手——通用后台管理项目 数据的请求mock数据模拟实战文件目录src/api/mock.jssrc/api/mockServeData/home.jsmain.js 首页组件布局可视化图表可视化图表布局Home.vue echarts表Home.vue 数据的请求 mock数据模拟实战 mock官方文档 前端用来模拟后端接口的工具&…

uni-app语音转文字功能demo(同声传译)

目录 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 在文件中开始引用&#xff1a; 首先去微信开发者官网申请一下同声传译的插件 微信公众平台 后续使用的时候可以看详情里面的信息进行使用 在文件中开始引用&#xff1a; 注意&#xff01;&#xff01;在这个…

为XDR扩展威胁检测响应提供响应解决方案

安全层面最本质的问题是检测与响应&#xff0c;而当前的检测与响应&#xff0c;还存在着一些痛点和难点亟需解决&#xff0c;响应运营层面仍存在着一些挑战。 各类安全防护设备每天会产生大量的安全告警&#xff0c;使得安全分析人员绝大部分时间和精力都“消耗”在告警信息中…

Mysql--技术文档--B+树-数据结构的认知

阿丹解读&#xff1a; 之前的文章中写道了有关mysql底层索引&#xff0c;那么在数据量特别大的情况下。mysql采用了B来管理索引。和存储的数据。 Mysql--技术文档--索引-《索引为什么查找数据快&#xff1f;》-超底层详细说明索引_一单成的博客-CSDN博客 B树解读&#xff1a…

flask中的操作数据库的插件Flask-SQLAlchemy

1、ORM 框架 Web 开发中&#xff0c;一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了&#xff0c;也称 SQL 数据库。另外&#xff0c;文档数据库&#xff08;如 mongodb&#xff09;、键值对数据库&#xff08;如 redis&#xff09;近几年也逐渐在 w…

sql:SQL优化知识点记录(十二)

&#xff08;1&#xff09;读锁案例讲解 加读锁和写锁 查看是否上锁&#xff1a;In_use&#xff1a;变成了1 读写锁对我们数据产生哪些影响&#xff1a; 读锁&#xff1a;是共享锁&#xff0c;其他线程可以查看&#xff1a; 加了读锁&#xff1a;session1不能修改自己&#xf…

使用Vue3和Vite升级你的Vue2+Webpack项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法&#xff0c;Opencv图像暗通道调优&#xff0c;&#xff08;清华版代码&#xff09;对普通相片也有较好的调优效果&#xff0c;相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解&#xff0c;实际效果是对图像的三个颜色通道…

React三属性之:refs

作用 refs是为了获取节点,使用场景主要在需要操作dom的时候,比如echarts,就需要真实的dom节点 使用 import React from "react"; class RefsTest extends React.Component{state {value:输入框的值}refPlan React.createRef()logRef ()>{console.log(this.r…

重拾html5

新增的position: sticky; 基于用户的滚动位置来定位&#xff0c;粘性定位的元素是依赖于用户的滚动&#xff0c;在 position:relative 与 position:fixed 定位之间切换。ie15以上的低版本不支持&#xff0c;Safari 需要使用 -webkit- prefix&#xff1b; vertical-align: midd…

WPF_布局基础

布局容器 Grid 定义由列和行组成的灵活的网格区域。 行 <Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions> 列 <Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDe…

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 前言&#xff…

【群答疑】jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参...

一个非常不错的问题&#xff0c;来检验下自己jmeter基本功 可能有同学没看懂题&#xff0c;这里再解释一下&#xff0c;上面问题需求是&#xff1a;jmeter关联获取上一个请求返回的字符串&#xff0c;分割后保存到数组&#xff0c;把数组元素依次作为下一个请求的入参 建议先自…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

在Linux系统启动java程序(jar包)

文章目录 1. mvn install生成jar包2. 利用ftp工具将jar包上传到linux服务器3. 在linux服务器上启动jar包3.1 直接启动jar包3.2 后台启动jar包3.3 后台不挂断启动jar包3.4 后台不挂断启动jar包并输出日志到指定文件3.5 其他 1. mvn install生成jar包 2. 利用ftp工具将jar包上传到…

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 &#xff08;1&#xff09;了解SQLite数据库的基本作用&#xff1b; &#xff08;2&#xff09;掌握数据库操作辅助类&#xff1a;SQLiteDatabase的使用&#xff1b; &#xff08;3&#xff09;可以使用命令操作SQLite数据库&#xff1b; …

Unity 编辑器资源导入处理函数 OnPostprocessTexture :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPostprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;我们可以使用编辑器资源导入处理函数&#xff08;OnPostprocessTexture&#xff09;来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&…

Liquid Studio 2023.2 Crack

Liquid Studio 提供了用于XML和JSON开发 的高级工具包以及Web 服务测试、数据映射和数据转换工具。 开发环境包含一整套用于设计 XML 和 JSON 数据结构和模式的工具。这些工具提供编辑、验证和高级转换功能。对于新手或专家来说&#xff0c;直观的界面和全面的功能将帮助您节省…

linux 进程管理命令

进程管理命令 查看进程命令 ps命令 显示系统上运行的进程列表 # 查看系统中所有正在运行的系统ps aux# 获取占用内存资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a;ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head# 获取占用CPU资源最多的10个进程&am…

C语言sizeof()计算空间大小为8的问题

在练习数据结构过程中&#xff0c;定义指针p&#xff0c;并且申请了10个char类型空间&#xff0c;但在计算p所指空间大小时候&#xff0c;发现了一些奇怪的现象。 #include <stdio.h> #include <stdlib.h>int main(){char s[12];printf("the size of memory …