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摄像头准备接在
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的T
F卡。当时是凌晨⼤概两三点,只能等到早上移动营业厅开业了再去买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 的时间,所以取多个周期时间求平均即可。
摆线周期公式:
由此计算绳长l即可,这也是题⽬⾥所给⾃适应重⼒的意思,⼤概是⾃⼰查询本地赛区的重⼒加速度值吧。当然这只是近似,摆动⾓度越⼤偏差越⼤,速度太快的同时帧率估计也难以满⾜要求(因为太快的画红⽅框不⼀定能实时框住),所以尽可能要求绳⼦长度越长越好。
⾓度⽅案:要测量⾓度,只要测量两个正交⽅向上的速度,然后计算反正切值就可以了。⽰意图⼤概如下
两个垂直摆放的摄像头,只要计算在经过最低点的时候两幅图像之间红⾊⽅框中⼼的像素点的差距,除以获得者两幅图像的时间差即可。(因为帧率往往不是稳定的)记录中⼼最低点的⽅法有两种,⼀种是在开始摆动前进⾏校准,未开摆前的x坐标的位置,或者是⼿动把摄像机摆到中⼼。两种⽅法感觉其实差别不是很⼤,因为两个摄像机拍摄⾓度的垂直摆放就⼀定会产⽣⼀些误差,这个误差暂时没想到怎么避免,应该只能⾃⼰⼿动调调机械装置吧。
Ⅳ、结果T =2π
g
l