求助:如何求取图像中相交直线交点的坐标?

fengbingchun
博客专家认证
2010-11-16 02:21:39
在一幅二值图像中仅有4条直线,如何求取这些直线中互相相交的交点的坐标?
高手们,该如何求取?谢谢!
...全文
1209 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingshuning 2011-11-29
  • 打赏
  • 举报
回复
zhujihai 你好,用HOUGH求出检测二值化图像边缘依然会得到四条或者更多相交的直线,如何保证求出来的是中心点坐标呢,请给指教一下吧,累计概率hough检测会检测出很多条线段,如果参数设置不好的话求不出中心点坐标的,这个问题哪位高手已经解决了吗? 有的话请联系QQ434442064共同探讨
zhujihai 2010-12-28
  • 打赏
  • 举报
回复
大家好!我是新手
我也在研究这个问题.OPENCV还不会,只会用VC++6.0自己编写算法.
现在想法是这样的.
1)首先是把摄像头的图像作成BMP位图.并提取位图RGB值.(用VB的API搞定)
2)彩图变灰度图.(VC自编DLL算法,搞定)
3)灰度图变二值图.(VC自编DLL算法,搞定)
4)细化二值图. (VC自编DLL算法,搞定)
5)HOUGH 求直线方程. (VC自编DLL算法,搞定)
6)计算交点.(设计中)
也想过简单的8点法.可是误差较大.提取交点不稳定.还是用方程好.
为什么不用VB做,因为运行速度太慢了.所以改用DLL了.
fengbingchun 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 viskag 的回复:]
原题好像没说直线是横平竖直的线

引用 17 楼 madaming 的回复:
引用 15 楼 fengbingchun 的回复:
四方向迷宫算法,可否说的详细点

我只能说明算法,代码你自己构造吧。
4方向就是上、下、左、右方向,如果加上左上角、右上角、左下角和右下角就成为8方向,通过递归遍历所有方向直到发现有值点,记住遍历的有值点的位置,然后只遍历有值点,这时有值点一旦改变方向,就……
[/Quote]

你说的对,图像存在平移、旋转、缩放的可能性,直线很少是横平竖直的线
Viskag 2010-11-18
  • 打赏
  • 举报
回复
原题好像没说直线是横平竖直的线
[Quote=引用 17 楼 madaming 的回复:]
引用 15 楼 fengbingchun 的回复:
四方向迷宫算法,可否说的详细点

我只能说明算法,代码你自己构造吧。
4方向就是上、下、左、右方向,如果加上左上角、右上角、左下角和右下角就成为8方向,通过递归遍历所有方向直到发现有值点,记住遍历的有值点的位置,然后只遍历有值点,这时有值点一旦改变方向,就应该是直线交叉点。这里所说的改变方向你要构造判断算法,8个方向来遍历一般是能够基本预……
[/Quote]
副组长 2010-11-18
  • 打赏
  • 举报
回复
数学的方法不可行,计算出来的坐标和像素坐标不一致。
即便是单线(不是粗线)也不能保证像素点x,y方向都首尾相接,误判肯定是有的。粗线就更不用说了。
fengbingchun 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 madaming 的回复:]
如果是二值图像的话,使用四方向迷宫算法。
[/Quote]

四方向迷宫算法,可否说的详细点
fengbingchun 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 viskag 的回复:]
CV中的角点检测问题。
先产生2张差分图
dx图:每点的值 = 该点的右邻点减去左邻点的值
dy图:每点的值 = 该点的下邻点减去上邻点的值
然后对每点都有这个阵M:
|dx^2, dx*dy|
|dx*dy,dy^2 |

把某个点P周围8个点的阵相加,得到阵MP,如果MP的2个特征值都很小,说明在P点平滑的地方,
1大1小,说明该点在直线附近,
2个都很大,说明该点是交点。……
[/Quote]

谢谢,利用角点来检测交点确实可行,如果图像很大,只是这样运行效率是不是不高
Viskag 2010-11-17
  • 打赏
  • 举报
回复
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|
海涵德 2010-11-17
  • 打赏
  • 举报
回复
如果直线很粗的话,8个方向都会是直线的点,你就应该找到边缘点,顺着边缘遍历,边缘点一定是在8个方向上有部分有值点和部分无值点的,问题就会转变为边缘点发生方向改变的判断问题。
fengbingchun 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 madaming 的回复:]
在直线很粗的情况下,是否可以在遍历的过程中结合13楼的角检测算法。
[/Quote]

应该可以,而且openCV中有类似的函数可用
fengbingchun 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 madaming 的回复:]
引用 15 楼 fengbingchun 的回复:
四方向迷宫算法,可否说的详细点

我只能说明算法,代码你自己构造吧。
4方向就是上、下、左、右方向,如果加上左上角、右上角、左下角和右下角就成为8方向,通过递归遍历所有方向直到发现有值点,记住遍历的有值点的位置,然后只遍历有值点,这时有值点一旦改变方向,就应该是直线交叉点。这里所说的改变方向你要构造判断算法,8个方向来遍历一般是能够基本预……
[/Quote]

谢谢,我试试看
海涵德 2010-11-17
  • 打赏
  • 举报
回复
在直线很粗的情况下,是否可以在遍历的过程中结合13楼的角检测算法。
海涵德 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fengbingchun 的回复:]
四方向迷宫算法,可否说的详细点
[/Quote]
我只能说明算法,代码你自己构造吧。
4方向就是上、下、左、右方向,如果加上左上角、右上角、左下角和右下角就成为8方向,通过递归遍历所有方向直到发现有值点,记住遍历的有值点的位置,然后只遍历有值点,这时有值点一旦改变方向,就应该是直线交叉点。这里所说的改变方向你要构造判断算法,8个方向来遍历一般是能够基本预测直线上下一个点的方向的,举个例子,下一点的方向只能在8个方向的3个方向上,其他方向就可能不是直线方向。
至于使用4方向还是8方向你可以自己决定,算法应该是一致的。
橘子 2010-11-17
  • 打赏
  • 举报
回复
求出四条直线的两点式方程,按数学方法求两条直线交点不就OK啦?

参考代码如下(需改进,要做四舍五入考虑):


//两点式交点
//返回结果为-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;
}
副组长 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fengbingchun 的回复:]
引用 6 楼 gordon3000 的回复:
求出每条直线的像素点,共点就是他们的交点。


如何求取每条直线上的所有的像素点呢?
[/Quote]

http://topic.csdn.net/u/20101101/21/0c59d979-7a17-4eae-9e93-e85b0f0cd128.html
这贴我说过怎么求知道起点和终点坐标直线的像素来的。好像LZ搞定了。
海涵德 2010-11-16
  • 打赏
  • 举报
回复
如果是二值图像的话,使用四方向迷宫算法。
ryfdizuo 2010-11-16
  • 打赏
  • 举报
回复
笨点就逐行扫描,先找出直线~
damaxy_programmer 2010-11-16
  • 打赏
  • 举报
回复
这个有具体算法的,可以参看一些“计算机图形学”的书,里面有详细的实现过程,随便找一本计算机图形学的书就可以搞定了。
fengbingchun 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gordon3000 的回复:]
求出每条直线的像素点,共点就是他们的交点。
[/Quote]

如何求取每条直线上的所有的像素点呢?
fengbingchun 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 laoma_hbu 的回复:]
如果直线已经检测出来了,那么相当于有了直线方程,这就变成求两条直线交点问题了,应该容易吧?
[/Quote]

如果按求数学中求两条直线交点,如果不知道每条直线上的所有像素点,是不是需要遍历图像上的每个像素点呢?
加载更多回复(6)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