2021电赛:基于互联网的摄像测量系统

Ⅰ、题目描述

一、任务

设计并制作一个基于互联网的摄像测量系统。系统构成如图1所示。图中边长为1米的正方形区域三个顶点分别为A、B和O。系统有两个独立的摄像节点,分别放置在A和B。两个摄像节点拍摄尽量沿AO、BO方向正交,并通过一个百兆/千兆以太网交换机与连接在该交换机的一个终端节点实现网络互联。交换机必须为互联网通用交换机,使用的网口可以任意指定。在O点上方悬挂一个用柔性透明细线吊起的激光笔,透明细线长度为 l。激光笔常亮向下指示,静止下垂时的指示光点与O点重合。拉动激光笔偏离静止点的距离小于10cm,松开后时激光笔自由摆动,应保证激光笔指示光点的轨迹经 O 点往复直线运动,轨迹与 OA 边的夹角为 θ。利用该系统实现对长度l和角度θ的测量。
在这里插入图片描述

二、要求

  1. 基本要求
    (1)设计并制作两个独立的摄像节点,每个节点由一个摄像头和相应的电路组成。两个摄像节点均可以拍摄到激光笔的运动视频并显示。
    (2)设计并制作终端节点。在终端显示器上可以分别和同时显示两个摄像节点拍摄的实时视频。在视频中可以识别出激光笔,并在视频中用红色方框实时框住激光笔轮廓。
    (3)测量系统在终端节点设置一键启动。从激光笔摆动开始计时,测量系统通过对激光笔周期摆动视频信号的处理,自动测量长度 l,50cm≤l≤150cm,θ角度自定。测量完成时,终端声光提示并显示长度 l。要求测量误差绝对值小于2cm,测量时间小于 30 秒。
  2. 发挥部分
    (1)一键启动后,测量系统通过两个独立摄像节点的网络协同工作,当 θ=0°和 θ=90°时,能自动测量长度 l,50cm≤ l ≤150cm。要求测量误差绝对值小于 2cm,测量时间小于 30 秒。
    (2)一键启动后,可以测量 θ,0°≤ θ ≤90°。要求测量误差绝对值小于 5°。测量时间小于 30秒。

三、说明

	(1)摆的柔性透明细线建议采用单股透明的钓鱼线,直径小于 0.2mm。不要采用一般捻和的缝纫线,防止激光笔吊起后自转。考虑实际摆与理想摆的差异以及各地重力加速度会有差异,系统应具有校准处理的功能。
	(2)系统获取摆的信息必须来自摄像节点拍摄的视频信息,不得在摆及其附近安装其他传感器和附加装置。θ角度的标定可利用量角器测量激光指示光点轨迹与 OA 边的夹角实现。
	(3)两个摄像节点拍摄的取景范围仅限激光笔摆动区间的内容,不能包含全部柔性细线的内容和地面激光光点轨迹的内容。在测量 l 和 θ 的过程中,如果视频包含上述内容,需用纸片遮挡这部分内容。否则不进行测试。
	(4)拍摄背景为一般实验室场景,背景物体静止即可,不得要求额外处理。
	(5)三个节点不得采用台式计算机和笔记本电脑。

四、评分标准

在这里插入图片描述

