读书人

怎么求取图像中相交直线交点的坐标

发布时间: 2012-02-20 21:18:24 作者: rapoo

求助:如何求取图像中相交直线交点的坐标?
在一幅二值图像中仅有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;} 

读书人网 >VC/MFC

热点推荐