opencv 提取两条直线的交点
bool opencvGetCrossPoint()
{
Mat canny;
Canny(amat,canny,50,100);
vector<Vec4i> lines;
HoughLinesP(canny,lines,1,CV_PI/180,30,30,20);
vector<stCrossAndLine> vcStCrossAndLine;
Mat DisLinemat=Mat::zeros(srcImage.rows,srcImage.cols,CV_8UC3);
for(int i=0;i<lines.size();i++)
{
Point2f CrossPt;
Vec4i I=lines[i];
line(DisLinemat,Point(I[0],I[1]),Point(I[2],I[3]),Scalar(255,255,0),1,CV_AA);
}
for(int i=0;i<lines.size();i++)
{
for(int j=0;j<lines.size();j++)
{
if(i!=j)
{
Point2f CrossPt;
Vec4i I=lines[i];
Vec4i J=lines[j];
if(getCrossPointByTwoLine(CrossPt,Point(I[0],I[1]),Point(I[2],I[3]),
Point(J[0],J[1]),Point(J[2],J[3]),true))
{
if((CrossPt.x>0)
&&(CrossPt.x<srcImage.cols)
&&(CrossPt.y>0)
&& (CrossPt.y<srcImage.rows)
&&(CrossPt.x>=X)
&&(CrossPt.y<=Y)) //限定交点的XY范围。
{
stCrossAndLine stCAL;
stCAL.CrossPt=CrossPt;
stCAL.Pt1=Point(I[0],I[1]);
stCAL.Pt2=Point(I[2],I[3]);
stCAL.Pt3=Point(J[0],J[1]);
stCAL.Pt4=Point(J[2],J[3]);
vcStCrossAndLine.push_back(stCAL);
}
}
}
}
}
}
bool getCrossPointByTwoLine(cv::Point2f &out,cv::Point p1,cv::Point p2,cv::Point p3,cv::Point p4 ,bool bLimit)
{
int x1 = p1.x;
int y1 = p1.y;
int x2 = p2.x;
int y2 = p2.y;
int x3 = p3.x;
int y3 = p3.y;
int x4 = p4.x;
int y4 = p4.y;
double k1, b1;
bool k1_None = false;
if (x2 - x1 == 0)
{
k1_None = true;
}
else
{
k1 = (double)(y2 - y1) / (double)(x2 - x1); //求出LineA斜率
b1 = (double)y1 - (double)x1 * k1;
}
double k2, b2;
bool k2_None = false;
if (x4 - x3 == 0)
{
k2_None = true;
}
else
{
k2 = (double)(y4 - y3) / (double)(x4 - x3); //求出LineB斜率
b2 = (double)y3 - (double)x3 * k2;
}
if(!bLimit)//没有限制条件下求两条直线的交点
{
if (k1_None)
{
if (!k2_None)
{
out.x = x1;
out.y = k2 * x1 + b2;
return true;
}
}
else if (k2_None)
{
out.x = x3;
out.y = k1 * x3 + b1;
return true;
}
else if (k2 != k1)
{
out.x = (double)(b2 - b1) / (double)(k1 - k2);
out.y = k1 * (double)out.x + b1;
return true;
}
}
else//由于正方形两条边直线理论上互相垂直,因此限定他们的斜率的乘积必须为负值或者为0;
{
if (k1_None)
{
if (!k2_None)
{
out.x = x1;
out.y = k2 * x1 + b2;
return true;
}
}
else if(k2_None)
{
out.x = x3;
out.y = k1 * x3 + b1;
return true;
}
else if(k2 != k1)
{
if(k2*k1<0)//限制条件
{
out.x = (double)(b2 - b1) / (double)(k1 - k2);
out.y = k1 * (double)out.x + b1;
return true;
}
}
}
out.x = 0;
out.y = 0;
return false;
}