[开源] 缓解摄像头抖动问题:单目视觉下的植物生长监测算法实现

项目背景:

笔者最近尝试使用单目相机检测和deeplabv3的语义分割模型对帐篷内盆栽植物生长的速度进行检测,主要粗略测量植物整体的面积投影,但是经过长时间的测量发现,由于植物叶片面积的生长速度应以星期计算,在此期间,任何对相机造成抖动、位移变化都会造成显著的透视失真,所以就产生了本项目,运用张正友标定法和PnP算法,以一种低成本的方法去缓解相机抖动产生的透视失真;

GitHub:github.com/llljllj/mon...

项目适用场景:

本项目主要适用于低成本、长时序、无人值守的植物生长监测任务,特别是在无法部署深度传感器的环境下。本项目适用于:

  • 低成本智慧农业与家庭园艺监测
  • 场景描述: 在家庭阳台、小型温室或帐篷内,使用普通USB摄像头或树莓派摄像头对植物进行连续数周的生长记录。
  • 优化问题: 缓解因支架松动、人为触碰、风吹震动或清洁维护导致的摄像头位姿微小偏移。无需每次移动后重新严格标定,算法可自动校正由视角变化引起的面积计算波动,保证生长曲线的平滑性。

注: 本项目不适用于对叶片绝对表面积有严格计量要求的场景(如需要计算精确的光合作用有效面积),也不适用于叶片高度差极大或遮挡极严重的立体植株。

流程介绍:

  1. 早期方法:首先采用 YOLOv8m 模型对植物目标进行检测与锚定,在此基础上使用 DeepLabv3 对植物区域进行精细分割,并计算植物的像素面积。

  2. 后续方法:在后续的实验过程中发现,这套方法基本上已经被Meta 在去年年底出的 SAM3 模型干翻了,后者在分割精度和泛化能力上具有显著优势,因此后续工作更推荐直接使用 SAM3 进行目标分割,代码已更新至SAM3模型直接进行语义分割,亦可自己训练所需的植物模型进行分割。

  3. 使用张氏标定法对相机进行内参与畸变参数标定,并结合9x6 棋盘格 + PnP算法对相机位姿进行估计,并在解算过程中纳入畸变参数以修正透视误差。 该步骤为后续基于几何关系的面积还原提供可靠的相机模型基础。

  4. 在完成标定后,对摄像头进行人为控制的位移,分别在不同高度、距离和拍摄角度下采集图像。 采集过程中需保证棋盘格始终清晰可识别,通过 PnP 算法获取每一次相机移动对应的平移向量与旋转向量,用于描述相机位姿变化。

  5. 针对相机位移与角度变化导致的植物像素面积变化,设计并对比了三种面积还原方法: 参照组方法: 直接根据棋盘格角点在图像中的变化关系,计算缩放因子,对植物像素面积进行线性还原。 PnP 位姿方法: 利用 PnP 算法获得的旋转向量和平移向量,结合相机几何模型计算缩放因子,对面积进行还原。 角度补偿方法: 在检测到相机视角变化较大(旋转角度超过 15°)时,引入额外的角度补偿机制,以提高在大角度变化场景下的还原精度。

  6. 在高度、距离、角度轻微变化的情况下,还原算法的准确度较高

算法原理:

1. 相机标定原理(张氏标定法)

张氏标定法通过多张不同视角的棋盘格图像,联合估计相机的内参矩阵与畸变参数。

2.1 相机模型

相机内参矩阵:

其中 fx,fy​ 为焦距(像素单位),cx,cy​ 为主点坐标。

2.2 重投影误差

棋盘格第 i 个角点的重投影误差定义为:

其中:

  • Xi:角点世界坐标(棋盘格平面,Z=0)
  • ui:检测到的像素坐标
  • π(⋅):针孔投影模型 + 畸变修正
  • r,t:相机姿态

整体标定目标为最小化均方根重投影误差(RMSE):

RMSE 越小,标定精度越高。

2. 像素间距缩放法

原理

利用棋盘格相邻角点在图像中的平均像素间距作为尺度参考,通过与参考图像对比计算缩放因子。

数学表达

没有什么必要解释,只是单纯的作为参照组,实现原理较为简单,可直接参考代码。

3. 基于 PnP 的姿态投影法

原理

在已知相机内参的前提下,利用 PnP 算法根据棋盘格 3D--2D 对应关系估计相机姿态,并将棋盘格世界坐标投影回图像,消除部分透视影响。

PnP 模型

通过最小化投影误差求解旋转矩阵 R 和平移向量 t。

投影尺度计算

