您的位置:首页 > 其它

Halcon实战记录之二《判断两个直线或者矩形是否相交》

2017-07-14 18:04 501 查看
项目中使用到需要判断两个矩形是否相交,由于我使用Halcon不久,对其算子还不熟悉,不知道是否有现成的算子可以直接实现,如果有,还请各位朋友给留言指出,先谢谢了,我这里用了如下的方法。

1、如果两个矩形相交,那么它们中的线段一定会有相交的,我下面写了判断线段相交的函数:

C++代码

void CrossLine (HTuple hv_left, HTuple hv_right, HTuple hv_y, HTuple hv_top, HTuple hv_bottom, HTuple hv_x, HTuple hv_minDis, HTuple *hv_isCross)
{
// Local iconic variables
(*hv_isCross) = 0;
if (0 != (HTuple(hv_top<=(hv_y+hv_minDis)).TupleAnd(hv_bottom>=(hv_y-hv_minDis))))
{
if (0 != (HTuple(hv_left<=(hv_x+hv_minDis)).TupleAnd(hv_right>=(hv_x-hv_minDis))))
{
(*hv_isCross) = 1;
}
}
}


Halcon 代码

CrossLine(::left, right, y, top, bottom, x, minDis : isCross)
{
isCross := 0
#判断一根横线和一根竖线是否交叉
#横线有三个参数:left, right和y
#竖线有三个参数:top, bottom和x
if((top <= y+minDis) and (bottom >= y-minDis))
if((left <= x+minDis) and (right >= x-minDis))
isCross := 1
endif
endif
return()
}


2、判断两个矩形是否相交

C++代码

void CrossRect (HObject ho_rectangle1, HObject ho_rectangle2, HTuple hv_minDis, HTuple *hv_isCross)
{
// Local control variables
HTuple  hv_Number1, hv_Number2, hv_Row1, hv_Column1;
HTuple  hv_Row2, hv_Column2, hv_Row11, hv_Column11, hv_Row21;
HTuple  hv_Column21, hv_isCross1, hv_isCross2, hv_isCross3;
HTuple  hv_isCross4, hv_isCross5, hv_isCross6, hv_isCross7;
HTuple  hv_isCross8;

CountObj(ho_rectangle1, &hv_Number1);
CountObj(ho_rectangle2, &hv_Number2);
if (0 != (HTuple(hv_Number1==0).TupleOr(hv_Number2==0)))
{
(*hv_isCross) = 2;
return;
}
SmallestRectangle1(ho_rectangle1, &hv_Row1, &hv_Column1, &hv_Row2, &hv_Column2);
SmallestRectangle1(ho_rectangle2, &hv_Row11, &hv_Column11, &hv_Row21, &hv_Column21);

if (0 !=(HTuple(HTuple(HTuple(hv_Row1==hv_Row11).TupleAnd(hv_Column1==hv_Column11)).TupleAnd(hv_Row2==hv_Row21)).TupleAnd(hv_Column2==hv_Column21)))
{
(*hv_isCross) = 2;
return;
}

CrossLine(hv_Column1, hv_Column2, hv_Row1, hv_Row11, hv_Row21, hv_Column11, hv_minDis, &hv_isCross1);
CrossLine(hv_Column1, hv_Column2, hv_Row1, hv_Row11, hv_Row21, hv_Column21, hv_minDis, &hv_isCross2);
CrossLine(hv_Column1, hv_Column2, hv_Row2, hv_Row11, hv_Row21, hv_Column11, hv_minDis, &hv_isCross3);
CrossLine(hv_Column1, hv_Column2, hv_Row2, hv_Row11, hv_Row21, hv_Column21, hv_minDis, &hv_isCross4);
CrossLine(hv_Column11, hv_Column21, hv_Row11, hv_Row1, hv_Row2, hv_Column1, hv_minDis, &hv_isCross5);
CrossLine(hv_Column11, hv_Column21, hv_Row11, hv_Row1, hv_Row2, hv_Column2, hv_minDis, &hv_isCross6);
CrossLine(hv_Column11, hv_Column21, hv_Row21, hv_Row1, hv_Row2, hv_Column1, hv_minDis, &hv_isCross7);
CrossLine(hv_Column11, hv_Column21, hv_Row21, hv_Row1, hv_Row2, hv_Column2, hv_minDis, &hv_isCross8);

(*hv_isCross) = 0;
if (0 != ((((((((hv_isCross1+hv_isCross2)+hv_isCross3)+hv_isCross4)+hv_isCross5)+hv_isCross6)+hv_isCross7)+hv_isCross8)>1))
{
(*hv_isCross) = 1;
}
}


Halcon代码

CrossRect(rectabgle1, rectabgle2::minDis : isCross)
{
count_obj (rectangle1, Number1)
count_obj (rectangle2, Number2)
if(Number1 == 0 or Number2 == 0)
isCross := 2
return()
endif

smallest_rectangle1 (rectangle1, Row1, Column1, Row2, Column2)
smallest_rectangle1 (rectangle2, Row11, Column11, Row21, Column21)

if(Row1 == Row11 and Column1 == Column11 and Row2 == Row21 and Column2 == Column21)
isCross := 2
return()
endif

CrossLine (Column1, Column2, Row1, Row11, Row21, Column11, minDis, isCross1)
CrossLine (Column1, Column2, Row1, Row11, Row21, Column21, minDis, isCross2)
CrossLine (Column1, Column2, Row2, Row11, Row21, Column11, minDis, isCross3)
CrossLine (Column1, Column2, Row2, Row11, Row21, Column21, minDis, isCross4)

CrossLine (Column11, Column21, Row11, Row1, Row2, Column1, minDis, isCross5)
CrossLine (Column11, Column21, Row11, Row1, Row2, Column2, minDis, isCross6)
CrossLine (Column11, Column21, Row21, Row1, Row2, Column1, minDis, isCross7)
CrossLine (Column11, Column21, Row21, Row1, Row2, Column2, minDis, isCross8)

isCross := 0
if(isCross1 + isCross2 + isCross3 + isCross4 + isCross5 + isCross6 + isCross7 + isCross8 > 1)
isCross := 1
endif

return ()
}


注意:minDis解释–如果两个矩形或者线段不相交,但是距离小于minDis,则认为是相交
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Halcon 图像算法