电赛滚球控制系统树莓派代码
电赛滚球控制系统树莓派代码
基础加发挥部分
图像二值化后,提取最大色块获得坐标即为小球坐标
只提取图像中间部分,避免外界非平板部分干扰
串口通信用的ttyUSB0口,直接一根数据线和stm32的串口1相连就可以了
连接屏幕可以展示效果,但也许有时候展示效果会耗时,建议到时候注释掉展示部分
#获取圆圈坐标并用串口通信将坐标r送到stm32进行处理
# -*- coding: utf-8 -*
import serial
import time
import cv2
import numpy as npcap = cv2.VideoCapture(0)
lower_red=np.array([156,43,46])
upper_red=np.array([180,255,255])def DisBall(x,y,r,frame):cv2.circle(frame, (x,y) , r , (0, 255, 0), 2)cv2.circle(frame, (x,y) , 2 , (0, 0, 255), 3)return framedef Binary_Get_Ball(frame,show,area,thr):cropped = frame[area[0]:area[1], area[2]:area[3]] #(上,下)(左,右)gray_img = cv2.cvtColor(cropped, cv2.COLOR_BGRA2GRAY)#图像灰度化ret,thresh=cv2.threshold(gray_img,thr[0],thr[1],cv2.THRESH_BINARY)thresh=255-threshcnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] #轮廓检测#如果存在轮廓 if len(cnts) > 0: #找到面积最大的轮廓 c = max(cnts, key = cv2.contourArea) #确定面积最大的轮廓的外接圆 ((center_x, center_y), radius) = cv2.minEnclosingCircle(c) if (show==True): cv2.circle(cropped, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2) cv2.circle(cropped, None, 5, (0, 0, 255), -1)print('红色色块的中心坐标',(int(center_x),int(center_y)))else:center_x=0center_y=0radius=0return center_x,center_y,radius,croppedif __name__=="__main__":# 打开串口ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.2)#剪切区域(上,下)(左,右)area=[40,435,155,540]#二值化阈值thr=[80,255]time1=time.time()while(1):ret, frame = cap.read()#得到小球坐标x,y,r,frame=Binary_Get_Ball(frame,show=True,area=area,thr=thr)time_change=time.time()-time1time_change=int(time_change*1000)print('time:'+str(time_change).rjust(3,'0'))#展示画圆效果x=int(x)y=int(y)r=int(r)frame = DisBall(x,y,r,frame)send_data='#'+str(x).rjust(3,'0')+str(y).rjust(3,'0')+str(time_change).rjust(3,'0') #起始标志'#',圆心的x和yser.write(send_data.encode("utf8"))print(send_data)if (x==0 and y==0 and r==0):passelse:time1=time.time()# 展示图片cv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF == ord('q'):# 存储图片cv2.imwrite("camera.jpg", frame)breakif ser != None:ser.close()cap.release()
cv2.destroyAllWindows()
发挥题其他:追光者(追踪红色激光)
#获取圆圈坐标并用串口通信将坐标r送到stm32进行处理
# -*- coding: utf-8 -*
import serial
import time
import cv2
import numpy as npcap = cv2.VideoCapture(0)
lower_red=np.array([156,43,46])
upper_red=np.array([180,255,255])def DisBall(x,y,r,frame):cv2.circle(frame, (x,y) , r , (0, 255, 0), 2)cv2.circle(frame, (x,y) , 2 , (0, 0, 255), 3)return framedef Binary_Get_Point(frame,show,area,thr,thr1):cropped = frame[area[0]:area[1], area[2]:area[3]] #(上,下)(左,右)gray_img = cv2.cvtColor(cropped, cv2.COLOR_BGRA2GRAY)#图像灰度化ret,thresh=cv2.threshold(gray_img,thr[0],thr[1],cv2.THRESH_BINARY)ret,thresh1=cv2.threshold(gray_img,thr1[0],thr1[1],cv2.THRESH_BINARY)thresh=255-threshcnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] #轮廓检测cnts1 = cv2.findContours(thresh1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] #轮廓检测#如果存在轮廓 if len(cnts) > 0: #找到面积最大的轮廓 c = max(cnts, key = cv2.contourArea) #确定面积最大的轮廓的外接圆 ((center_x, center_y), radius) = cv2.minEnclosingCircle(c) if (show==True): cv2.circle(cropped, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2) cv2.circle(cropped, None, 5, (0, 0, 255), -1)print('小球的中心坐标',(int(center_x),int(center_y)))else:center_x=0center_y=0radius=0#如果存在轮廓 if len(cnts1) > 0: #找到面积最大的轮廓 c1 = max(cnts1, key = cv2.contourArea) #确定面积最大的轮廓的外接圆 ((center_x1, center_y1), radius1) = cv2.minEnclosingCircle(c1) if (show==True): cv2.circle(cropped, (int(center_x1), int(center_y1)), int(radius1), (0, 255, 255), 2) cv2.circle(cropped, None, 5, (0, 0, 255), -1)print('激光的坐标',(int(center_x1),int(center_y1)))else:center_x1=0center_y1=0radius1=0return center_x,center_y,radius,center_x1,center_y1,radius1,croppedif __name__=="__main__":# 打开串口ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.2)#剪切区域(上,下)(左,右)area=[40,435,155,540]#二值化阈值thr=[80,255]thr1=[200,255]time1=time.time()while(1):ret, frame = cap.read()x,y,r,x1,y1,r1,frame=Binary_Get_Point(frame,show=True,area=area,thr=thr,thr1=thr1)time_change=time.time()-time1time_change=int(time_change*1000)print('time:'+str(time_change).rjust(3,'0'))#展示画圆效果x=int(x)y=int(y)r=int(r)x1=int(x1)y1=int(y1)r1=int(r1)frame = DisBall(x,y,r,frame)frame = DisBall(x1,y1,r1,frame)send_data='#'+str(x).rjust(3,'0')+str(y).rjust(3,'0')+str(time_change).rjust(3,'0') #起始标志'#',圆心的x和yser.write(send_data.encode("utf8"))print(send_data)send_data='$'+str(x1).rjust(3,'0')+str(y1).rjust(3,'0')+str(time_change).rjust(3,'0')ser.write(send_data.encode("utf8")) print(send_data) if (x==0 and y==0 and r==0):passelse:time1=time.time() # 展示图片cv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF == ord('q'):# 存储图片cv2.imwrite("camera.jpg", frame)breakif ser != None:ser.close()cap.release()
cv2.destroyAllWindows()
电赛滚球控制系统树莓派代码相关推荐
- 备战电设 滚球控制系统——机械结构
我的演示视频在这里 目前我也在备战19 年电设哈,所以先拿17 年的题目来积累积累经验,我这次做的就是控制类的题目--滚球控制系统 滚球控制系统 这是我的最终成品,我们做的是缩小版的,30*30cm ...
- 滚球控制系统详解 —— (附核心代码)
最近练习了17年的国赛题 -- 滚球控制系统 这里展示一下画圆: 观看完整视频点这里 接下来,我来分享一下从搭整体结构到调试完的过程. 这是我搭完的整体结构 (缩小版) (不管什么题,结构部分还是很重 ...
- html代码3D滚球游戏代码,滚球控制系统代码
[实例简介] 基于stm32f407的滚球控制系统代码的嵌入式部分 嵌入式接收视觉传送的关于小球的位置信息(x,y)通过pid处理之后 驱动舵机控制板子运动使小球到达指定位置 [实例截图] [核心代码 ...
- 2017全国大学生电子设计竞赛个人总结--B题滚球控制系统
本人有幸参加2017年全国大学生电子设计大赛,并在西安通过努力进入到优秀作品展示,虽然与瑞萨杯失之交臂,但是感觉从比赛中学到了许多知识和临场发挥的经验,这些经验和进步必将伴随我的未来. 首先来说说组队 ...
- 【Arduino】2017年电子设计大赛B题 滚球控制系统|板球系统
**本文由@ray 出品,转载请注明出处. ** **文章链接: ** http://blog.csdn.net/wz22881916/article/details/78161080 今年电赛我们队 ...
- 2021电赛F题视觉教程+代码免费开源
2021电赛F题视觉教程+代码免费开源 最近好多要电赛题的源码,其他csdn营销号下载都需要会员或钱,正好最近课设又要做一遍电赛小车题,哥们先把代码开源了,饿死营销号 电赛宝藏链接: 四天三夜,那布满 ...
- 滚球控制系统(B 题 本科组)-- 2017 年全国大学生电子设计竞赛试题
滚球控制系统(B 题 本科组)-- 2017 年全国大学生电子设计竞赛试题 一.任务 二.要求 2.1.基本部分 2.2.发挥部分 三.说明 3.1.系统结构要求与说明 3.2.测试要求与说明 四.评 ...
- 滚球控制系统视觉部分代码-Python
2017年电赛控制方向,视觉部分,Python写的. 处理设备:Jetson Nano 摄像头:KS1A552,100万像素,镜头2.4mm焦距. import cv2 #cv2读取的格式是BGR i ...
- 悬挂运动控制系统 源代码 (05年电赛)
题目连接:05年电赛 悬挂运动控制系统 源代码 http://wenku.baidu.com/view/b51e3a25ccbff121dd3683bf.html 系统: 2块STM32 A为上位 ...
最新文章
- 迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...
- asp.net服务器控件button先执行js再执行后台的方法
- 魔兽世界怀旧服最新服务器开发时间,怀旧服开70最新消息汇总 魔兽怀旧服TBC开放时间几个阶段?...
- 程序员如何明智地提出好的问题
- 发布:NetBeans IDE 8.1 Beta
- Hive的数据模型—桶表
- 准备拉琴的zskame大白菜
- Tensorflow安装GPU环境
- 计算任意两个圆的交点
- JTable 的使用
- 锤击测试使用指数窗会引起什么问题吗?
- mtd设备操作、jffs2
- 【SEM】1 基本概念
- 拥有火绒后关闭Windows防火墙
- Git 学习进展 (补发)
- scala中的sealed
- 某灵JAVA互联网架构师专题/分布式/高并发/微服务
- JointJS几个实用功能的简单实现
- 18:Tomorrow never knows?
- 一个稳定的相对成熟的通用管理软件的底层及后台管理值多少钱?(您积累的成果物有多少艰辛付出)
热门文章
- JSP+MySQL电子图书馆借还及查询系统
- Java实现pdf转HTML | WORD | EXCEL | PPT | PNG | TXT 教程
- Unity 中的 3D 数学学习笔记——认识坐标系及坐标系之间的转换
- 微信医院预约挂号小程序系统设计与实现
- 用友U8视频教程全集(库存管理)-金速鹏-专题视频课程
- 关于android手机文件目录的收集
- 「BZOJ3930」「CQOI2015」选数
- 计算机软件硬件边界如何定义,软件定义汽车,但别忘了硬件定义了软件的边界...
- Matlab绘图基础——colormap在数字图像处理及三维图形展示上的应用(分层设色)...
- pygame做一个古诗词填空通关游戏