已经矩形的中心点、边长、phi求四个顶点的坐标
在halcon里面,类似gen_measure_rectangle2、smallest_rectangle2的算子表示任意角度的矩形。
其信息包括:
矩形中心点 row,column
矩形角度 Phi
矩形区域的长和宽的一半 Length1, Length2
如下图所示:
(图1)
就没有没直接给出矩形4个顶点坐标。有时候想知道4个顶点的坐标怎么计算呢?
由于勇哥手上有一段halcon代码正好用解决上面的问题,所以我们先分析一下代码的结果,以此为参考进行推导。
代码如下:
* Image Acquisition 01: Code generated by Image Acquisition 01
read_image (Image, 'D:/s4.bmp')
gen_rectangle1 (ROI_0, 703.23, 1022.93, 2188.17, 3252.27)
reduce_domain(Image, ROI_0, ImageReduced)
threshold(ImageReduced, Region, 0, 100)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 999999999)
smallest_rectangle2 (SelectedRegions, Row16, Column16, Phi3, Length1, Length2)
tuple_deg(Phi3,Deg)
len1:=Column16-Length1
len2:=Row16-Length2
*提取仿射最小外接矩形的四个顶点坐标
gen_rectangle2_contour_xld (Rectangle4, Row16, Column16, Phi3, Length1, Length2)
tuple_cos (Phi3, Cos)
tuple_sin (Phi3, Sin)
dev_set_color('red')
a:= -Length1*Cos - Length2*Sin
b := -Length1*Sin + Length2*Cos
gen_cross_contour_xld(Cross1, Row16-b, Column16+a, 6, Phi3)
c := Length1*Cos - Length2*Sin
d := Length1*Sin + Length2*Cos
gen_cross_contour_xld(Cross2, Row16-d, Column16+c, 6, Phi3)
e:= Length1*Cos + Length2*Sin
f := Length1*Sin - Length2*Cos
gen_cross_contour_xld(Cross3, Row16-f, Column16+e, 6, Phi3)
g := -Length1*Cos + Length2*Sin
h := -Length1*Sin - Length2*Cos
dev_set_color('green')
x1:=Column16+a
y1:=Row16-b
disp_cross(200000, Row16-b, Column16+a, 156, rad(10))
disp_cross(200000, Row16-d, Column16+c, 156, rad(10))
disp_cross(200000, Row16-f, Column16+e, 156, rad(10))
disp_cross(200000, Row16-h, Column16+g, 156, rad(10))
disp_obj(Cross1,200000)
在下图中,矩形的四个顶点坐标位置被显示了出来。
(图2)
从上面的halcon代码结果中,我们可以观察到矩形左上角顶点的数据如下:
Length1=807.053, Length2=378.839
Phi3=0.0239714弧度=1.37346度
矩形中心坐标:x=2067.95 y=1413.22
cos(1.37346)=0.9997127
sin(1.37346)=0.0239691034
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos
a=-815.902
b=359.386
矩形左顶点坐标:
x=2067.95+a=1252.04843
y=1413.22-b=1053.83418
按上面的halcon程序,勇哥绘制了一张CAD图。
因为halcon的坐标系类似CAD的第四象限,它以左上角为原点的。所以注意下图中的y坐标其实是负值。
(图3)
下面是CAD的计算结果,可以看到跟halcon的计算结果是一样的。
>> 表达式: cos(1.37346)
0.9997127
命令: sin(1.37346)
未知命令“SIN(1.37346)”。按 F1 查看帮助。
命令: cal
>> 表达式: sin(1.37346)
0.0239691034
命令: cal
>> 表达式: -807.053*cos(1.37346)-378.839*sin(1.37346)
-815.901565
命令: cal
>> 表达式: -807.053*sin(1.37346)+378.839*cos(1.37346)
359.385823
命令: CAL
>> 表达式: 2067.95-815.901565
1252.04843
命令: cal
>> 表达式: 1413.22-359.385823
1053.83418
对于代码中的计算公式
矩形中心坐标:x=2067.95 y= 1413.22
a:= -Length1*Cos - Length2*Sin=-815.902
b:= -Length1*Sin + Length2*Cos=359.386
x0=x+a=1252.04843
y0=y-b=1053.83418
可能仍然不好理解,其实它是上一篇《三角函数在图形学里的应用(二)》中所说的饶任意点旋转公式的应用。
这里再引用一下那个公式:
x0=cos(a)*(x-rx0)-sin(a)*(y-ry0)+rx0
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0
其中x,y为起始点,x0,y0是旋转后的点,rx0,ry0是旋转中心, a是旋转的角度
在下面的示意图中,白色矩形是水平状态的矩形,黄色矩形是转了a度的矩形。
图中标注出了矩形的中心坐标、旋转前的左上角坐标、旋转后的左上角坐标。
(图4)
按图中的信息,勇哥用cad计算了验证了一下,可以看到结果完全正确:
rx0 = 2077.2623, ry0 = -1458.9505 旋转中心
a=1.37346
x = 1270.2073, y = -1080.1115 旋转前的左上角顶点
x0=cos(a)*(x-rx0)-sin(a)*(y-ry0)+rx0 =1252.04626
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0
正确答案:x=1261.3587, Y = -1099.5647
x0=cos(1.37346)*(1270.2073-2077.2623)-sin(1.37346)*(-1080.1115-(-1458.9505))+2077.2623=1261.35874
y0=cos(1.37346)*(-1080.1115-(-1458.9505))+sin(1.37346)*(1270.2073-2077.2623)-1458.9505=-1099.56473
再参考一下代码中的算式:
tuple_cos (Phi3, Cos)
tuple_sin (Phi3, Sin)
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos
x0=x+a
y0=y-b
我们需要一个旋转前的左上角坐标,这个坐标其实我们是知道的,看下面的推导
x=rx0-Length1
x-rx0=rx0-Length1-rx0=-Length1
y=ry0-Length2
y-ry0=ry0-Length2-ry0=-Length2
结果就是我们在代码里看到的:
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos
推导大功告成!!!
依次类推,我们可以求出另外三个顶点的坐标位置。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

