巡线功能模块

from maix import camera, display, gpio, pwm

class FindLine():

    def __init__(self):
self.THRESHOLD = (4, 53, -99, 87, -72, 70) # 黑色
self.roi = [(i*48, j*48, 48, 48) for i in range(5) for j in range(5)]
self.round = 0 # 定义走了几圈
# 左轮
self.left_round_1 = gpio.gpio(0, "H", 1)
self.left_round_2 = gpio.gpio(1, "H", 1)
self.left_pwm = pwm.PWM(6)
# 右轮
self.right_round_1 = gpio.gpio(2, "H", 1)
self.right_round_2 = gpio.gpio(3, "H", 1)
self.right_pwm = pwm.PWM(7)
# PWM数据初始化
self.forward = 10000000
self.fast = 7000000
self.slow = 13000000
# 激活
self.left_pwm.export()
self.right_pwm.export()
self.left_pwm.period = 20000000
self.right_pwm.period = 20000000
self.left_pwm.duty_cycle = self.forward
self.right_pwm.duty_cycle = self.forward
self.left_pwm.enable = True
self.right_pwm.enable = True def forward_move(self):
self.left_pwm.duty_cycle = self.forward
self.right_pwm.duty_cycle = self.forward def left(self):
self.left_pwm.duty_cycle = self.slow
self.right_pwm.duty_cycle = self.fast
def right(self):
self.left_pwm.duty_cycle = self.fast
self.right_pwm.duty_cycle = self.slow # 获取黑线中心
def get_black_center(self, img, roi):
most_pixels = 0
max_x = 0
if img:
blob0 = img.find_blobs([self.THRESHOLD], roi=roi, pixels_threshold=100, area_threshold=100, merge=True)
if blob0:
for n in range(len(blob0)):
if blob0[n]["pixels"] > most_pixels:
most_pixels = blob0[n]["pixels"]
max_x = n
return blob0[max_x]["x"] + int(blob0[max_x]["w"] / 2), blob0[max_x]["y"] + int(blob0[max_x]["h"] / 2)
else:
return 0
else:
return 0 # 连线函数(可用可不用,看性能)
def connect_line(self, img, dot_list):
x_orl = 0
y_orl = 0
c = 0
for i in dot_list:
if i == 0:
continue
else:
if c != 0:
img.draw_line(x_orl, y_orl, i[0],
i[1], color=(255, 0, 0), thickness=1)
c = 1
x_orl = i[0]
y_orl = i[1]
return img # 扫描停止标志
def stop_sign(self, img):
flag = 0
roi_list = [(40, 190, 60, 50), (140, 190, 60, 50)]
max_num_list = []
for roi in roi_list:
max_num = img.get_statistics(roi=roi)[0] # 获取图像中的平均数
max_num_list.append(max_num)
for i in max_num_list:
if i > 50:
flag = 1
return flag # 识别进分叉
def bifurcate_identify(self, img):
flag = 0
roi = (48, 30, 48, 48)
max_num = img.get_statistics(roi=roi)[0] # 获取图像中的平均数
if max_num < 50:
flag = 1
return flag # 向左拐进内圈
def turn_left(self, img):
dot_list = []
roi = [(0, i * 48, 120, 48) for i in range(5)] # 左边大半块
for i in range(5):
roii = roi[i]
dot_list.append(self.get_black_center(img, roii))
for j in dot_list:
if j == 0:
continue
else:
img.draw_circle(j[0], j[1], 4, color=(255, 255, 255), thickness=1)
if dot_list == [0, 0, 0, 0, 0]:
count = 0
count_num = 0
for i in dot_list:
if i == 0:
continue
count_num += 1
count += i[0]
if count_num != 0:
x_middle = int(count / count_num)
else:
x_middle = 60
else:
x_middle = 60
img = self.connect_line(img, dot_list)
display.show(img)
return x_middle # 前进函数
def move_forward(self, img):
dot_list = []
roi = [(90, i * 48, 60, 48) for i in range(5)] # 中间
for i in range(5):
roii = roi[i]
dot_list.append(self.get_black_center(img, roii))
for j in dot_list:
if j == 0:
continue
else:
img.draw_circle(j[0], j[1], 4, color=(255, 255, 255), thickness=1)
if dot_list == [0, 0, 0, 0, 0]:
count = 0
count_num = 0
for i in dot_list:
if i == 0:
continue
count_num += 1
count += i[0]
if count_num != 0:
x_middle = int(count / count_num)
else:
x_middle = 120
else:
x_middle = 120
img = self.connect_line(img, dot_list)
display.show(img)
return x_middle # 检测右边还有没有线(判断是否进入内圈)
def detect_whether_into_inner(self, img):
yes_inner = 0
roi = [(150, i * 48, 90, 48) for i in range(5)] # 左边大半块
for i in range(5):
roii = roi[i]
flag = self.get_black_center(img, roii)
if flag:
yes_inner = 1
break
return yes_inner def run(self):
while 1:
img = camera.capture()
# 逻辑函数自己写喽,想怎么处理自己决定 if __name__ == '__main__':
findline = FindLine()
findline.run()

