ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

双目视觉与深度估计:从视差公式到果蔬采摘机器人实战解析

双目视觉与深度估计:从视差公式到果蔬采摘机器人实战解析 简介《计算机视觉在果蔬机械采摘中的应用研究》是一篇面向农业自动化与机器视觉方向的技术文献可为果蔬采摘机器人、自动化采摘系统研究人员和相关专业学习者提供参考。资源共1个PDF文件压缩包约1.35MB内容为完整期刊论文涵盖摘要、关键词、正文及图表。目前已有91人在本站学习/下载。论文针对传统人工采摘劳动强度大、目标识别困难等问题系统阐述了计算机视觉系统的工作原理与部件构成涵盖照明装置选配、单色/彩色摄像机比较、图像低层处理、特征提取和模式识别等流程重点分析了双目立体视觉的数学建模推导了目标点深度与三维坐标的关键公式并完成机械采摘系统的硬件平台与软件流程设计还通过仿真实验验证了目标识别与定位的精度及系统稳定性。对于相关课题研究、课程设计或学术论文写作其中的理论推导、系统架构和工程实现思路都可直接借鉴。1. 识别率 98.6% 的果蔬采摘系统这份资料拆开看是什么做农业视觉的人第一次翻开这篇论文时多半会被两个数字抓住正常个体识别率 98.6%被遮挡个体识别率 93.2%单果采摘速度 25 秒。这两个数字背后是一套完整的双目视觉果蔬采摘系统从相机标定、图像分割、立体匹配到机械臂抓取全部串成了一条链。论文出自保定职业技术学院团队发表在《农机化研究》2021 年第 6 期用橙子作为试验对象做了仿真验证。对正在做计算机视觉大作业、农业机器人课程设计或者想入坑“视觉机械臂”这条线的从业者来说这篇论文的价值在于它把原理、建模、硬件选型、软件流程写得非常规整几乎可以直接当作一个小型采摘项目的需求文档和技术路线图来用。更难得的是它把双目测距的数学推导完整给了出来而不是像很多资料那样只贴一句“用深度学习识别”这对理解系统边界、复现实验、回答答辩问题都很有帮助。2. 双目视觉建模为什么两台相机就能算出果实的深度2.1 从单目到双目像素坐标与空间坐标的对应关系计算机视觉系统模拟人的行为成像装置相当于眼睛计算机相当于大脑执行机构相当于四肢。单目相机的问题在于一张二维图像里的一个像素坐标 (x, y)可以对应真实空间里无数个三维点深度信息丢失了。论文的做法是直接用两台参数完全相同的摄像机同步拍摄利用视差恢复深度这是经典的双目立体视觉路线。这里有个容易理解偏差的点双目测距不是“两台相机拍两张图做匹配”这么简单而是从成像原理出发建立几何关系。论文借鉴小孔成像模型认为任意像素点坐标 (x, y) 与真实空间坐标 (x, y, z) 一一对应。两个摄像机位置相互平行且成像平面重合焦距 f 和中心距 b 已知目标点 P 在左右成像面上分别落在像素坐标 P1(x1, y1) 和 P2(x2, y2)x1 与 x2 的差值就是视差。用三角相似原理就能推出目标点深度这是整套系统的数学地基。2.2 视差公式推导Z bf/(x1 - x2) 到底在算什么论文第 2 节给出了完整推导过程。取两摄像机中心连线 O1O2 的中点为世界坐标系原点目标点 P 在 XOY 平面的投影如图 3 所示。由三角相似关系P 到 O1O2 连线的距离 d 等于 bf/(x1 - x2)。注意这个 d 就是目标点到 Z 轴的距离也就是深度 Z。同理可以推出 X 和 Y 坐标X b(x1 x2) / [2(x1 - x2)] Y b(y1 y2) / [2(y1 - y2)] Z bf / (x1 - x2)三个公式放在一起看规律很清晰视差 x1 - x2 出现在所有分母里。视差越大深度越小目标越近视差为零目标在无穷远。X 和 Y 的分子是左右像素坐标的均值相当于用两个视角的中间值去抵消相机视角造成的偏差。这说明双目系统在理论上对目标点的三维重建是完备的只要视差算得准坐标就能算得准。实际落地时f 和 b 是两个关键标定量。f 是焦距单位要和像素统一b 是两台相机的中心距基线。论文没有给出实验用的具体数值但常见做法是室外果园场景基线取 10 到 20 厘米焦距用标定板算出来的像素焦距。基线拉长能提高近距离测距精度但会缩小共同视野遮挡也会更严重这是一个需要根据工作距离折中的参数。2.3 三点前提条件与设备选型参数这套数学模型能成立前提条件有三个缺一个精度就崩。第一两个摄像机型号和参数必须完全相同论文明确写了“两个摄像机的焦距和内参数完全相同”。第二两个摄像机的位置必须相互平行且成像平面重合实际安装时很难做到绝对平行所以要先做极线校正。第三左右图像中对应的目标点必须正确匹配这一步依赖特征提取的质量和匹配算法的鲁棒性。选型参数可以参考下表参数建议范围说明焦距 f6mm 或 8mm 定焦定焦镜头畸变小标定参数稳定不要用自动变焦基线 b100mm - 200mm工作距离 0.5m - 2m 时常用基线太长视野重叠小分辨率1920×1080 及以上分辨率影响 x1、x2 的像素精度间接决定视差精度相机类型彩色相机果蔬颜色特征是分割的重要依据单色相机丢掉了颜色信息同步方式硬件触发同步软触发存在时间差运动中的果实会引入匹配偏差提示论文在引言部分提到单色摄像机与彩色摄像机对光照感应范围不同需根据采摘需求选配。做果蔬识别时优先选彩色相机因为成熟果蔬的颜色饱和度往往是分割阶段最能直接利用的特征。3. 系统硬件架构视觉、控制、机械臂三块怎么耦合3.1 系统总体结构与分工论文第 3 节把采摘系统分成三大块控制系统、机械臂系统和计算机视觉系统。控制系统的角色是“底盘大脑”完成地面运动控制、接收视觉系统传递的目标信号、驱动采摘平台移动并向机械臂输出抓取指令。机械臂系统是执行终端负责大臂、关节、夹持机构的动作。计算机视觉系统是“眼睛”负责环境获取、目标识别与定位并把图像数据交给控制系统。这套架构里最容易被新手忽略的是目标存放篮论文总体设计图里编号 4 就是它。视觉系统不仅要识别果实还要判断果实在空间中的位置机械臂摘下来之后要放到存放篮里如果篮子的坐标没有参与系统建模机械臂就只能“摘”不能“放”。虽然论文没有展开存放篮的定位细节但做真机实验时这一步绕不开。3.2 视觉系统硬件组成与选型要点视觉系统主要由摄像机、视频采集卡、视频线缆及计算机组成。摄像机负责图像获取视频采集卡把模拟或数字视频信号转成计算机能处理的格式计算机运行图像预处理、分割、特征提取、立体匹配和模型计算。这套配置在论文发表年份是主流方案今天做新项目一般会直接用 USB3.0 或 GigE 接口的工业相机省掉采集卡但系统组成逻辑不变。安装时要特别注意两台相机的相对姿态。论文模型假设两个摄像机平行共面物理安装很难做到绝对理想因此软件流程里必须有“极线校正”这一步。校正之后左右图像中同一目标点只在水平方向有偏移垂直差接近零这时 x1 - x2 才是真正的视差。如果相机装歪了又不校正视差里会混入垂直分量测距结果直接失真。3.3 控制链路视觉数据到 PLC 指令的完整通路控制链路是很多学习者读完论文仍然觉得玄学的地方其实把数据流拆开就清楚了。视觉系统的计算机完成目标识别和定位后输出的是一组三维坐标和图像信息。这些数据传到工控机经数据转换接口转发给 PLC 控制器。PLC 根据预设的采摘逻辑计算控制参数输出到机械臂系统的驱动模块再由驱动单元控制大臂、关节机构、夹持机构的动作。链路节点职责与视觉系统的接口视觉计算机图像采集、目标识别、三维定位输出目标坐标 (X, Y, Z) 与图像数据工控机接收视觉数据转发控制指令通过数据转换模块与 PLC 通信PLC 控制器输出控制参数驱动执行机构接收目标坐标根据行程范围做运动规划机械臂驱动模块控制大臂、关节、夹持机构接收 PLC 控制信号驱动步进/伺服电机这条链路中最容易出问题的环节是坐标系的统一。视觉系统计算出的目标坐标是世界坐标系下的值原点在两摄像机中心连线的中点。机械臂的抓取动作是在机械臂基座坐标系下规划的。两个坐标系之间有平移和旋转关系论文没有给出标定方法但实际项目中必须做手眼标定否则视觉给出的坐标再准机械臂也会抓空。4. 软件流程与目标识别从摄像机标定到坐标输出4.1 软件主流程初始化、标定、采集、匹配、定位论文第 4 节的软件流程图给出了完整工作顺序系统启动后先做软硬件初始化然后开始摄像机标定接下来启动图像采集程序两台摄像机同步取图。采集到的图像依次经过预处理、分割、目标识别送入计算机判断。如果两个摄像机同时发现目标就进入立体匹配阶段结合标定参数计算目标的三维坐标输出坐标与图像信息给控制系统。控制系统计算结果后驱动平台移动到达目标附近后启动机械臂程序完成抓取。这套流程有一个值得注意的设计先判断“两个摄像机是否同时发现目标”再决定是否做立体匹配。这意味着系统在单目模式下也能工作当一个相机的视野被遮挡时系统可以降级为单目识别只是深度信息缺失。这个容错设计在实际果园环境中很实用因为树叶遮挡是常态如果强制要求两路相机都看到目标才动手采摘成功率会很低。4.2 图像预处理与二值化复现论文识别流程的 OpenCV 代码论文实验部分的图像处理路径是采集原图像 → 二值化处理 → 确定采摘目标轮廓 → 完成定位。仿真实验用橙子做对象成熟橙子的颜色与树叶、枝干差异明显二值化分割是可行方案。下面用 OpenCV 复现这条路径逻辑与论文一致只是把论文没有展开的实现细节补齐。import cv2 import numpy as np # 读取采摘目标原始图像 img cv2.imread(orange.jpg) rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 灰度化 高斯滤波抑制树叶纹理噪声 gray cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY) blur cv2.GaussianBlur(gray, (5, 5), 0) # 大津阈值二值化自动确定分割阈值 _, binary cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 提取外部轮廓过滤掉面积过小的噪声区域 contours, _ cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) centers [] for cnt in contours: area cv2.contourArea(cnt) if area 50: continue x, y, w, h cv2.boundingRect(cnt) cx, cy x w // 2, y h // 2 centers.append((cx, cy, area)) cv2.circle(rgb, (cx, cy), 4, (255, 0, 0), -1) print(检测到目标中心点:, centers)这段代码里高斯滤波核大小取 5×5在去除噪声和保留果实边缘之间比较均衡大津阈值不需要人工指定阈值对光照变化有一定适应能力面积阈值 50 像素用来滤掉小噪点。轮廓中心点cx, cy就是左右图像中的目标像素坐标后续代入双目模型计算三维位置。注意这只是一个识别分割示例实际果园场景光照复杂论文的仿真实验也提到“分析摄像机采集的图像信息”说明环境是相对可控的。4.3 立体匹配与目标定位怎么从视差得到采摘点立体匹配的关键是找到左右图像中同一个目标的对应关系。论文流程中匹配发生在分割和识别之后而非直接在原始图像上做密集匹配。这是一个工程上很合理的取舍全图密集匹配计算量大农业采摘系统对实时性有要求先用颜色特征把果实区域找出来再做稀疏匹配只需要对少数几个候选目标计算视差即可。匹配完成后每个目标都有左右两条检测结果 (x1, y1) 和 (x2, y2)。用 2.2 节的三组公式计算 (X, Y, Z)得到的是目标表面的三维坐标。实际控制机械臂抓取时这个点并不一定是抓手的最佳接触点因为果实有体积抓取点应该在质心附近而不是表面最近点。论文实验的目标是“完成采摘目标的定位”没有细化抓取姿态做真机时一般会在果实表面坐标基础上沿深度方向增加一个果实半径的偏移量。5. 避坑指南双目采摘系统最常见的五个翻车点5.1 标定参数用了出厂值测距误差大得离谱现象按 2.2 节公式算出的深度值与实测值差了几十厘米而且距离越远偏差越大。原因相机出厂标注的焦距是光学焦距单位是毫米而公式里的 x1 - x2 是像素差像素单位和毫米单位混在一起算结果必然错误。解决先用标定板做一次完整标定得到像素单位的焦距 fx、fy以及主点 cx、cy。之后再代入公式时统一用像素单位。我一般会写一个标定脚本把棋盘格图片跑一遍保存相机参数到 JSON 文件每次启动时加载不重复标定。5.2 两台相机没有做极线校正视差里混入了垂直分量现象分割结果正确但同一目标在左右图像中的 y 坐标明显不同代入公式后深度波动很大。原因物理安装不可能做到绝对平行两台相机之间存在微小旋转角导致同一目标在左右图像中除了水平差异外还有垂直差异。解决软件流程里增加极线校正步骤用相机标定得到的畸变系数和旋转矩阵做立体校正。校正后检查左右图像中目标点的 y 坐标差控制在 1 到 2 个像素以内再算视差。5.3 光照变化导致二值化阈值失效现象上午能正常识别的分割参数到了下午阴影环境果实区域被切成碎片或者整片漏检。原因固定阈值二值化对光照敏感论文仿真环境的光照是可控的真实果园里树叶遮挡会造成局部阴影果实颜色特征发生变化。解决用大津阈值代替固定阈值加上颜色空间的限定。论文提到“利用照明装置排除外界光照环境因素的干扰”实际项目中还需要考虑补光灯的安装位置避免强光直射造成果实表面高光反射。5.4 遮挡目标被漏检识别率直接从 98% 掉到 90%现象果树内部的果实被枝叶遮挡二值化后目标不完整轮廓面积小于面积阈值被当成噪声过滤掉。原因论文实验中“被遮挡个体”识别率 93.2%低于“正常识别个体”的 98.6%说明遮挡是识别率损失的主要来源。面积阈值过滤噪声时也把不完整的目标轮廓过滤掉了。解决把面积阈值降低对轮廓做凸包补全或者用颜色分割先提取候选区域再做形状判断。需要注意的是遮挡目标即使能被识别双目匹配也可能因为两个相机视角不同而出现“左眼看到、右眼被挡”的情况所以对遮挡目标要设置独立的置信度阈值。5.5 视觉坐标算得准机械臂还是抓空现象视觉定位结果在电脑上显示与目标吻合机械臂执行后抓手却落在果实旁边。原因视觉坐标系与机械臂坐标系没有统一。视觉系统以两相机中心连线中点为原点机械臂以基座为原点两套坐标系之间存在平移和旋转偏移。解决做手眼标定算出视觉坐标系到机械臂坐标系的变换矩阵。论文的数学模型求解的是目标在世界坐标系中的位置论文没有提这个坐标系变换步骤但这是从仿真走向真机必须补上的一环。我见过太多项目栽在这上面视觉和机械臂各做各的联调时完全对不上。6. 从论文到可运行原型最小验证脚本与验收顺序6.1 用论文公式做深度验证拿到论文后第一件事不是去复现整个系统而是把 2.2 节的核心公式单独跑一遍验证自己对模型的理解是否正确。下面这个脚本可以帮你直观感受视差与深度的关系。# 双目深度验证脚本输入参数与视差输出深度 b 0.12 # 基线单位米 f_mm 6.0 # 焦距单位毫米 sensor_width 6.4 # 传感器宽度单位毫米 pixel_width 1920 # 图像水平分辨率 # 将毫米焦距转换为像素焦距 f_pixel f_mm * pixel_width / sensor_width # 左右图像目标列坐标模拟值 x1, x2 1000, 920 disparity x1 - x2 Z b * f_pixel / disparity print(f像素焦距: {f_pixel:.2f} px) print(f视差: {disparity} px) print(f目标深度: {Z:.3f} m)这个脚本里有两个关键点。第一f 必须从毫米换算成像素否则算出的深度单位是混乱的。换算公式是 f_pixel f_mm × 像素宽度 / 传感器宽度1920 像素对应 6.4mm 宽的传感器时6mm 焦距等于 1800 像素。第二视差每变化 1 个像素深度变化量不是均匀的近距离的深度分辨率高远距离的深度分辨率急剧下降。把 x1 - x2 从 80 改成 70深度会从 0.27m 跳变到 0.31m距离越远这种跳变越明显。6.2 从二值化到轮廓中心提取在第 4 章代码基础上做个扩展把识别结果与双目标定结合起来。左右相机各自跑一遍分割和轮廓提取得到同一目标的像素坐标然后代入双目公式算三维位置。这段逻辑用一个函数就能串起来def calc_3d(px_l, px_r, f_pixel, b): 根据左右图像目标像素坐标计算三维位置 disparity px_l - px_r if disparity 0: return None Z b * f_pixel / disparity X b * (px_l px_r) / (2 * disparity) return X, Z实际使用时左右相机的目标匹配需要靠面积、颜色直方图或者极线约束来确定。第 4 章代码里 centers 列表存储了检测到的目标中心左右两路结果按面积接近程度匹配差异在 20% 以内的视为同一目标。兜底策略是如果一个目标只在单目中被检测到系统进入降级模式只给出方向信息不尝试计算深度避免错误数据驱动机械臂动作。6.3 验收顺序与核对指标复现系统时按这个顺序走每一步都有明确的通过标准。第一步单独验证图像分割目标是正常个体的二值化识别率达到 95% 以上用论文的 98.6% 作为参考线。第二步验证双目测距在 0.5m 到 1.5m 范围内摆放目标物实测距离与计算距离误差控制在 3% 以内。第三步验证动态采摘流程目标识别、坐标计算、机械臂联动全程耗时控制在 25 秒以内对标论文的采摘速度。第四步测试遮挡场景目标被枝条遮挡面积不超过 50% 时识别率保持在 90% 以上。这套验收顺序的好处是把一个大系统拆成四个可独立检查的环节。我在复现这类农业视觉项目时最深刻的教训就是不要一上来就联调整套系统先把二值化这一步跑通再用标定板把焦距和基线标准最后才让机械臂动起来。从那以后我每次拿到这类视觉论文都强制自己先写一个最小验证脚本把核心公式变成代码跑出数值再去做系统集成省下的联调时间远比写脚本花的多。希望帮到你。本文还有配套的精品资源点击获取
返回列表