当前位置: 首页 > news >正文

一种基于单目相机的圆柱体/长方体体积测量方法

概述

单目相机通常无法进行尺寸测量,要么使用远心镜头,通过近似正投影的方式来获取轮廓,进行一维测量。

而本文提出了一种基于单目相机的旋转体体积测量方法,使用普通相机镜头就可以实现。整个测量过程如下:

  • 对单目相机进行标定
  • 将旋转体放置在平面上(平面形式包括但不限于标定板、Aruco 编码块等,平面上必须要有可以提前识别出二维坐标和三维坐标的图案)
  • 相机从侧面拍摄旋转体,要求可以拍到上顶面(全部可见)、和下底面(部分可见)
  • 算法调用,输出体积(圆柱体输出半径和高度,长方体输出长宽高)

原理

以圆柱体为例:

image

如上图所示,圆柱体立于平面1上,平面1上放置一个 aruco 编码块,相机侧拍圆柱体,可看到圆柱顶面完整轮廓以及底面部分轮廓。

步骤1:相机标定。通过相机标定获得相机内参 \(K\)

步骤2:平面1到相机的 \(RT\) 求解。平面1上的 aruco 编码块四个角点可检测到,同时其边长已知。假设为 \(w\) ,那么四个角点的三维坐标可以表示为$ (0,0,0)$ 、\((0,w,0)\)\((w,w,0)\)\((w,0,0)\) 。于是可以通过 PNP 计算出平面1到相机的 \([R_1,T_1]\)

步骤3:提取椭圆轮廓。提取图像中轮廓,并筛选得到底面轮廓 \(s_1\) 和顶面轮廓 \(s_2\)

步骤4:底面轮廓三维重建和拟合圆。在 aruco 所建立的世界坐标系下,底面轮廓 \(S_1\) 的三维坐标 \(Z=0\),再结合步骤1中得到的相机内参 \(K\)、步骤2 中的 \([R_1,T_1]\) 可以重建出底面轮廓 \(S_1\) ,同时可以拟合圆得到直径 \(D_1\)

步骤5:母线反投影。在底面轮廓 \(S_1\) 拟合出的圆上,均匀选取 6 个点,记作 \(A_1,\cdots,A_6\) 。由于圆柱体母线垂直于 \(Z=0\) 平面,那么将 \(A_1,\cdots, A_6\) 这几个点的 \(Z\) 坐标适当增大到某个值 \(Z_0\) ,得到 \(T_1,\cdots,T_6\) 。此时将 \(A_1,\cdots,A_6\)\(T_1,\cdots,T_6\) 利用相机内参 \(K\) 计算其对应的二维投影点(图像上)\(a_1, \cdots,t_6\) 。那么此时母线 \(A_iT_i(i=1,2,\cdots,6)\) 投影图像上得到的直线为 \(a_it_i\)

步骤6:顶面轮廓二维点和三维点计算。图像上母线 \(a_it_i\) 与顶面轮廓相交于 \(b_i\) ,那么同理在空间上,母线 \(A_iT_i\) 与顶面轮廓相交于 \(B_i\),于是根据母线垂直于 \(Z=0\) 平面可知,\(A_i\)\(B_i\) 的横纵坐标都应该相等。因此 6 条母线可以得到顶面轮廓上的 6 对 二维和三维点 \(b_i,B_i(i=1,\cdots,6)\)

步骤7:平面2到相机的 \(RT\) 求解。步骤6 得到的三维坐标 \(B_i\) 可以认为其直接落在平面2上,令世界坐标系在平面2上,所有\(b_i\)\(Z\) 坐标都为 0,而通过步骤6母线传递的横纵坐标仍然可保持不变。那么同步骤2类似,可利用二维和三维点 \(b_i,B_i(i=1,\cdots,6)\) 通过 PNP 计算出平面2到相机的 \([R_2,T_2]\)

步骤8:顶面轮廓三维重建和拟合圆。顶面轮廓 \(S_2\) 的三维坐标 \(Z=0\),再结合步骤1中得到的相机内参 \(K\)、步骤6 中的 \([R_2,T_2]\) 可以重建出底面轮廓 \(S_2\) ,同时可以拟合圆得到直径 \(D_2\)

