cv::RotatedRect通过3点构造函数程序崩溃

RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);

debug抛出异常,崩在这里

 CV_Assert( abs(vecs[0].dot(vecs[1])) / (norm(vecs[0]) * norm(vecs[1])) <= FLT_EPSILON );

原因是此处采用单精度浮点运算,导致明明两条边是垂直的也大于float的机器精度了

解决办法:
自己写一个生成旋转矩形的函数,将机器精度替换为更低的精度

RotatedRect MyRotatedRect(const Point2f& _point1, const Point2f& _point2, const Point2f& _point3)
{
	RotatedRect rotrect;
	Point2f _center = 0.5f * (_point1 + _point3);
	Vec2f vecs[2];
	vecs[0] = Vec2f(_point1 - _point2);
	vecs[1] = Vec2f(_point2 - _point3);
	// check that given sides are perpendicular
	
	CV_Assert(abs(vecs[0].dot(vecs[1])) / (norm(vecs[0]) * norm(vecs[1])) <= 1e-5);  //此处会导致报异常,其实是float精度不足!

	// wd_i stores which vector (0,1) or (1,2) will make the width
	// One of them will definitely have slope within -1 to 1
	int wd_i = 0;
	if (abs(vecs[1][1]) < abs(vecs[1][0])) wd_i = 1;
	int ht_i = (wd_i + 1) % 2;

	float _angle = atan(vecs[wd_i][1] / vecs[wd_i][0]) * 180.0f / (float)CV_PI;
	float _width = (float)norm(vecs[wd_i]);
	float _height = (float)norm(vecs[ht_i]);

	rotrect.center = _center;
	rotrect.size = Size2f(_width, _height);
	rotrect.angle = _angle;
	return rotrect;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值