☰
双目视觉与深度估计:从视差公式到果蔬采摘机器人实战解析
2026/10/5 20:09:09 网站建设 项目流程

简介:《计算机视觉在果蔬机械采摘中的应用研究》是一篇面向农业自动化与机器视觉方向的技术文献,可为果蔬采摘机器人、自动化采摘系统研究人员和相关专业学习者提供参考。资源共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% 以上。

这套验收顺序的好处是把一个大系统拆成四个可独立检查的环节。我在复现这类农业视觉项目时,最深刻的教训就是:不要一上来就联调整套系统,先把二值化这一步跑通,再用标定板把焦距和基线标准,最后才让机械臂动起来。从那以后我每次拿到这类视觉论文,都强制自己先写一个最小验证脚本,把核心公式变成代码跑出数值,再去做系统集成,省下的联调时间远比写脚本花的多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询