opencv 提取两条直线的交点

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;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MK-ZHENG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值