一种朴素的消失点计算方法

一种比较厉害的加计算方法:https://blog.csdn.net/ydy1107/article/details/121355836

1. 核心思想:俩个不平行的直线的交点就是消失点

代码地址:https://github.com/KEDIARAHUL135/VanishingPoint

2.算法流程

我们将计算和发现使用之前发现的线条的图像的消失点。
这一节涉及与线(它们的交点和它们的距离)有关的基本数学从一个点)和一个小的逻辑。
// 我们在这里要做的是,我们将使用两个线的组合,然后找到它们交点。这个交点可以是消失点,因为它期望线在消失点附近收敛。但这里有一个问题,就是有很多lines (我们的最大值是15),所以两条线的这种交点的数量可以导致许多不同的
点。那么我们如何在这些点中找到最接近实际的消失点?
为此,我们在逻辑中引入了一个“误差”因素。误差基本上是这个点到每条直线距离的平方和的平方根 。相对应的点最小误差值可能是最接近消失点的值,因此我们计算出了消失点。
下面展示了两线相交后的计算点错误值。这里我们仅以3条lines为例。
我们取直线L1和L2它们的交点是(x0, y0),直线方程L1是y = m1x + c1直线L2的方程是y = m2x +c2。
计算L1和L2的交点(x0,y0):
计算

我们现在会找到这一点到直线L的距离,直线L的方程是y = m*x + c,为此,我们设直线L_ (L破折号)(方程:y = m_*x + c_)垂直于L,并通过这个点 (x0, y0)。直线L_与直线L的交点为(x_, y_),即点的距离(x0, y0)到直线L的距离是 d= (x0, y0)到(x_, y_)的距离。这些点在直线L处的误差值是这些点的平方和的根如图所示。
计算L1和L2的交点(x0,y0)到直线L的距离:

在这里插入图片描述

int* GetVanishingPoint(std::vector<std::vector<double>> Lines)
{
	// We will apply RANSAC inspired algorithm for this.We will take combination
	// of 2 lines one by one, find their intersection point, and calculate the
	// total error(loss) of that point.Error of the point means root of sum of
	// squares of distance of that point from each line.
	int* VanishingPoint = new int[2];
	VanishingPoint[0] = -1; VanishingPoint[1] = -1;

	double MinError = 1000000000.0;

	for (int i = 0; i < Lines.size(); i++) //遍历lines,一次取2个
	{
		for (int j = i + 1; j < Lines.size(); j++)
		{
			//获取直线的 m,c; y=mx+c
			double m1 = Lines[i][4], c1 = Lines[i][5];
			double m2 = Lines[j][4], c2 = Lines[j][5];

			if (m1 != m2) //如果俩条直线不平行
			{   //直线L1和L2它们的交点是(x0, y0)
				double x0 = (c1 - c2) / (m2 - m1);
				double y0 = m1 * x0 + c1;

				double err = 0;
				// 迭代所有lines进行错误计算
				for (int k = 0; k < Lines.size(); k++)
				{
					double m = Lines[k][4], c = Lines[k][5];
					double m_ = (-1 / m);
					double c_ = y0 - m_ * x0;//过交点(x0, y0),斜率k=(-1 / m)的直线L_ 
              //求直线L和直线L_的 交点(x_ , y_)
					double x_ = (c - c_) / (m_ - m);
					double y_ = m_ * x_ + c_;
           //直线L1和直线L2的 交点到L的距离就是交点(x0, y0)到点(x_ , y_)的距离
					double l = pow((pow((y_ - y0), 2) + pow((x_ - x0), 2)), 0.5);

					err += pow(l, 2);
				}

				err = pow(err, 0.5);

				if (MinError > err)
				{
					MinError = err;
					VanishingPoint[0] = (int)x0;
					VanishingPoint[1] = (int)y0;
				}
			}
		}
	}

	return VanishingPoint;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值