Ⅱ、首次电赛的整个历程

  1. 吐槽
    先吐槽一下不知道这次主办方在想啥,开赛前准备的各种电子模块全部没用到,整个题目我所知道的组全部都是三块树莓派+三块显示屏+俩摄像头。咱也不知道树莓派是不是给大赛偷偷赞助了,往年也从来没有题那么明目张胆的让用树莓派,起码大部分是各种单片机+电子模块。题目里注明不让用电脑,但是让用树莓派,树莓派不久是个电脑吗??神他妈开赛第一天直接加急买了一块树莓派(经费实在不够,买三块也不知道能不能做出来,今年电赛孩子第一次上手树莓派)。经过加急的顺丰速运仍然是6号才送到。前面两天尝试用openmv+显示屏+正点原子的串口转以太网模块尝试做节点的录屏,然后转发到第二天买的树莓派上,买的最大最快的串口转以太网只有每秒0.8M的传输速率,寻思着直接做俩节点放弃了。前两天没熬夜没通宵,觉得这次电赛无了都直接准备摆烂了。

  2. 转折
    6号早上,心心念念的树莓派到了,买的一条龙服务,软件啥的全部配置好,然后当天顺便找美团跑腿代购了俩USB摄像头准备接在树莓派上,尝试调出摄像头。于是翻了几十篇博客,下载opencv、配置树莓派接口等等等等。大概晚上十点,终于调出第一个节点上的摄像头(安装opencv花了很多很多时间,不过还好最后总结出了一条快速安装的方法)此时的我们所拥有的所有设备:一台树莓派、一个屏幕、一条HDMI线、一条屏幕供电线以及摆烂的openmv和stm32。刚调出第一个节点的usb画面大概是6号晚上十点左右,距离比赛截至还剩24小时不到。而且设备实在是太少了,为了拿第一问两个节点的分,两个队友疯狂询问了隔壁机器人队借用他们的树莓派,最后是借到两个,加上自己买的一个,总共三个树莓派。但个树莓派用的TF卡只有一张自己买的一条龙送的32G卡和另一张16G的TF卡(空卡)。然后,想当然的给这个16G的TF卡装了树莓派系统,想搞两个系统尝试用socket传输实时图片了。

  3. 再转折
    16G的TF和32G的TF在树莓派官网上下载的系统安装,里面自带的软件不一样。32G的卡自带python3.7.3,16G的卡则是一个2.几版本的python,这两个版本的python又不一定能兼容相同版本的opencv,于是自作聪明的查博客尝试将python版本升上去:先卸载python2,重新下载python3,解除什么什么系统和python2的绑定,重新下载opencv…总之一系列操作下来,emm,决定重新取学校商业街的移动营业厅买两张32G的TF卡。当时是凌晨大概两三点,只能等到早上移动营业厅开业了再去买TF卡,于是在凌晨打算用树莓派和电脑联调,将树莓派拍摄到的照片通过局域网用socket传给电脑,当时很顺利,成功传过去并显示了,当时觉得题目有戏了,马上叫队友四处搜罗树莓派和屏幕。然后的时间里什么也干不了,得等营业厅开业去买sd卡。一夜没睡熬到早上八九点的样子,大概零度的气温,队友骑车去买sd卡。一张顺利的装完了opencv,另一张当时因为当时树莓派数量不够(下午三四点左右借到第三个树莓派)暂时没管,直接开始尝试两台树莓派的联调。当时的设备,仅仅只有一个鼠标一个键盘一个屏幕,要在两个树莓派上调试代码,其中一个节点树莓派还插着摄像头。因为只有一个显示屏,想要看一台树莓派的反馈时就得把屏幕拆掉撞到另一个树莓派上,想要打字就得转接键盘,想要移动鼠标就得转接鼠标,而一个树莓派仅仅只有两个usb口,当时这段时间真的把我调试的调试到心态爆炸。(插着摄像头的树莓派甚至打代码需要先用鼠标点击插入代码的位置,然后拆掉鼠标换上键盘才能敲代码)忙活到中午,总算是联调成功,一个树莓派上拍摄的画面成功转接到了终端树莓派上。此时感觉离成功很近了,当时又借到了一个树莓派,最大的问题变成了没有足够的屏幕。好消息是指导老师给我们去电子市场带回来一个HDMI显示屏,坏消息是没有线。GG

  4. 东拼西凑
    后面趁着队友疯狂d人借树莓派和屏幕的时间,顺便制作了一个节点的画面显示+终端的画面显示+多线程(这里琢磨着单线程同时加载两个视频估计不太流畅,于是查代码现学了python的多线程),把调通了两个树莓派之间的单线程通讯,顺便在CSDN上找了一些关于图像识别的代码,准备等设备齐全了调通以后直接调试目标识别。然后顺便把另一块TF卡的python和opencv环境配好(中间其实安装出了点问题,比如下载太慢尝试更改镜像源,之前安装并没有出现类似问题,总之被我改烂了之后又格掉重装了系统,莫名其妙又没有问题了,总而言之就是一模一样的操作,每一块树莓派都会带来不一样的bug,总计大概安装了6个opencv和5个树莓派,真的全部从零开始)最后整齐了设备(其中一块屏幕找选同一题的好兄弟借了一块),总算是可以开始调试整体的连接情况了,此时大概已经下午三四点了吧,距离封箱只有四个小时不到,此时此刻才拥有一套完整的设备,还都是从各种地方借的。甚至键盘也是树莓派到的当天问遍同学借来一块机械键盘。还好之前编写的多线程很顺利,结合CSDN上的一些监控代码,总算实现了三块树莓派之间相互通信,终端的树莓派可以显示两个节点的树莓派的摄像头拍摄到的信息,大概两个画面各自的帧率大概平均20帧每秒,这样跌跌撞撞总算是做完一道半的题目了,下一步就准备嫁接之前找到的opencv的图像识别的代码,尝试框出来运动的激光笔。

  5. BUG
    原本的想法是颜色检测,但是帧率和像素的限制,激光笔的颜色也没有那么显著,果断放弃了,尝试用动态追踪。但是实现属实是有点困难。(没学过图像处理)最后翻到了一篇博客。(最后会把所有参考到的博客列在后面)大概原理是记录第一帧拍摄的下的图片,之后的每帧图片都和第一帧进行对比,找出这个残差用方框框起来,所以测试的时候有个校准过程,就是在启动前把激光笔举起来不让它出现在摄像头的视野中,等启动后再放下激光笔,这个时候代码就会框出和第一帧图像不同的区域。(此时摄像头就不能移动了)当时觉得可行性非常高,五点左右的时候才开始进行图像识别。(当时已经36小时没有睡觉了,整个人处于神经衰弱的状态)然后大概代码里打错了一个变量吧,当时也没有检查出来。在节点处理图像发给服务器服务器就秒挂,服务器处理两个整个监控就会挂掉,整整调了一个小时没有调出来。最后大概六点,全部代码注释掉,一行代码一行代码取消注释看哪里出了问题,幸好找到了那个bug。此时终端节点才能够框选出两个摄像头里的激光笔,算是完成了前两问。

  6. 结束
    没时间了,本来已经想好计算绳长和角度的方法。绳子长度用单摆周期公式计算,测得周期后直接可以计算绳子长度。而角度的话可以通过计算激光笔摆到屏幕最低点两个摄像头拍摄到的速率比的arctan值就是角度。因为帧率不一定是稳定的,所以最好根据摆到中点后和下一帧图片的中心像素点的横坐标的像素偏差。用像素偏差除以帧率求得激光笔在一个方向上的速率。两个垂直方向的速率的比值就是角度的tan值。一键启动只需要增加一个按键监听,开始后启动定时器测量应该就可以了。作品还在封箱中,等解封了一定第一时间就去把整个代码补完。因为时间实在是太紧张了,而且也是第一次接触树莓派,虽然只完成了前两问,但我觉得更重要的还是自己通过这次比赛学到的东西,以及把课本知识真正应用在实际项目中的那种能力,还有那种顶下目标从毫无头绪到一步步实现的过程产生的成就感。

