方法一
//计算两条直线的交点
Point2f calVertex(Vec4f line1, Vec4f line2)
{
Vec4f line1_;
Vec4f line2_;
if (abs(line1[2] - line1[0]) < abs(line1[3] - line1[1]))
{
line2_ = line1;
line1_ = line2;
}
else
{
line2_ = line2;
line1_ = line1;
}
float aa = (line1_[2] - line1_[0]);
//cout << "aa: " << aa << endl;
if (aa == 0)
aa += 0.1;
float bb = (line2_[3] - line2_[1]);
//cout << "bb: " << bb << endl;
if (bb == 0)
bb += 0.1;
//求2条线的斜率
float gValue = (line1_[3] - line1_[1]) / aa;
float fValue = (line2_[2] - line2_[0]) / bb;
if (fValue == 0)
fValue += 0.0000000001;
fValue = 1 / fValue;
float fMg = fValue - gValue;
if (fMg == 0)
fMg += 0.1;
float xValue = (line1_[1] - line2_[1] - gValue * line1_[0] + fValue * line2_[0]) / fMg;
float yValue = line1_[1] + (xValue - line1_[0]) * gValue;
return Point2f(xValue, yValue);
}
方法二
Vec4d lines_intersection(const Vec4d l1, const Vec4d l2)
{
//直线一
double x1 = l1[0], y1 = l1[1], x2 = l1[2], y2 = l1[3];
double a1 = -(y2 - y1), b1 = x2 - x1, c1 = (y2 - y1) * x1 - (x2 - x1) * y1; // 一般式:a1x+b1y1+c1=0
//直线二
double x3 = l2[0], y3 = l2[1], x4 = l2[2], y4 = l2[3];
double a2 = -(y4 - y3), b2 = x4 - x3, c2 = (y4 - y3) * x3 - (x4 - x3) * y3; // 一般式:a2x+b2y1+c2=0
bool r = false; // 判断结果
double x0 = 0, y0 = 0; // 交点
double angle = 0; // 夹角
// 判断相交
if (b1 == 0 && b2 != 0) // l1垂直于x轴,l2倾斜于x轴
r = true;
else if (b1 != 0 && b2 == 0) // l1倾斜于x轴,l2垂直于x轴
r = true;
else if (b1 != 0 && b2 != 0 && a1 / b1 != a2 / b2)//l1和l2都倾斜于x轴; l1和l2的斜率不相等
r = true;
if (r)
{
//计算交点
x0 = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);
y0 = (a1 * c2 - a2 * c1) / (a2 * b1 - a1 * b2);
// 计算夹角
double a = sqrt(pow(x4 - x2, 2) + pow(y4 - y2, 2));
double b = sqrt(pow(x4 - x0, 2) + pow(y4 - y0, 2));
double c = sqrt(pow(x2 - x0, 2) + pow(y2 - y0, 2));
angle = acos((b * b + c * c - a * a) / (2 * b * c)) * 180 / CV_PI;
}
return Vec4d(r, x0, y0, angle);
}
三、计算线的水平角度和垂直角度
1、计算水平角度
//计算水平角度
float calAngleHorizental(Vec4i line)
{
double deltaX = double(line[2] - line[0]);
double deltaY = double(line[3] - line[1]);
if (deltaX < 0)
{
deltaX = -deltaX;
deltaY = -deltaY;
}
if (deltaX == 0)
{
return 90;
}
return -atan2(deltaY, deltaX) * 180 / CV_PI;
}
2、计算垂直角度
//计算垂直角度
float calAngleVertical(Vec4i line)
{
double deltaX = double(line[2] - line[0]);
double deltaY = double(line[3] - line[1]);
if (deltaY == 0)
{
return 90;
}
return atan2(deltaX, deltaY) * 180 / CV_PI;
}