巡线功能模块

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. 基于近红外与可见光双目摄像头的人脸识别与活体检测,文末附Demo

    基于近红外与可见光双目摄像头的活体人脸检测原理 人脸活体检测(Face Anti-Spoofing)是人脸识别系统中的重要一环,它负责验证捕捉到的人脸是否为真实活体,以抵御各种伪造攻击,如彩色纸张打印 ...

  2. 最新版 Proteus 8.15 Professional 图文安装教程(附安装包)

    前言 大家好,我是梁国庆. Proteus 是世界上唯一将电路仿真软件.PCB设计软件和虚拟模型仿真软件三合一的设计平台. 本篇博主将手把手带领大家安装最新版 Proteus 8.15. 若图片加载超 ...

  3. liunx服务器某个Java运行服务CPU占用率过高问题排查及修复

    进入服务器 用 top 命令查看 top top - 09:57:55 up 40 days, 22:05, 9 users, load average: 4.44, 4.03, 3.85 Tasks ...

  4. 查看oracle数据库编码格式;ORACLE数据库NLS_CHARACTERSET和NLS_NCHAR_CHARACTERSET区别

    查看Oracle数据库字符编码格式得方法,有以下两种,第二种方法有注释,第一种没有Select * from nls_database_parameter;Select * from sys.prop ...

  5. 「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)

      为了让学习的知识融汇贯通,目前是把所有的集群都放在了一个虚拟机上,如果这个虚拟机宕机了怎么办?俗话说鸡蛋不要都放在一个篮子里面,把各种集群的节点拆分部署,应该把各种节点分机器部署,多个宿主机,这样 ...

  6. 【docker】如何将服务器加入集群,成为子节点

    需求:将服务器加入集群,成为集群中的图一.png (18.95 KB, 下载次数: 0) 图一 图二.png (10.92 KB, 下载次数: 0) 图二 图三.png (26.71 KB, 下载次数 ...

  7. burp suite使用(一) --- 抓包,截包,改包

    接下来我将以一个新手的角度讲述如何使用burp来抓包,截包和改包. 我采用的是UC浏览器来配合burp的使用. 1.设置浏览器 设置---其他---更改代理设置 由于UC浏览器采用的是ie的内核,所以 ...

  8. 使用PowerPoint优雅地更改证件照底色

    使用PowerPoint优雅地更改证件照底色 首先我们打开一张空白的演示文稿,并将要修改的证件照进行粘贴.(图片来自窝窝摄影,侵删) 选中图片,点击 格式,再点击 删除背景. 点击标记要保留的区域,对 ...

  9. 【安卓】使用Handler出现的警告

    使用Handler出现的警告 零.原由 安卓中使用Hander时出现了如下警告: This Handler class should be static or leaks might occur (a ...

  10. Try .NET & Github Gist

    Try .NET Try .NET 是微软最近推出的在线 C# 运行环境,不用安装 Visual Studio 等,就可以直接上手写 C# 代码. 可以先进来写两行代码看看 https://try.d ...