njcithy
njcithy
2021-06-11 12:53
采纳率: 100%
浏览 15

一个在三维点云中提取球的算法

在阅读《Efficient RANSAC for Point‐Cloud Shape Detection》时,论文提出一种三维点云中提取球的方法,原文如下:

大体的意思应该是给定两个点:p1,p2及对应的法向量n1,n2,可以计算出一个球的球心与半径,我在网上找到的对应的代码如下:

bool Sphere::Init(const MiscLib::Vector< Vec3f > &samples)
{
	if(samples.size() < 4)
		return false;
	// get center
	size_t c = samples.size() / 2;
	m_center = Vec3f(0, 0, 0);
	size_t midCount = 0;
	for(size_t i = 0; i < c - 1; ++i)
		for(size_t j = i + 1; j < c; ++j)
		{
			Vec3f mid;
			if(!Midpoint(samples[i], samples[i + c], samples[j], samples[j + c], &mid))
				continue;
			m_center += mid;
			++midCount;
		}
	if(!midCount)
		return false;
	m_center /= midCount;
	m_radius = 0;
	for(size_t i = 0; i < c; ++i)
	{
		float d = (samples[i] - m_center).length();
		m_radius += d;
	}
	m_radius /= c;
	return true;
}

bool Midpoint(const Vec3f &p1, const Vec3f &n1, const Vec3f &p2, const Vec3f &n2,
	Vec3f *mid)
{
	float d1343,d4321,d1321,d4343,d2121;
	float numer,denom, mua, mub;

	Vec3f p13 = p1 - p2;
	// p43 = n2
	// p21 = n1
	d1343 = p13[0] * n2[0] + p13[1] * n2[1] + p13[2] * n2[2];
	d4321 = n2[0] * n1[0] + n2[1] * n1[1] + n2[2] * n1[2];		
	d1321 = p13[0] * n1[0] + p13[1] * n1[1] + p13[2] * n1[2];	
	d4343 = n2[0] * n2[0] + n2[1] * n2[1] + n2[2] * n2[2];	
	d2121 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2];		

	denom = d2121 * d4343 - d4321 * d4321;
	if(abs(denom) < 1e-6)
		return false;
	numer = d1343 * d4321 - d1321 * d4343;

	mua = numer / denom;
	mub = (d1343 + d4321 * (mua)) / d4343;

	Vec3f pa, pb;
	pa = p1 + mua * n1;
	pb = p2 + mub * n2;
	*mid = 0.5f * (pa + pb);
	return true;
}

对这个方法不是很理解,有没有大神能给解释一下啊?希望能从几何的角度理解提取球的方法。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • QA_Assistant
    有问必答小助手 2021-06-16 16:49
    已采纳

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    点赞 评论

相关推荐