三维扫描的精度验证方法二——拟合球体

18 篇文章 200 订阅 ¥19.90 ¥99.00

借助于CloudCompare软件

1、用三维扫描仪扫描一个标准球体,已知球体的直径,用CloudCompare打开

2、找到CloudCompare软件中的拟合球体选项,计算球体的直径,然后与实际的尺寸做比对,下图为得到的拟合的球体

下图为操作步骤

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
最小二乘球体是一种用于三维数据点到球体模型的算法。它通过最小化数据点到球体的距离平方和来确定最佳的球体参数。以下是一个使用C++实现最小二乘球体的示例代码: ```cpp #include <iostream> #include <vector> #include <cmath> struct Point3D { double x; double y; double z; }; struct Sphere { double centerX; double centerY; double centerZ; double radius; }; Sphere fitSphere(const std::vector<Point3D>& points) { double sumX = 0.0; double sumY = 0.0; double sumZ = 0.0; double sumX2 = 0.0; double sumY2 = 0.0; double sumZ2 = 0.0; double sumXY = 0.0; double sumXZ = 0.0; double sumYZ = 0.0; double sumX3 = 0.0; double sumY3 = 0.0; double sumZ3 = 0.0; double sumXY2 = 0.0; double sumXZ2 = 0.0; double sumYZ2 = 0.0; for (const auto& point : points) { double x = point.x; double y = point.y; double z = point.z; sumX += x; sumY += y; sumZ += z; sumX2 += x * x; sumY2 += y * y; sumZ2 += z * z; sumXY += x * y; sumXZ += x * z; sumYZ += y * z; sumX3 += x * x * x; sumY3 += y * y * y; sumZ3 += z * z * z; sumXY2 += x * y * y; sumXZ2 += x * z * z; sumYZ2 += y * z * z; } double N = points.size(); double D11 = sumX2 + sumY2 + sumZ2; double D12 = sumX * sumY + sumX * sumZ + sumY * sumZ; double D13 = sumX * sumY2 + sumX * sumZ2 + sumY * sumZ2; double D14 = sumX2 * sumY + sumX2 * sumZ + sumY2 * sumZ; double D21 = D12; double D22 = sumX2 + sumY2 + sumZ2; double D23 = sumX2 * sumY + sumX2 * sumZ + sumY2 * sumZ; double D24 = sumX * sumY2 + sumX * sumZ2 + sumY * sumZ2; double D31 = D13; double D32 = D23; double D33 = sumX2 + sumY2 + sumZ2; double D34 = sumX * sumY + sumX * sumZ + sumY * sumZ; double D41 = D14; double D42 = D24; double D43 = D34; double D44 = N; double D = D11 * (D22 * D33 * D44 + D23 * D34 * D42 + D24 * D32 * D43 - D24 * D33 * D42 - D23 * D32 * D44 - D22 * D34 * D43) - D12 * (D21 * D33 * D44 + D23 * D34 * D41 + D24 * D31 * D43 - D24 * D33 * D41 - D23 * D31 * D44 - D21 * D34 * D43) + D13 * (D21 * D32 * D44 + D22 * D34 * D41 + D24 * D31 * D42 - D24 * D32 * D41 - D22 * D31 * D44 - D21 * D34 * D42) - D14 * (D21 * D32 * D43 + D22 * D33 * D41 + D23 * D31 * D42 - D23 * D32 * D41 - D22 * D31 * D43 - D21 * D33 * D42); double Dx = D11 * (D22 * D33 * sumX + D23 * D34 * sumY + D24 * D32 * sumZ - D24 * D33 * sumY - D23 * D32 * sumZ - D22 * D34 * sumX) - D12 * (D21 * D33 * sumX + D23 * D34 * sumZ + D24 * D31 * sumY - D24 * D33 * sumZ - D23 * D31 * sumY - D21 * D34 * sumX) + D13 * (D21 * D32 * sumX + D22 * D34 * sumZ + D24 * D31 * sumY - D24 * D32 * sumZ - D22 * D31 * sumY - D21 * D34 * sumX) - D14 * (D21 * D32 * sumY + D22 * D33 * sumX + D23 * D31 * sumZ - D23 * D32 * sumX - D22 * D31 * sumZ - D21 * D33 * sumY); double Dy = D11 * (D22 * D33 * sumY + D23 * D34 * sumZ + D24 * D32 * sumX - D24 * D33 * sumZ - D23 * D32 * sumX - D22 * D34 * sumY) - D12 * (D21 * D33 * sumY + D23 * D34 * sumX + D24 * D31 * sumZ - D24 * D33 * sumX - D23 * D31 * sumZ - D21 * D34 * sumY) + D13 * (D21 * D32 * sumY + D22 * D34 * sumX + D24 * D31 * sumZ - D24 * D32 * sumX - D22 * D31 * sumZ - D21 * D34 * sumY) - D14 * (D21 * D32 * sumZ + D22 * D33 * sumY + D23 * D31 * sumX - D23 * D32 * sumY - D22 * D31 * sumX - D21 * D33 * sumZ); double Dz = D11 * (D22 * D33 * sumZ + D23 * D34 * sumX + D24 * D32 * sumY - D24 * D33 * sumX - D23 * D32 * sumY - D22 * D34 * sumZ) - D12 * (D21 * D33 * sumZ + D23 * D34 * sumY + D24 * D31 * sumX - D24 * D33 * sumY - D23 * D31 * sumX - D21 * D34 * sumZ) + D13 * (D21 * D32 * sumZ + D22 * D34 * sumY + D24 * D31 * sumX - D24 * D32 * sumY - D22 * D31 * sumX - D21 * D34 * sumZ) - D14 * (D21 * D32 * sumY + D22 * D33 * sumZ + D23 * D31 * sumX - D23 * D32 * sumZ - D22 * D31 * sumX - D21 * D33 * sumY); double Dxx = D11 * (D22 * D33 * sumX2 + D23 * D34 * sumXY + D24 * D32 * sumXZ - D24 * D33 * sumXY - D23 * D32 * sumXZ - D22 * D34 * sumX2) - D12 * (D21 * D33 * sumX2 + D23 * D34 * sumXZ + D24 * D31 * sumXY - D24 * D33 * sumXZ - D23 * D31 * sumXY - D21 * D34 * sumX2) + D13 * (D21 * D32 * sumX2 + D22 * D34 * sumXZ + D24 * D31 * sumXY - D24 * D32 * sumXZ - D22 * D31 * sumXY - D21 * D34 * sumX2) - D14 * (D21 * D32 * sumXY + D22 * D33 * sumX2 + D23 * D31 * sumXZ - D23 * D32 * sumX2 - D22 * D31 * sumXZ - D21 * D33 * sumXY); double Dyy = D11 * (D22 * D33 * sumY2 + D23 * D34 * sumYZ + D24 * D32 * sumY2 - D24 * D33 * sumYZ - D23 * D32 * sumY2 - D22 * D34 * sumY2) - D12 * (D21 * D33 * sumY2 + D23 * D34 * sumY2 + D24 * D31 * sumYZ - D24 * D33 * sumY2 - D23 * D31 * sumYZ - D21 * D34 * sumY2) + D13 * (D21 * D32 * sumY2 + D22 * D34 * sumY2 + D24 * D31 * sumYZ - D24 * D32 * sumY2 - D22 * D31 * sumYZ - D21 * D34 * sumY2) - D14 * (D21 * D32 * sumYZ + D22 * D33 * sumY2 + D23 * D31 * sumY2 - D23 * D32 * sumY2 - D22 * D31 * sumY2 - D21 * D33 * sumYZ); double Dzz = D11 * (D22 * D33 * sumZ2 + D23 * D34 * sumZ2 + D24 * D32 * sumYZ - D24 * D33 * sumZ2 - D23 * D32 * sumYZ - D22 * D34 * sumZ2) - D12 * (D21 * D33 * sumZ2 + D23 * D34 * sumYZ + D24 * D31 * sumZ2 - D24 * D33 * sumYZ - D23 * D31 * sumZ2 - D21 * D34 * sumZ2) + D13 * (D21 * D32 * sumZ2 + D22 * D34 * sumYZ + D24 * D31 * sumZ2 - D24 * D32 * sumYZ - D22 * D31 * sumZ2 - D21 * D34 * sumZ2) - D14 * (D21 * D32 * sumYZ + D22 * D33 * sumZ2 + D23 * D31 * sumZ2 - D23 * D32 * sumZ2 - D22 * D31 * sumZ2 - D21 * D33 * sumYZ); double Dxy = D11 * (D22 * D33 * sumXY + D23 * D34 * sumY2 + D24 * D32 * sumYZ - D24 * D33 * sumY2 - D23 * D32 * sumYZ - D22 * D34 * sumXY) - D12 * (D21 * D33 * sumXY + D23 * D34 * sumYZ + D24 * D31 * sumY2 - D24 * D33 * sumYZ - D23 * D31 * sumY2 - D21 * D34 * sumXY) + D13 * (D21 * D32 * sumXY + D22 * D34 * sumYZ + D24 * D31 * sumY2 - D24 * D32 * sumYZ - D22 * D31 * sumY2 - D21 * D34 * sumXY) - D14 * (D21 * D32 * sumY2 + D22 * D33 * sumXY + D23 * D31 * sumYZ - D23 * D32 * sumXY - D22 * D31 * sumYZ - D21 * D33 * sumY2); double Dxz = D11 * (D22 * D33 * sumXZ + D23 * D34 * sumYZ + D24 * D32 * sumZ2 - D24 * D33 * sumYZ - D23 * D32 * sumZ2 - D22 * D34 * sumXZ) - D12 * (D21 * D33 * sumXZ + D23 * D34 * sumZ2 + D24 * D31 * sumYZ - D24 * D33 * sumZ2 - D23 * D31 * sumYZ - D21 * D34 * sumXZ) + D13 * (D21 * D32 * sumXZ + D22 * D34 * sumZ2 + D24 * D31 * sumYZ - D24 * D32 * sumZ2 - D22 * D31 * sumYZ - D21 * D34 * sumXZ) - D14 * (D21 * D32 * sumYZ + D22 * D33 * sumXZ + D23 * D31 * sumZ2 - D23 * D32 * sumXZ - D22 * D31 * sumZ2 - D21 * D33 * sumYZ); double Dyz = D11 * (D22 * D33 * sumYZ + D23 * D34 * sumZ2 + D24 * D32 * sumY2 - D24 * D33 * sumZ2 - D23 * D32 * sumY2 - D22 * D34 * sumYZ) - D12 * (D21 * D33 * sumYZ + D23 * D34 * sum

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大胡子大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值