Ⅲ、赛题思路

1. 逻辑框图

在这里插入图片描述
逻辑框图确实很简单,但是他妈的烧钱啊
摄像头:100×2
三个树莓派:500×2
三个显示屏:200×2
TF卡:50×3
整一个电赛预算可能就得蹭蹭往2000跑

2. 各个部分实现说明

节点显示画面:
节点是利用python的opencv库直接调用摄像头,然后用自带的库函数cv2.imshow直接将调用到摄像头的画面展示出来就可以了,通信则是用socket,将图像编码后传输,网上找一份代码自己改改,一会贴下面
终端显示画面:
接收端也没什么好说的,接收图像解码,都有现成的库函数,直接调用即可。
红色方框:
这里我看到很多群里大佬用什么神经网络人工智能检测=、=这里我们用的方法是和第一帧画像进行对比,框选出和第一帧画像不一样的区域。所以启动系统前得人为地把激光笔吊起来,不让他出现在镜头里,等启动后再放下去。虽然手段有点拙劣,但是检测效果确实还挺不戳
长度检测和角度检测方案:
长度方案:获取之前方框的中心坐标,根据中心坐标摆动到同一点所经历的时间,再利用摆线周期公式计算绳长。题目给了大概20—30s的时间,所以取多个周期时间求平均即可。
摆线周期公式:
T = 2 π l g T=2\pi \sqrt{\frac{l}{g}} T=2πgl
由此计算绳长l即可,这也是题目里所给自适应重力的意思,大概是自己查询本地赛区的重力加速度值吧。当然这只是近似,摆动角度越大偏差越大,速度太快的同时帧率估计也难以满足要求(因为太快的画红方框不一定能实时框住),所以尽可能要求绳子长度越长越好
角度方案:要测量角度,只要测量两个正交方向上的速度,然后计算反正切值就可以了。示意图大概如下
在这里插入图片描述
两个垂直摆放的摄像头,只要计算在经过最低点的时候两幅图像之间红色方框中心的像素点的差距,除以获得者两幅图像的时间差即可。(因为帧率往往不是稳定的)记录中心最低点的方法有两种,一种是在开始摆动前进行校准,未开摆前的x坐标的位置,或者是手动把摄像机摆到中心。两种方法感觉其实差别不是很大,因为两个摄像机拍摄角度的垂直摆放就一定会产生一些误差,这个误差暂时没想到怎么避免,应该只能自己手动调调机械装置吧。