将棋盘格世界坐标重新投影,计算相邻投影点的平均像素间距 ,得到尺度:

面积还原:

4. PnP + 俯仰角补偿法

原理

当相机发生明显俯仰(梯形畸变)时,引入基于俯仰角余弦的透视补偿因子。

俯仰角 θ 由旋转矩阵 R 提取:

角度补偿因子

最终缩放因子:

面积还原:

误差来源:

  1. 棋盘格在图像中占比过小导致角点检测精度下降,进而放大PnP估计噪声
  2. 俯仰角补偿的cos项在大角度(>30°)时基本无法补偿
  3. 叶片非严格共面(翘起、重叠、高低差),单一尺度因子无法同时适用于所有区域
  4. 分割模型边缘误差
  5. 镜头残余畸变及光照条件
  6. 2D图像无法恢复被遮挡的叶片面积,这是单目视觉的物理极限。

使用方法:

1. 环境搭建:

bash 复制代码
 git clone https://github.com/llljllj/monocular-plant-area.git cd monocular-plant-area pip install -r requirements.txt

2. 相机标定

准备一张打印好的棋盘格(建议贴在硬纸板上保证平整),在不同角度和距离下拍摄不少于 20 张图片放入输入文件夹。 运行标定脚本时,需输入棋盘格的内角点个数(例如9行6列的交点数,非格子数)以及现实世界中每个格子的实际边长(单位:毫米)。脚本将自动计算并输出相机的内参矩阵和畸变系数并生成npz文件。

css 复制代码
 python calibrate.py --rows 9 --cols 6 --size 20 # 生成 calibration.npz

3. 运行主程序:

确保待测图片中包含完整的植物和清晰的棋盘格(用于实时位姿估计),且第一张图片(命名为 1.jpg)作为参考基准。运行主程序脚本,程序将自动执行以下步骤:

  • 植物分割:调用 SAM3 模型自动分割植物区域。
  • 位姿解算:识别棋盘格并计算相机相对于参考图片的位姿变化(距离、高度、角度)。
  • 面积补偿:基于位姿变化计算补偿因子,将当前视角的植物像素面积还原为参考视角下的近似物理面积。
  • 结果输出:生成带有测量数据和可视化标注的图片,并输出详细的数据对比报表(CSV文件)。
css 复制代码
 python sam3_area_calculation.py --folder "Sample" --mode h

后续优化:

笔者认为,对于无人监控产生透视失真进行判断时,不仅要从空间上、从棋盘格上去考虑,也从时序性上考虑,需要同时加入一些时序算法以减小还原面积的误差,例如某段时间植物面积异常增大需要警告等,或者引入卡尔曼滤波提高生长曲线的平滑度;

叠甲:

需要说明的是,本文结论仅基于在有限条件下,对不同角度、距离及高度进行的数十次实验与观测所得。受限于二维图像在空间信息还原方面的天然不足,其结果在精度与完整性上可能与实际情况存在偏差。

同时,由上述公式可以推导出,当高度、角度或距离任意参数发生较大偏移时,相关误差可能呈现指数级放大趋势。

求轻喷

相关推荐
Katecat996634 小时前
野生动物多类别目标检测-改进YOLO11结合AKConv提升兔子野兔猞猁狼识别效果
人工智能·目标检测·计算机视觉
硅谷秋水15 小时前
多智体机器人系统(MARS)挑战的进展与创新
深度学习·机器学习·计算机视觉·语言模型·机器人·人机交互
思通数科人工智能大模型17 小时前
电力巡检无人机和工程车“空地一体”AI全域巡检方案
人工智能·目标检测·计算机视觉·数据挖掘·无人机·知识图谱·零售
AomanHao1 天前
【ISP】基于暗通道先验改进的红外图像透雾
图像处理·人工智能·算法·计算机视觉·图像增强·红外图像
开开心心就好1 天前
轻松鼠标连, 自定义区域模仿人手点击
人工智能·windows·物联网·计算机视觉·计算机外设·ocr·excel
啊阿狸不会拉杆1 天前
《计算机视觉:模型、学习和推理》第 1 章 - 绪论
人工智能·python·学习·算法·机器学习·计算机视觉·模型
啊阿狸不会拉杆1 天前
《计算机视觉:模型、学习和推理》第 2 章-概率概述
人工智能·python·学习·算法·机器学习·计算机视觉·ai
沃达德软件2 天前
视频增强技术解析
人工智能·目标检测·机器学习·计算机视觉·超分辨率重建
冰西瓜6002 天前
深度学习的数学原理(十)—— 权重如何自发分工
人工智能·深度学习·计算机视觉