OpenCV 最小二乘拟合方法求取直线倾角

最小二乘拟合直线角度
本文介绍了一种通过最小二乘法拟合直线来精确计算图像中直线倾角的方法,这种方法可以有效减少由图像锯齿造成的角度测量误差。

    工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿。在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv自带的哈夫曼直线方法,都会引起较大的角度偏差,一般会达到好几度。误差这么大,显然达不到工控要求。后来尝试采取直线点集做最小二乘拟合,误差缩小到0.5以下。以下是算法的代码:

 

	//最小二乘拟合计算直线的倾角
	int pointCount = pointVect.size();
	if (pointCount > 0)
	{
		int xCount = 0;
		int yCount = 0;
		int xyCount = 0;
		int xxCount = 0;
		for (int i = 0; i< pointCount; i++)
		{
			xCount += pointVect.at(i).x;
			yCount += pointVect.at(i).y;
			xyCount += (pointVect.at(i).x * pointVect.at(i).y);
			xxCount += (pointVect.at(i).x * pointVect.at(i).x);
		}
		double k = (double)(pointCount * xyCount - xCount * yCount) / (double)(pointCount * xxCount - xCount * xCount);
		double sinValue = - k / (sqrt(1 + k * k));
		double radian = asin(sinValue);
	        double pi = 3.1415926535;
	        double angle = radian * 180.0 / pi;
	}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值