Ⅳ、结果

这里放一下下当时录像的结果:
在这里插入图片描述
临时调试,两个摄像头摆在一个方向上,但是都能够检测出来。
还算比较遗憾吧,制作了前面两问,后面思路是有的,但是实在是没时间取做了,整个电赛满打满算就做了一天半的时间。而且屏幕摄像头等设备凑齐都已经甚至都已经到了最后一天下午,整个队伍赛前甚至没人接触过树莓派,全部都在准备什么无线通信模块、stm32单片机和openmv啥的,最后突然选了个D题,临危受命间只能由我这个信息学院的接下了这个担子(毕竟是算是linux电脑,剩下两个队友电控的,实在没办法)。索性最后还是做出来了两问,甚至感觉再给我半天时间剩下的题目我也能整出来。

Ⅴ、测评过程

线上测评,连着腾讯会议说啥做啥就完了,没啥好说的。全程直播拆箱组装演示。就是老师问测长度时略显尴尬,都框出来了长度还测不出来??=、=人麻了人麻了。
然后测评完又给封箱了,不知道啥时候才能把东西拿回来。树莓派真好玩,python真好用,一定好好学树莓派和python

Ⅵ、后续打算

等拆箱了,再叫上小伙伴们把后续做完,算是弥补一点点遗憾5555

Ⅶ、自己的一些总结和参考博客

1、树莓派openmv安装:

针对树莓派4B新机+32GTF卡,(64G和32G一不一样我就不知道了)python版本3.7.3
linux命令行:
第一步:安装一些相关的树莓派依赖

sudo apt-get update
sudo apt-get install libjpeg-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libtiff5-dev
sudo apt-get install libpng12-dev
sudo apt-get install libqtgui4 libqt4-test
sudo apt-get install libjasper-dev

原文链接
第二步:直接安装opencv

sudo apt-get install python-opencv (安装在python2 上的)
sudo apt-get install python3-opencv (安装在python3 上的)

原文链接

python2没试过,python3这几句就够了,顺着一条条打完不出意外就装好了(连装五个得出的重要结论)

2、socket通信

参考博客

3、python opencv图像传输

参考博客

4、多线程

参考博客

最主要参考的博客大概就这些。等过两天把题目补完了再来写后续=、=

Ⅷ、感受

全省本科组大概一共26只队伍选了D题,我们全校一共五个,检测当天好像弃赛了两个。获奖比例大概1/3,弃赛的也算在基数里。也不知道其他学校做的咋样。感觉整体的题目并没有想象中那么难。至于不选这道题的理由可能一方面时因为参加电赛的大部分是电控学院的,可能更倾向于硬件而不是软件。但是如果是一个接触过树莓派的人,对python有一定了解,又具有一定检索有用信息能力的人,在设备不受限的情况下完完全全做出这道题是并不困难的。
我测评完当天回去和正在学数字图像处理的室友和另一个接触过树莓派的同学(和我一同参加建模的JL大佬)吐槽:如果你们来和我参加这个电赛,我估计国奖都没啥问题。
除此之外还有学校的支持力度。隔壁某电学校听说所有可能用到的材料都帮你准备好了,要啥直接拿,缺啥买啥全报销。至于我们学校:在我下单一个树莓派的时候还在纠结:万一买了没拿到奖,学校会给报销吗?要不还是别买太多了,买一个回来试试看吧?
事实是我多虑了,就算拿奖了你花了太多钱也只能给你报一部分。而我那个有能力参加的室友正忙着准备期末考和保研,卷着4.几的绩点,哪儿有时间参加电赛。不愧是对学生宣扬拿着国家几亿研究经费的高等211学府。毕竟绩点至上。
此外十一月还有一个所谓启动了半年的大创项目。苦苦等着知道老师带我们做项目。原来不过是指导老师发你两篇研究生的论文拿去改改让你拿去写俩报告,然后美其名曰大学生科技创新创业项目:看我们的大学生多么优秀!实则不过是往导师和学生脸上贴金的双赢技俩。
所以是个末流211.狗都不保本校

=======================================================================

  • 8
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值