求助:如何求取图像中相交直线交点的坐标?
在一幅二值图像中仅有4条直线,如何求取这些直线中互相相交的交点的坐标?
高手们,该如何求取?谢谢!
[解决办法]
友情帮顶, 我也在思考, 貌似很不好搞~ 不知道opencv库里有没好的函数
[解决办法]
黑白图吗?如果线宽为1的话,某个黑像素周围有四个黑像素的话就是交点……好朴素的想法
[解决办法]
如果直线已经检测出来了,那么相当于有了直线方程,这就变成求两条直线交点问题了,应该容易吧?
[解决办法]
求出每条直线的像素点,共点就是他们的交点。
[解决办法]
这个有具体算法的,可以参看一些“计算机图形学”的书,里面有详细的实现过程,随便找一本计算机图形学的书就可以搞定了。
[解决办法]
笨点就逐行扫描,先找出直线~
[解决办法]
如果是二值图像的话,使用四方向迷宫算法。
[解决办法]
CV中的角点检测问题。
先产生2张差分图
dx图:每点的值 = 该点的右邻点减去左邻点的值
dy图:每点的值 = 该点的下邻点减去上邻点的值
然后对每点都有这个阵M:
|dx^2, dx*dy|
|dx*dy,dy^2 |
把某个点P周围8个点的阵相加,得到阵MP,如果MP的2个特征值都很小,说明在P点平滑的地方,
1大1小,说明该点在直线附近,
2个都很大,说明该点是交点。
至于多少算大,就看你的原图了,你也可以直接计算
float result = (a*d-b*c)-0.05*(a+d)*(a+d)如果很大就可能是交点或附近
其中abcd是MP的4个元素
|a, b|
|c, d|
[解决办法]
求出四条直线的两点式方程,按数学方法求两条直线交点不就OK啦?
参考代码如下(需改进,要做四舍五入考虑):
- C/C++ code
//两点式交点//返回结果为-1时,无交点POINT AFX_API_EXPORT Intersection(SDLine l1, SDLine l2){ POINT lastP; DOUBLE k1,k2,b1,b2; //两条非垂直线 if(l1.x1-l1.x2!=0 && l2.x1-l2.x2!=0) { b1=(l1.y1*l1.x2-l1.y2*l1.x1)/(l1.x2-l1.x1); b2=(l2.y1*l2.x2-l2.y2*l2.x1)/(l2.x2-l2.x1); k1=(l1.y1-l1.y2)/(l1.x1-l1.x2); k2=(l2.y1-l2.y2)/(l2.x1-l2.x2); if(k1-k2 != 0) { lastP.x=(b2-b1)/(k1-k2); lastP.y=(k1*b2-k2*b1)/(k1-k2); } else { lastP.x=-1; lastP.y=-1; } } //两条垂直线 if(l1.x1-l1.x2==0 && l2.x1-l2.x2==0) { lastP.x=-1; lastP.y=-1; } //一条垂直线 if(l1.x1-l1.x2==0 && l2.x1-l2.x2!=0) { b2=(l2.y1*l2.x2-l2.y2*l2.x1)/(l2.x2-l2.x1); k2=(l2.y1-l2.y2)/(l2.x1-l2.x2); lastP.x=l1.x1; lastP.y=k2*l1.x1+b2; } //一条垂直线 if(l1.x1-l1.x2!=0 && l2.x1-l2.x2==0) { b1=(l1.y1*l1.x2-l1.y2*l1.x1)/(l1.x2-l1.x1); k1=(l1.y1-l1.y2)/(l1.x1-l1.x2); lastP.x=l2.x1; lastP.y=k1*l2.x1+b1; } return lastP;}