基本都封装好了,想怎么用调用相应的函数即可,注意一下ROI区域在屏幕中的位置就行,可能反过来

注:硬件Maix ii dock (v831)

2022 电赛C题 巡线基础模块代码(带控制)的更多相关文章

  1. TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)

    配置 第一步:右击工程,选择Options 第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231 第三步:在Debugger里选择FE ...

  2. 【系列】关于NJUPT电赛自控方向第一次积分赛的总结

    本人是NJUPT电子科学与技术专业大一摸鱼狗一枚.本博客旨在总结与分享个人准备电赛所学知识,同时也是为了防止遗忘,锻炼写文章的能力.目前电赛方向为自控方向.主要研究方向为单片机.图像处理.自动控制相关 ...

  3. 2017年第六届数学中国数学建模国际赛(小美赛)C题解题思路

    这篇文章主要是介绍下C题的解题思路,首先我们对这道C题进行一个整体的概括,结构如下: C题:经济类 第一问:发现危险人群. 发现:欺诈的方式开始.雇佣或浪漫的承诺. 数据→确定特定的经济萧条地区→确定 ...

  4. 杭电acm刷题顺序

    最近兴趣来了,闲暇之余,回顾大学期间刷过的杭电acm那些入门级别的题,以此巩固基础知识! 以下参考刷题顺序,避免入坑 原文传送门:https://blog.csdn.net/liuqiyao_01/a ...

  5. 4. K线基础知识

    1. K线基础知识 K线又叫阴阳线.蜡烛图.最早由日本米市商人发明,后来推广应用到金融行情价格的分析. K线图的构造主要包含四个价格因素:开盘价.收盘价.最高价.最低价 2. K线图例 收盘价高于开盘 ...

  6. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  7. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  8. 2013年省赛H题

    2013年省赛H题你不能每次都快速幂算A^x,优化就是预处理,把10^9预处理成10^5和10^4.想法真的是非常巧妙啊N=100000构造两个数组,f1[N],间隔为Af2[1e4]间隔为A^N,中 ...

  9. 2013年省赛I题 Thrall’s Dream

    2013年省赛I题判断单向联通,用bfs剪枝:从小到大跑,如果遇到之前跑过的点(也就是编号小于当前点的点),就o(n)传递关系. bfs #include<iostream> #inclu ...

  10. HEX SDUT 3896 17年山东省赛D题

    HEX SDUT 3896 17年山东省赛D题这个题是从矩形的左下角走到右上角的方案数的变形题,看来我对以前做过的题理解还不是太深,或者是忘了.对于这种题目,直接分析它的性质就完事了.从(1,1)走到 ...

随机推荐

  1. excel怎么根据数值做进度条

    开始->条件格式->数据条

  2. 五大股票金融数据API接口推荐:从实时行情到历史数据全覆盖

    摘要:本文将介绍五大主流的股票金融数据API接口,涵盖实时行情.历史数据.技术指标等功能,帮助开发者快速构建金融数据应用.(本文由deepseek生成) 一.StockTV API 1. 核心优势 全 ...

  3. 在Linux中查看分区表的4种方法

    作为Linux管理员,我们需要一次又一次地查看硬盘的分区表.这有助于我们通过为进一步分区腾出空间来重新组织旧驱动器,并在必要时为新驱动器创建空间.您可以在硬盘上创建不超过四个主分区,但可以在多个逻辑分 ...

  4. Docker管理面板系列——Portainer

    一.介绍 Portainer是个轻量级的Docker管理面板,和Rancher这种重量级选手没法比,Portainer倾向于单机的管理(后来发现能够添加多个单机节点切换着管理),当然,在Docker搞 ...

  5. 官方的 MCP C# SDK:csharp-sdk

    csharp-sdk 这是 Model Context Protocol(MCP)官方提供的 C# SDK,为 MCP 服务器和客户端提供简单易用的接口, 主要由微软维护.MCP 是由 Claude( ...

  6. 【Python】导出docx格式Word文档中的文本、图片和附件等

    [Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...

  7. udl(Universal Data Link)通用数据连接文件

    新建文本文档 更改后缀名为.udl(注意小点) 然后打开运行 配置并测试 改回后缀名.txt(有个小点哦) 打开就是了

  8. 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理

    <机器人SLAM导航核心技术与实战>第1季:第3章_OpenCV图像处理 视频讲解 [第1季]3.第3章_OpenCV图像处理-视频讲解 [第1季]3.1.第3章_OpenCV图像处理_认 ...

  9. Linux 关机与重启命令

    关机命令 我们可以使用以下三种命令来关机 Linux : 1.立刻关机(需要root用户) shutdown -h now 10 分钟后自动关机 shutdown -h 10 2.立刻关机 halt ...

  10. eolinker校验规则之正则匹配:返回结果校验的方法和案例(正则校验)

    如上图红色箭头,需要校验返回值内是否包含"创建满足条件的优惠券"这一内容 如果需要满足以上校验,最好的方法就是使用正则进行匹配 切换到正则匹配,输入需要校验的内容,即可实现正则匹配 ...