步骤9:圆柱直径计算。由于底面只有部分轮廓,拟合圆直径可能存在偏差,而顶面轮廓重建经历了前面若干步骤传递了一些误差,因此为了平衡误差,最终圆柱的直径 \(D = \dfrac{D_1+D_2}{2}\)

步骤10:圆柱高度计算。平面1和平面2到相机的 \(RT\) 都已知,那么相机光心到平面1和平面2的距离都可以计算出来。将光心转换到平面1和平面2所在的世界坐标系下,其 \(Z\) 值即为高度,分别记作 \(H_1\)\(H_2\) ,那么根据这两个面平面,圆柱高度可表示为 \(H= |H1-H2 |\)

这套流程中最巧妙的地方在于利用母线将底面的坐标传递到了顶面,建立起了顶面二维点和三维点之间的映射关系;同时高度的计算因为相机位置始终没变,所以直接计算两个面到相机光心的距离之差就可以得到高度。尽管上述流程讲述的是圆柱体,但实际上长方体、或者其他通过底面拉伸得到的旋转体都可以这样求其体积。

成果

image-20260211212340453

http://www.jsqmd.com/news/371304/

相关文章:

  • 【状态估计】【雷达】基于扩展卡尔曼滤波的雷达目标跟踪融合研究附Matlab代码
  • 用FastAPI打造LangChain生产级后端架构,小白也能轻松上手
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC附Matlab代码
  • 【综合能源】电热冷综合能源优化调度研究附Matlab代码
  • 适合转行大模型吗?大模型的未来前景怎么样?普通人转行大模型:收藏这份学习资料,开启高薪未来!
  • 零代码搭建RAG智能客服:7x24小时精准应答,提升效率,收藏必备!
  • 【状态估计】【卡尔曼滤波器】基本离散kalman、固定增益的kalman、平方根kalman、遗忘因子kalman、扩大P卡尔曼、自适应kalman、有限K减小kalman雷达轨迹附Matlab代码
  • 【状态估计】【扩展卡尔曼滤波算法的神经网络训练】BP神经网络、扩展卡尔曼滤波EKF+BP、粒子滤波PF轨迹估计研究附Matlab代码
  • 【最优无功功率分配】基于改进路径探索算法(PFA)的最优无功功率分配研究【IEEE30、IEEE57、IEEE118、IEEE300节点】附Matlab代码
  • 夹具板工作流程总结
  • C++之函数模板
  • 2026-02-11学习
  • ERP MES PLM SCM QMS EAM IOT WMS
  • 从群发文案到私人定制:手把手教你微调一个懂人情世故的拜年助手
  • 互联网大厂Java面试场景:Redis缓存与Spring Cloud微服务实战解析
  • Java 中的 封装、继承、多态
  • flask context (Application/Request)深度详解
  • 垂域大模型评估不再靠“感觉”:用结构化测试集+自动化打分实现效果可量化
  • B3871 [GESP202309 五级] 因数分解
  • MyBatis XML 里<![CDATA[ ]]>的使用
  • elasticSearch之API:基础命令及文档基本操作
  • 【Azure Event Hub】在VMSS中使用WAD(Window Azure Diagnostic)插件发送日志到Event Hub中报错分析
  • Flask-SocketIO深度详解
  • 数据可视化能将复杂的临床数据转换成直观的图形和图像,展示数据间的关联和趋势,通过人类视觉思维能力帮助理解大量数据信息,发现数据中的规律,从而提高数据使用效率
  • Flask-Migrate深度详解
  • 价值投资经典书籍:《李大霄投资战略(第三版)》电子版解读:投资四面体模型分析(附PDF文件分享)
  • 26春1-6年级下册语文《寒假预习知识点汇总》pdf合集下载
  • 2025年Agent概念落地,2026年智能体生产力基础设施:如何规模化部署Agent?收藏这份学习指南!
  • 投资经典书籍之《股票大作手回忆录 丁圣元注疏版》PDF分享与深度解读
  • 中科天玑全要素AI舆情系统功能、架构解析 - 教程