尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

OpenMV在电设与智能车竞赛中的核心应用与实战指南

OpenMV在电设与智能车竞赛中的核心应用与实战指南 1. 项目概述OpenMV在电设与智能车竞赛中的核心价值如果你正在准备电子设计大赛或者全国大学生智能车竞赛并且被图像处理、目标识别这些任务搞得焦头烂额那么OpenMV这个巴掌大的小玩意儿很可能就是你一直在找的“外挂”。它不是一台完整的电脑而是一个集成了摄像头和微控制器的嵌入式机器视觉模块。简单来说它把复杂的图像处理算法打包成了一个你直接用Python就能调用的“黑盒”。在电设和智能车这类对实时性、功耗和体积都极其苛刻的竞赛场景里OpenMV的出现让视觉方案的落地门槛从“专业实验室”降到了“学生团队”。回想几年前想在智能车上做视觉识别主流方案要么是跑Linux的树莓派加USB摄像头要么是直接上性能更强的Jetson Nano。前者虽然灵活但系统臃肿、启动慢、功耗高一个不小心进程卡死车就冲出赛道了后者性能强劲但价格昂贵、功耗惊人对小车有限的电池是巨大考验。而OpenMV的核心优势就在于“专精”和“轻量”。它运行的是MicroPython系统极其精简上电秒启动功耗通常只有1-2瓦比一个LED灯亮不了多少。它内置了色块追踪、AprilTag码识别、人脸检测、模板匹配等算法你写十几行代码就能让小车识别赛道边线、追踪前方车辆或者找到任务道具。在最近的第二十一届智能车竞赛中无论是节能信标组对发光信标的识别与追踪还是智能视觉组的多种任务识别OpenMV都是热门选择。它解决了学生团队最头疼的几个问题第一无需从零搭建复杂的OpenCV环境避免了驱动、版本兼容性等一堆坑第二代码逻辑直观调试方便通过配套的IDE可以实时看到摄像头画面和处理结果极大提升了开发效率第三与STM32等主流车控MCU通信简单通常一根串口线TX/RX就能搞定实现了“视觉感知”与“运动控制”的清晰分工。接下来我就结合自己带比赛和实际开发的经验把这套方案的里里外外、关键细节和踩过的坑给你彻底讲明白。2. 核心思路与方案选型为什么是OpenMV在决定采用OpenMV之前我们需要清晰地理解竞赛需求并对比其他可能的技术路径。电设和智能车的视觉任务通常可以归结为几类颜色识别如追踪红色引导线、识别特定颜色的信标、形状/模板识别如识别数字、箭头、交通标志、二维码/AprilTag识别用于精确定位或任务触发、以及简单的物体追踪。这些任务的共同特点是场景相对固定室内或固定光照的赛场目标特征明显但对实时性和可靠性要求极高。2.1 主流视觉方案横向对比面对这些需求我们通常有几个备选方案STM32/ESP32 OV系列摄像头 自写算法这是最硬核的方案。你需要用单片机直接读取摄像头如OV7670的原始数据流然后在内存里自己实现RGB转灰度、二值化、边缘检测、轮廓查找等一系列算法。优点是成本最低对硬件掌控力最强。但缺点极其致命开发周期漫长算法鲁棒性差极其消耗单片机的运算资源和内存往往只能处理极低分辨率的图像帧率也难以保证。除非是算法功底极其扎实的团队否则在紧张的备赛周期里不推荐。树莓派/香橙派 USB摄像头 OpenCV这是功能最强大的方案。Linux系统让你可以运行完整的OpenCV库甚至部署一些轻量级的深度学习模型如YOLO Tiny。灵活性无与伦比你能想到的视觉功能几乎都能实现。但它的缺点在竞赛中很突出系统启动慢几十秒功耗高满载可能超过5W系统偶尔会卡顿或死机稳定性是隐患。此外PythonOpenCV的程序在复杂逻辑下实时性可能不足且与下位机STM32的通信需要额外处理如串口、Socket。专用AI摄像头模组如K210、HuskyLens这类模组内置了神经网络加速单元能离线运行训练好的模型进行人脸识别、物体分类等。它们上手简单但定制化能力弱。对于竞赛中特定的、非通用的目标比如今年赛题独有的一个道具形状训练和部署模型仍有一定门槛且帧率和识别距离有时不尽如人意。OpenMV的定位恰恰填补了上述方案之间的空白。它比方案1更“傻瓜”提供了现成的、优化过的算法函数比方案2更“专一”和“稳定”专为嵌入式机器视觉设计没有操作系统开销比方案3更“灵活”你可以用Python自由组合基础算法来实现特定的识别逻辑。它的核心价值在于在有限的资源算力、内存、功耗下为特定的、结构化的视觉问题提供了一个高开发效率、高可靠性的交钥匙解决方案。2.2 OpenMV型号选择与资源评估OpenMV有多个型号选对型号是成功的第一步。OpenMV Cam H7这是当前的主流和推荐型号。核心是STM32H7系列芯片主频高拥有充足的RAM1MB和Flash2MB。它能流畅处理更高分辨率的图像如QVGA 320x240甚至更高同时运行多个复杂算法如同时找色块和AprilTag。对于智能车竞赛中大多数场景H7版本是性能富余且稳妥的选择。OpenMV Cam M7上一代主流型号基于STM32F7。性能对于基本的色块追踪、模板匹配也完全足够但如果遇到需要高分辨率或复杂组合算法的任务可能会有些吃力。如果预算有限购买二手的M7板子也是一个高性价比的入门选择。OpenMV Cam H7 Plus / H7 R2这些是H7的增强版通常配备了更高像素的摄像头如500万像素或更多的内存。除非你的赛题需要非常精细的图像分析例如需要识别很远很小的目标否则标准H7版本已足够。额外的像素意味着更大的图像数据处理速度反而可能下降。选型心得对于初次参赛的队伍直接选择OpenMV Cam H7标准版即可。把省下的预算投入到更好的电机、电池或传感器上收益更大。记住在动态的赛车上算法的稳定性和效率远比极致的图像分辨率重要。3. 开发环境搭建与基础图像处理工欲善其事必先利其器。OpenMV的开发体验是其一大优点但第一步的环境搭建也需要留意。3.1 软件安装与固件更新首先去OpenMV官网下载最新的IDE。安装完成后用Micro-USB数据线将OpenMV摄像头连接到电脑。第一次连接时IDE可能会提示你更新固件。务必进行更新因为新固件往往修复了旧版的Bug并可能带来性能提升。更新过程在IDE内一键完成非常简单但务必保证连接稳定中途断电可能导致板子变砖。连接成功后IDE会显示摄像头的实时画面。你可以先运行一个简单的脚本测试一下import sensor, image, time # 初始化摄像头传感器 sensor.reset() # 重置感光元件 sensor.set_pixformat(sensor.RGB565) # 设置色彩格式为RGB565 sensor.set_framesize(sensor.QVGA) # 设置图像大小为QVGA (320x240) sensor.skip_frames(time 2000) # 跳过一些帧等待感光元件稳定 clock time.clock() # 创建一个时钟对象来跟踪FPS while(True): clock.tick() # 更新FPS时钟 img sensor.snapshot() # 拍摄一张照片 print(clock.fps()) # 在终端打印帧率这段代码会初始化摄像头并以QVGA分辨率捕获图像同时在串行终端打印帧率。正常情况下RGB565格式下QVGA的帧率能达到30-50fps这对于智能车控制已经绰绰有余。3.2 核心图像处理函数解析OpenMV的图像处理核心是sensor.snapshot()返回的image对象。所有算法都基于这个对象展开。1. 色彩空间与二值化竞赛中最常用的是颜色追踪。OpenMV默认使用RGB565色彩格式。但直接比较RGB值对光照变化非常敏感。因此更鲁棒的方法是使用LAB色彩空间。L代表亮度A代表红绿色差B代表黄蓝色差。LAB空间在一定程度上能将亮度信息与颜色信息分离使得颜色阈值在不同光照下更稳定。import sensor, image, time sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time2000) # 定义红色色块的LAB阈值。这是一个经验值需要根据实际环境和目标颜色调整。 # 阈值格式为 (L_min, L_max, A_min, A_max, B_min, B_max) red_threshold (30, 70, 20, 80, 10, 70) while(True): img sensor.snapshot() # find_blobs函数是核心它会在图像中寻找所有符合阈值的色块 blobs img.find_blobs([red_threshold], pixels_threshold100, area_threshold100, mergeTrue) if blobs: # 如果找到了色块我们取最大的一个通常是最主要的目标 largest_blob max(blobs, keylambda b: b.pixels()) # 在图像上画一个矩形框出这个色块 img.draw_rectangle(largest_blob.rect(), color(255,0,0)) # 画一个十字在色块中心 img.draw_cross(largest_blob.cx(), largest_blob.cy(), color(0,255,0)) # 打印中心坐标 print(Blob Center: (%d, %d) % (largest_blob.cx(), largest_blob.cy()))find_blobs函数返回一个列表每个元素都是一个“色块”对象包含了该色块的外接矩形(rect)、中心坐标(cx,cy)、像素点数(pixels)、面积(area)等信息。pixels_threshold和area_threshold用于过滤掉噪声小点mergeTrue可以将相邻的、颜色相近的色块合并避免一个目标被识别成多个碎片。调试技巧OpenMV IDE自带一个强大的“阈值编辑器”Tools - Machine Vision - Threshold Editor。你可以打开它拖动六个滑块对应LAB的min和max实时观察图像中哪些部分被选中白色。这是调试颜色阈值最快、最直观的方法没有之一。务必在比赛现场的实际光照条件下重新校准阈值。2. 形状与模板识别除了颜色我们经常需要识别特定的形状比如圆环、矩形或者赛题中给出的固定图案模板。# 寻找圆形 circles img.find_circles(threshold2000, x_margin10, y_margin10, r_margin10) for c in circles: img.draw_circle(c.x(), c.y(), c.r(), color(255, 0, 0)) print(Circle at (%d, %d) with radius %d % (c.x(), c.y(), c.r())) # 寻找矩形通过寻找四边形 rects img.find_rects(threshold30000) for r in rects: img.draw_rectangle(r.rect(), color(0, 255, 0)) # 获取矩形的四个角点 corners r.corners() for i in range(4): img.draw_circle(corners[i][0], corners[i][1], 5, color(0,0,255))对于更复杂的固定图案可以使用find_template函数进行模板匹配。你需要先截取一张“模板”图片保存到OpenMV的存储中然后在代码中加载它进行匹配。这种方法对目标的旋转、缩放比较敏感适合识别位置和角度相对固定的目标。3. AprilTag码识别AprilTag是一种类似于二维码的视觉基准标记系统但更适用于距离较远、角度倾斜或部分遮挡的情况。在智能车竞赛中它常被用于车库的精确定位、任务触发等。import sensor, image, time, math sensor.reset() sensor.set_pixformat(sensor.GRAYSCALE) # AprilTag识别推荐使用灰度图速度更快 sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time2000) # 定义AprilTag家族常用的是TAG36H11 tag_families 0 tag_families | image.TAG36H11 # 可以 | 添加其他家族 while(True): img sensor.snapshot() tags img.find_apriltags(familiestag_families) for tag in tags: img.draw_rectangle(tag.rect(), color(255, 0, 0)) img.draw_cross(tag.cx(), tag.cy(), color(0, 255, 0)) # 获取Tag的ID、旋转角度等 print(Tag ID %d, Center (%d, %d), Rotation %.2f degrees % (tag.id(), tag.cx(), tag.cy(), math.degrees(tag.rotation())))AprilTag识别会返回丰富的空间信息包括目标的ID、中心点、四个角点甚至可以通过已知Tag的物理尺寸来解算摄像头到Tag的距离和角度tag.translation()和tag.rotation()这对于实现精准定位至关重要。4. 与STM32的通信协议与系统集成OpenMV完成了视觉感知但最终控制小车运动的还是STM32。两者之间稳定、高效的通信是整个系统的“神经中枢”。串口通信UART因其简单可靠是最主流的选择。4.1 通信协议设计直接发送字符串如“100,200\n”虽然简单但在复杂的电磁环境下容易出错。设计一个简单的帧协议能极大提升可靠性。一个经典的协议格式如下帧头2字节 数据长度1字节 命令字1字节 数据区N字节 校验和1字节 帧尾2字节对于竞赛应用我们可以简化。例如我们只发送目标在图像中的坐标和状态# OpenMV 端发送代码示例 import ustruct def send_data(cx, cy, found): # 假设协议帧头0xAA 0xBB 数据cx(2字节), cy(2字节), found(1字节) 校验和求和取低8位 header b\xAA\xBB data ustruct.pack(hhb, cx, cy, found) # h是2字节有符号整数b是1字节有符号整数 checksum sum(data) 0xFF # 计算校验和 frame header data bytes([checksum]) uart.write(frame) # 在主循环中当识别到目标时 if largest_blob: send_data(largest_blob.cx(), largest_blob.cy(), 1) else: send_data(0, 0, 0) # 未找到目标发送特定值在STM32端你需要编写一个对应的串口解析程序不断接收数据寻找帧头0xAA 0xBB然后根据约定长度取出数据计算校验和比对通过后才认为是一帧有效数据。避坑指南务必在STM32端设置串口接收超时机制和缓冲区清空逻辑。如果某次数据出错导致帧同步丢失程序应能在超时后清空缓冲区重新开始寻找帧头避免一直“卡死”在错误状态。这是保证长期运行稳定的关键。4.2 数据滤波与坐标系转换从OpenMV接收到的坐标数据是原始像素坐标直接用于控制可能会因为图像噪声导致小车抖动。常用的滤波算法有均值滤波维护一个坐标点的滑动窗口取平均值作为输出。简单有效能平滑噪声。一阶低通滤波指数加权平均current_output α * current_input (1-α) * last_output。其中α是滤波系数0α1α越小滤波效果越强但滞后也越明显。这种方法计算量小非常适合在STM32上实现。坐标系转换是另一个关键点。OpenMV图像坐标的原点在左上角X轴向右Y轴向下。而小车的控制通常基于车身坐标系。你需要建立一个映射关系。例如假设摄像头朝前正装图像中心点对应小车正前方。那么横向偏差error_x blob.cx() - image_width / 2。error_x为正说明目标在中心右侧小车应向右转。纵向距离粗略估算如果已知目标物体的实际大小和摄像头的焦距可以通过目标在图像中的像素高度来估算实际距离。更简单的方法是对于固定高度的目标如赛道边线可以认为error_y目标中心Y坐标越小目标离得越近。将滤波后的像素偏差通过一个比例系数需要现场调试转换为舵机的打角值或电机的差速值就构成了最基础的视觉巡线或目标追踪控制器。5. 在智能车竞赛中的典型应用案例拆解让我们结合具体赛题任务看看OpenMV如何大显身手。这里以第二十一届智能车竞赛中的相关组别为例。5.1 案例一节能信标组——发光信标的识别与追踪这个任务要求小车识别并移动到随机点亮的发光信标通常是红色或蓝色下方。信标的光晕在图像中会形成一个高亮的色块。实现要点阈值设定由于信标本身是高亮光源其LAB值中的L亮度分量会非常高接近最大值255。同时其A、B分量会集中在颜色对应的区间。例如红色信标的阈值可能类似(200, 255, 20, 100, -30, 30)。重点在于大幅提高L_min过滤掉环境反光。多目标处理与选择当多个信标同时亮起或存在反光干扰时find_blobs可能找到多个色块。策略是面积/像素过滤只处理面积大于一定阈值的色块排除小光斑。位置预测结合小车上一时刻的位置和运动状态预测当前信标最可能出现的图像区域优先选择该区域内的色块。亮度排序选择最亮的色块blob.density()或直接比较像素亮度总和。状态机设计小车的行为不应只基于单帧图像。需要设计一个状态机例如SEARCHING未找到信标原地旋转或缓慢前进搜索。TRACKING找到信标持续追踪其中心坐标。APPROACHING信标中心接近图像中心且面积很大说明已经很近准备停车或触发下一步动作。# 简化的状态机逻辑示例 state SEARCHING last_cx 160 # 图像中心X while(True): img sensor.snapshot() blobs img.find_blobs([red_threshold], pixels_threshold500, area_threshold500) if blobs: target max(blobs, keylambda b: b.pixels()) # 选最大的 if state SEARCHING: state TRACKING print(Target Acquired!) # 计算偏差并发送给STM32 error_x target.cx() - last_cx send_control_command(error_x) # 判断是否接近目标面积是否超过图像面积的1/4 if target.area() (img.width() * img.height()) // 4: state APPROACHING send_stop_command() break # 完成任务 else: if state TRACKING: # 短暂丢失目标进入短暂搜索或沿用上次指令 state SEARCHING send_search_command()5.2 案例二智能视觉组——多任务元素识别智能视觉组通常需要识别多种元素如数字、动物图案、交通标志等。这些元素颜色、形状固定但种类多。实现要点分时复用与任务调度一帧图像内同时运行多个find_blobs、find_template会严重降低帧率。可以采用分时复用策略每N帧识别一种元素。例如第1帧识别红色数字第2帧识别蓝色箭头第3帧识别绿色标志……循环进行。只要N较小且小车运动速度不快感知延迟是可接受的。模板匹配优化提前准备好所有需要识别的模板图片如0-9的数字存入OpenMV的Flash。匹配时使用image.find_template并设置一个相似度阈值如0.7。为了提高匹配速度可以先将模板和搜索图像都转换为灰度图并适当缩小匹配的搜索区域ROI。结果融合与决策将不同帧识别到的结果如“前方3米有数字5”“左侧有右转箭头”缓存在一个数据结构中。决策模块可以在OpenMV上也可以发送给STM32基于这些缓存的历史信息结合小车当前位置综合判断该执行哪个任务如“在数字5前停车”。# 分时复用识别示例 task_counter 0 recognized_results {} while(True): img sensor.snapshot() task_type task_counter % 3 if task_type 0: # 识别红色数字 red_blobs img.find_blobs([red_number_threshold], roi(50,50,220,140)) # 限定ROI if red_blobs: # 裁剪出色块区域进行模板匹配 for blob in red_blobs[:1]: # 只处理最大的一个 img_crop img.copy(roiblob.rect()).to_grayscale() for i, template in enumerate(number_templates): r img_crop.find_template(template, 0.7, step4, searchimage.SEARCH_EX) if r: recognized_results[red_number] i break elif task_type 1: # 识别蓝色箭头 # ... 类似逻辑寻找蓝色色块并进行箭头模板匹配 pass elif task_type 2: # 识别绿色交通标志 # ... 类似逻辑 pass # 将识别结果和任务类型打包发送给STM32 send_result(task_type, recognized_results.get(red_number, -1)) task_counter 1 time.sleep_ms(10) # 控制循环频率6. 性能优化与调试实战技巧在竞赛中稳定和流畅的识别是成功的基础。以下是一些压榨OpenMV性能、提升稳定性的实战技巧。6.1 图像预处理与ROI设置降低分辨率是提升帧率最有效的方法。sensor.set_framesize()可以设置从QQVGA (160x120)到VGA (640x480)等多种分辨率。对于巡线或信标追踪QVGA (320x240)或QQVGA通常就足够了。帧率可能从30fps提升到60fps甚至更高控制响应会更快。设置感光区域ROI, Region of Interest。如果你的目标只出现在图像的下半部分比如前方的赛道那么只处理这部分图像即可。sensor.set_windowing((0, 120, 320, 120)) # 设置窗口从(0,120)开始宽320高120这行代码将只处理图像下半部分相当于分辨率变成了320x120处理速度几乎翻倍。使用灰度图。如果识别算法不依赖颜色如AprilTag、某些模板匹配将像素格式设置为sensor.GRAYSCALE能减少一半的数据量显著提升处理速度。6.2 算法参数调优find_blobs函数的参数直接影响识别效果和速度pixels_threshold色块最小像素数。设置过小会引入噪声过大会漏掉小目标。根据目标在图像中的大小动态调整。area_threshold色块最小面积。与像素阈值类似但面积是外接矩形面积。mergeTrue务必开启它能把相邻的碎片合并得到更完整的目标区域。margin参数在合并色块时允许的边界间距。如果目标颜色不均匀导致中间有断裂可以适当增加这个值。对于find_template降低step参数如从默认的2改为4可以加快搜索速度但会降低匹配精度需要权衡。6.3 光照应对策略光照是机器视觉最大的敌人。除了使用LAB色彩空间还有以下方法自动白平衡sensor.set_auto_whitebal(False)并手动设置增益可以防止环境光色温变化导致颜色识别漂移。在固定光照的赛场关闭自动白平衡并手动设定一个稳定值通常是更好的选择。自动曝光同样在固定光照下可以sensor.set_auto_exposure(False, exposure_us10000)手动设置曝光时间。曝光时间越长图像越亮但运动物体会变模糊。需要根据小车速度调试。补光灯最物理、最有效的方法。在OpenMV摄像头周围加装一圈LED补光灯最好是漫射光为识别目标提供稳定、均匀的照明环境。这是很多顶尖队伍的秘密武器。6.4 调试与日志输出OpenMV IDE的“帧缓冲区”视图可以实时显示图像和处理结果是调试的利器。但有时我们需要知道更底层的运行状态。使用clock.fps()监控帧率帧率突然下降可能意味着某段算法过于耗时或者出现了内存问题。使用print()输出关键变量如色块坐标、面积、识别到的ID等。但要注意频繁打印会占用大量串口带宽和时间影响主循环速度。可以在调试时开启最终版本关闭或减少打印频率。使用pyb.LED()指示灯用板载LED来指示状态。例如识别到目标时让LED亮起丢失时让LED闪烁。这在脱离电脑调试时非常有用。7. 常见问题排查与避坑指南这里汇总了一些开发过程中常见的问题和解决方法希望能帮你节省大量排查时间。问题现象可能原因排查方法与解决方案IDE无法连接摄像头1. USB线或端口问题。2. 驱动未正确安装。3. 板子固件损坏。1. 更换USB线和电脑端口试试。2. 在设备管理器中查看是否有“未知设备”尝试重新安装CDC驱动。3. 尝试进入DFU模式按住板载按钮再上电重新烧录固件。图像识别不稳定时有时无1. 颜色阈值设置不当。2. 光照变化。3. 运动模糊。1. 使用阈值编辑器在现场光照下重新标定。2. 增加补光灯或改用更鲁棒的色彩特征如色相。3. 尝试减少曝光时间sensor.set_auto_exposure或提高帧率降低分辨率。帧率很低10fps1. 图像分辨率设置过高。2. 算法过于复杂或循环内有耗时操作如大量print。3. 使用了未开启的镜头校正。1. 降低set_framesize使用QVGA或QQVGA。2. 优化代码移除不必要的计算和打印。使用分时复用策略。3.sensor.set_vflip/sensor.set_hmirror这类函数几乎不耗时但lens_corr函数较耗时非必要不使用。与STM32通信数据乱码或丢失1. 波特率不匹配。2. 未处理通信协议中的粘包、断包。3. 电气干扰。1. 确认双方波特率设置一致常用115200。2. 在STM32端实现严格的帧头校验、长度校验和校验和检查并增加超时重同步机制。3. 确保共地良好通信线远离电机驱动等大电流线路。运行一段时间后程序死机1. 内存泄漏MicroPython特有。2. 中断冲突或硬件错误。1. 避免在循环内不断创建大的对象如大列表、新image对象。尽量复用对象。使用img.to_grayscale()代替sensor.set_pixformat(sensor.GRAYSCALE)在循环内切换。2. 检查是否同时使用了不兼容的中断如定时器中断和某些图像函数。简化程序逻辑。AprilTag识别距离很近或识别不到1. 对焦问题。2. Tag尺寸太小或环境光太暗。3. 家族设置错误。1. 手动调整OpenMV镜头上的对焦环直到画面清晰。2. 打印更大的Tag或增加照明。尝试使用TAG36H11家族它比较通用。3. 确认代码中tag_families设置正确。最后几个来自实战的忠告第一电源一定要足。OpenMV虽然功耗不高但对电压稳定很敏感。务必使用一块独立的LDO稳压芯片如AMS1117-3.3为其供电千万不要直接从电机驱动模块取电电机启停造成的电压波动很可能导致OpenMV重启。 第二固定一定要牢。摄像头在车上的安装必须稳固任何微小的抖动在图像上都会被放大导致识别坐标剧烈跳动。使用海绵双面胶加扎带双重固定是常见做法。 第三代码版本管理。每次下场地测试前给当前稳定的代码在IDE里保存一个副本.py文件。现场调整参数时另存为新文件进行修改。这样一旦调乱了可以快速回退到上一个稳定版本。 第四现场适应性调试。比赛现场的光照、场地颜色和实验室完全不同。务必留出足够时间在现场用“阈值编辑器”重新校准所有颜色阈值并测试各种可能的角度和距离。
返回列表