开启左侧

根据矩形中心和旋转角度求矩形角点

[复制链接]
xYz_Albert 发表于 2017-5-13 15:06:22 | 显示全部楼层 |阅读模式
得益于(鸟叔)咋咋鸟的视觉平台和众网友的无私奉献,学习了不少知识和技巧;也学习下大神们的分享和奉献精神,分享一个实例源代码:根据矩形的中心坐标和矩形的旋转角度求矩形四个角点坐标;
需要说明的是:我们是处理图像中的信息,即输入信息和输出信息都是以图像坐标系为参考的,而图像坐标系常见的样子是水平(X轴)向右为正,垂直(Y轴)向下为正,其实这是所谓的2D笛卡尔坐标系,属于左手坐标系;但是矩形的旋转角度,却是以另外的坐标系来描述的,即水平(X轴)向右为正,垂直(Y轴)向上为正,这是我们在学习中常用坐标系,也是2D笛卡尔坐标系,属于右手坐标系,我们更习惯于在右手坐标系里求解数学问题,这个实例中涉及到的知识点主要是坐标变换(仿射变换)、其次坐标等;我们以图像坐标系进行输入信息并观察在此坐标系中的效果,因此需要在右手坐标系中求解,然后在图像坐标系观察。背景简介完毕,我来大致描述一下实现过程:我们假定左手坐标系和右手坐标系共用原点,首先根据矩形中心在左手坐标系中的坐标,得到平行坐标轴时的矩形角点坐标,然后将矩形中心以及角点坐标转换为右手坐标系中的坐标;再根据坐标变换,在右手坐标系中求解绕矩形中心旋转Phi角度后的角点坐标;最后将在右手坐标系中的角点坐标转换为左手坐标系中的坐标,即观察效果。
详细求解过程请自行尝试,若有疑问请私信!
以下是Halcon 下的代码(本地函数文件形式):(英文描述可以提高逼格哦!)

*Initialize the variable for coordinate of vertexes of rectangle2
VertexesY:=[]
VertexesX:=[]
*Initialize the temperary variables
RowTem:=0
ColTem:=0
*Judge the rectangle if it is available
if(Len1<0 or Len2<0)
    return()
endif
*Compute the sine and cosine of tuple Phi
tuple_cos(Phi,Cos)
tuple_sin(Phi,Sin)
*Compute the coordinate of the upper-right vertex of rectangle
RowTem:=CenterY-Len1*Sin-Len2*Cos
ColTem:=CenterX+Len1*Cos-Len2*Sin
VertexesY:=[VertexesY,RowTem]
VertexesX:=[VertexesX,ColTem]

*Compute the coordinate of the upper-left vertex of rectangle
RowTem:=CenterY+Len1*Sin-Len2*Cos
ColTem:=CenterX-Len1*Cos-Len2*Sin
VertexesY:=[VertexesY,RowTem]
VertexesX:=[VertexesX,ColTem]

*Compute the coordinate of the bottom-left vertex of rectangle
RowTem:=CenterY+Len1*Sin+Len2*Cos
ColTem:=CenterX-Len1*Cos+Len2*Sin
VertexesY:=[VertexesY,RowTem]
VertexesX:=[VertexesX,ColTem]

*Compute the coordinate of the bottom-right vertex of rectangle
RowTem:=CenterY-Len1*Sin+Len2*Cos
ColTem:=CenterX+Len1*Cos+Len2*Sin
VertexesY:=[VertexesY,RowTem]
VertexesX:=[VertexesX,ColTem]
return ()

 楼主| xYz_Albert 发表于 2017-5-13 15:10:06 | 显示全部楼层
代码为求解过程的综合结果,省略的部分小伙伴们需要自己推导;P
Imlxw7 发表于 2017-8-5 08:43:49 | 显示全部楼层
英文描述可以提高逼格哦!
夜行人 发表于 2018-1-19 14:47:10 | 显示全部楼层
好东西分享
蓝豆迪 发表于 2019-9-30 14:53:28 | 显示全部楼层
大神,推导不出来哇,求救啊。
 楼主| xYz_Albert 发表于 2020-1-14 09:26:37 | 显示全部楼层
蓝豆迪 发表于 2019-9-30 14:53
大神,推导不出来哇,求救啊。

你可以的,逼自己一下
jash 发表于 2020-1-16 10:05:42 | 显示全部楼层
建議可以以陣列式的方式進行運算可提升效率
以下為原廠建議的方式
smallest_rectangle2 (Rectangle, Row, Column, Phi1, Length1, Length2)
Diagonal:=sqrt(Length1*Length1+Length2*Length2)
Beta:=atan(Length2/Length1)
Alpha:=Phi1-Beta
area_center (Rectangle, Area, Row1, Column1)
CornerRow:=[Row1-Diagonal*sin(Alpha), Row1-Diagonal*sin(Beta+Phi1), Row1+Diagonal*sin(Alpha), Row1+Diagonal*sin(Beta+Phi1)]
CornerCol:=[Column1+Diagonal*cos(Alpha), Column1+Diagonal*cos(Beta+Phi1), Column1-Diagonal*cos(Alpha), Column1-Diagonal*cos(Beta+Phi1)]
gen_cross_contour_xld (Cross, CornerRow, CornerCol, Siz, Phi1)
(By MVtec)
王爽Ada 发表于 2023-1-9 14:16:28 | 显示全部楼层
jash 发表于 2020-1-16 10:05
建議可以以陣列式的方式進行運算可提升效率
以下為原廠建議的方式
smallest_rectangle2 (Rectangle, Row, C ...

根据矩形中心和旋转角度求矩形角点
王爽Ada 发表于 2023-1-9 14:17:34 | 显示全部楼层
根据矩形中心和旋转角度求矩形角点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表