- 博客主页:https://loewen.blog.csdn.net
- 欢迎点赞 收藏 留言 如有错误敬请指正!
- 本文由 丶布布原创,首发于 CSDN,转载注明出处
- 现在的付出,都会是一种沉淀,只为让你成为更好的人
文章预览:
一. 二维图形变换含义
基本几何变换:指对图形的几何信息经过平移、缩放、旋转等变换后产生的新图形。一般包括相似变换、仿射变换、投影变换(畸变校正):
- 相似变换: 指在平面或空间中,保持两个图形之间的每一对对应点之间的距离比不变的变换。简单来说,就是将一个图形按照比例因子进行缩放、旋转和平移后得到的新图形与原图形相似。适用于地图缩放等场合。
- 仿射变换: 指在平面或空间中,保持两个图形之间的每一对对应点之间的距离比和直线上点之间的距离比不变的线性变换。简单来说,就是将一个图形通过平移、旋转、缩放和错切等操作得到一个新图形。适用于图像处理、计算机视觉等场合。
- 投影变换: 投影变换也叫透射变换、投影映射。是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。透射变换是仿射变换的延续,仿射变换后的图像形状仍维持原状。而投影变换包括的情况很多,有可能变换前后图像的形状发生了很大的改变,如对边不再平行,或者发生了透视畸变,这时可以使用投影变换使其恢复原状。适用于图像畸变校正等场合。
HALCON中常用几何变换是仿射和投影变换。
二维仿射变换主要是通过「变换矩阵」来完成两个图形之间坐标系的转换:
[ 原来图形 坐标矩阵 ] ⋅ [ 变换 矩阵 ] = [ 变换后的 坐标矩阵 ] (1) \left [ \begin{matrix} 原来图形\\坐标矩阵 \end{matrix} \right ] · \left [ \begin{matrix} 变换\\矩阵 \end{matrix}\right ] = \tag{1} \left [ \begin{matrix} 变换后的\\坐标矩阵 \end{matrix} \right ] [原来图形坐标矩阵]⋅[变换矩阵]=[变换后的坐标矩阵](1)
[ 变换 矩阵 ] ⋅ [ 原来图形 坐标矩阵 ] = [ 变换后的 坐标矩阵 ] (2) \left [ \begin{matrix} 变换\\矩阵 \end{matrix} \right ] · \left [ \begin{matrix} 原来图形\\坐标矩阵 \end{matrix}\right ] = \tag{2} \left [ \begin{matrix} 变换后的\\坐标矩阵 \end{matrix} \right ] [变换矩阵]⋅[原来图形坐标矩阵]=[变换后的坐标矩阵](2)
前面提到,仿射变换是一种线性变换(y = kx
)。但因为平移不是线性变化,所以2*2
的矩阵不能直接用一次矩阵变化表示仿射变化,而是通过新增1个维度引入「齐次坐标」来完成平移变换(转换成y = kx
+b)。
二维仿射变换 = 平移变换(平移) + 线性变换(缩放,错切,旋转) (3) \tag{3}二维仿射变换 = 平移变换(平移)+ 线性变换(缩放,错切,旋转) 二维仿射变换=平移变换(平移)+线性变换(缩放,错切,旋转)(3)
二维变换矩阵(左乘)分析:
T = [ a b p c d q m n s ] (4) T = \tag{4} \left [ \begin{matrix} a & b &p \\ c & d &q\\ m & n& s \end{matrix}\right ] T=
acmbdnpqs
(4)
T 1 = [ a b c d ] ; T 2 = [ m n ] ; T 3 = [ p q ] ; T 4 = [ s ] ; (5) T_1 = \tag{5} \left [ \begin{matrix} a & b\\ c & d\\ \end{matrix}\right ]; T_2 = \ \left [ \begin{matrix} m & n\\ \end{matrix}\right ]; T_3 = \ \left [ \begin{matrix} p & q\\ \end{matrix}\right ]; T_4 = \ \left [ \begin{matrix} s\\ \end{matrix}\right ]; T1=[acbd];T2= [mn];T3= [pq];T4= [s];(5)
该矩阵表示的是矩阵左乘(常规写法),即仿射变换使用公式(2)
的写法。其中:
- T1:表示对图形进行比例、旋转、对称、错切等变换;
- T2:对图形进行投影变换;
- T3:对图形进行平移变换;T4:对图形做整体比例变换;
若矩阵右乘(一般不用),即仿射变换使用公式(1)
的写法,则 T1 和 T4 含义不变,T2:对图形进行平移变换;T3:对图形进行投影变换;
二. 齐次坐标与齐次变换矩阵
1.1 齐次坐标 :点的坐标进行转置,然后扩1维 增加一个1
「齐次坐标」就是将一个原本是n
维的向量用一个n+1
维向量来表示。它既能够用来明确区分向量和点,同时也更易于进行几何变换,从而实现点坐标的平移、旋转和缩放,
- 二维坐标齐次化:二维点(x, y)变为(x, y, w)就成了齐次坐标;
- 三维坐标齐次化:三维点p(x, y, z)àp(x, y, z, w)也成了齐次坐标
w
作为通用比例因子,它可取任意正值,但一般在几何变换中,总是取w=1
,如果把一个「齐次坐标」转换成普通坐标,把前面坐标同时除以最后一个坐标,然后去掉最后一个分量。
1.2 齐次变换矩阵
1.2.1 平移变换
以点p(x,y)
为例,如果想把它平移至p(x+a,y+b)
,是不可能用矩阵计算完成的,现在换成齐次坐标(x,y,1)
,通过矩阵相乘(左侧公式) ,很方便得到平移后的坐标(x+a,y+b)
。
写成矩阵的形式:
[ x y 1 ] [ 1 0 0 1 a b ] = [ x + a y + b ] (6) \left [ \begin{matrix} x & y & 1 \end{matrix} \right ] \left [ \begin{matrix} 1 & 0 \\ 0 & 1 \\ a & b \end{matrix}\right ] = \tag{6} \left [ \begin{matrix} x+a & y+b\\ \end{matrix} \right ] [xy1]
10a01b
=[x+ay+b](6)
但通常不是上面的写法,而是把变换矩阵写到左侧,即左乘(实现矩阵行变换):
[ 1 0 a 0 1 b 0 0 1 ] [ x y 1 ] = [ x + a y + b 1 ] (7) \left [ \begin{matrix} 1 & 0&a \\ 0 & 1&b \\ 0 & 0&1 \end{matrix}\right ] \left [ \begin{matrix} x \\ y \\ 1 \end{matrix} \right ] = \tag{7} \left [ \begin{matrix} x+a &y+b&1\\ \end{matrix} \right ]
100010ab1
xy1
=[x+ay+b1](7)
1.2.2 缩放变换
以点𝑝(𝑥,𝑦)
为例,如果想把它的x
和y
缩小10倍,现在换成齐次坐标(x,y,1
)T,缩放后的坐标(x/10, y/10
)
通过矩阵相乘(左侧公式),写成矩阵相乘的形式:
[ 0.1 0 1 0 0.1 1 0 0 1 ] [ x y 1 ] = [ 0.1 x 0.1 y 1 ] (8) \left [ \begin{matrix} 0.1 & 0&1 \\ 0 & 0.1&1 \\ 0 & 0&1 \end{matrix}\right ] \left [ \begin{matrix} x \\ y \\ 1 \end{matrix} \right ] = \tag{8} \left [ \begin{matrix} 0.1x &0.1y&1\\ \end{matrix} \right ]
0.10000.10111
xy1
=[0.1x0.1y1](8)
1.2.3 旋转变换
旋转变换是线性变换的一种,通过旋转矩阵来实现。假设我们想对点𝑝(𝑥,𝑦)
进行逆时针旋转𝜃度,得到的新坐标,可以用如下的旋转矩阵来表示:
[ c o s ( θ ) − s i n ( θ ) 1 s i n ( θ ) c o s ( θ ) 1 0 0 1 ] [ x y 1 ] = [ x c o s ( θ ) − y s i n ( θ ) x s i n ( θ ) + y c o s ( θ ) 1 ] (9) \left [ \begin{matrix} cos(\theta) & -sin(\theta)&1 \\ sin(\theta) & cos(\theta)&1 \\ 0 & 0&1 \end{matrix}\right ] \left [ \begin{matrix} x \\ y \\ 1 \end{matrix} \right ] = \tag{9} \left [ \begin{matrix} xcos(θ)−ysin(θ) &xsin(θ)+ycos(θ) &1\\ \end{matrix} \right ]
cos(θ)sin(θ)0−sin(θ)cos(θ)0111
xy1
=[xcos(θ)−ysin(θ)xsin(θ)+ycos(θ)1](9)
1.3 小结
将一个空矩阵经过旋转、平移和缩放之后,其内的数值变化如下:
1、生成一个[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]
的空矩阵
hom_mat2d_identity (HomMat2DIdentity)
2、将该矩阵逆时针旋转80°,[cos80°, -sin80°, 0.0, sin80°, cos80°, 0.0]
*即[0.173648, -0.984808, 0.0, 0.984808, 0.173648, 0.0]
hom_mat2d_rotate (HomMat2DIdentity, rad(80), 0, 0, HomMat2DRotate)
3、再将该矩阵沿着XY方向分别平移600,400
*[0.173648, -0.984808, 600.0, 0.984808, 0.173648, 400.0]
hom_mat2d_translate (HomMat2DRotate, 600, 400, HomMat2DTranslate)
4、最终将该矩阵沿着XY方向缩放0.5倍
*[0.0868241, -0.492404, 300.0, 0.492404, 0.0868241, 200.0]
hom_mat2d_scale (HomMat2DTranslate, 0.5, 0.5, 0, 0, HomMat2DScale)
注意:这里不仅仅是第一三参数变为原来的0.5倍,而是所有系数全变为原来的0.5倍。
这也为我们从一个包含缩放和旋转效果的变换矩阵中提取出纯粹的旋转部分,然后计算旋转角度提供思路:可以按照以下步骤进行(假设只考虑旋转和缩放,没有剪切和平移):
以该旋转矩阵
R = [ R 11 R 12 R 21 R 22 ] = [ − 8.56361 e − 03 2.24152 e − 05 1.07640 e − 05 8.55496 e − 03 ] (1) R = \tag{1} \left [ \begin{matrix} R11 & R12\\ R21 & R22\\ \end{matrix}\right ] =\left [ \begin{matrix} -8.56361e-03 & 2.24152e-05\\ 1.07640e-05 & 8.55496e-03\\ \end{matrix}\right ] R=[R11R21R12R22]=[−8.56361e−031.07640e−052.24152e−058.55496e−03](1)
1、 消除缩放效果,我们首先需要将旋转矩阵归一化,即将第一列的向量单位化。这样可以消除缩放效果,使矩阵变为一个纯粹的旋转矩阵:
scale = ( R 11 ) 2 + ( R 21 ) 2 = ( − 8.56361 ∗ 1 0 − 3 ) 2 + ( 1.07640 ∗ 1 0 − 5 ) 2 ≈ ( 7.335 ∗ 1 0 − 5 ) 2 ≈ 0.00856 (2) \text{scale} =\tag{2} \sqrt{(R11)^2 + (R21)^2} = \sqrt{(-8.56361 * 10^{-3})^2 + (1.07640* 10^{-5})^2} ≈\sqrt{(7.335* 10^{-5})^2} ≈ 0.00856 scale=(R11)2+(R21)2=(−8.56361∗10−3)2+(1.07640∗10−5)2≈(7.335∗10−5)2≈0.00856(2)
其中R11,R21是矩阵的第一列元素
2、归一化旋转矩阵:将旋转矩阵除以缩放因子,得到单位旋转矩阵(消除缩放效果):
R ’ = R s c a l e = [ − 8.56361 ∗ 1 0 − 3 / 0.00856 2.24152 ∗ 1 0 − 5 / 0.00856 1.0764 ∗ 1 0 − 5 / 0.00856 8.55496 ∗ 1 0 − 3 / 0.00856 ] (3) R’ =\frac{R}{scale} = \tag{3} \left [\begin{matrix} -8.56361 * 10^{-3} /0.00856 & 2.24152* 10^{-5} /0.00856\\ 1.0764* 10^{-5} /0.00856 & 8.55496 * 10^{-3} /0.00856\\ \end{matrix}\right] R’=scaleR=[−8.56361∗10−3/0.008561.0764∗10−5/0.008562.24152∗10−5/0.008568.55496∗10−3/0.00856](3)
R ’ = R s c a l e = [ − 1 0.00262 0.00126 1 ] (4) R’ =\frac{R}{scale} = \tag{4} \left [\begin{matrix} -1 & 0.00262\\ 0.00126 & 1\\ \end{matrix}\right] R’=scaleR=[−10.001260.002621](4)
拓展:
3、求解旋转角度:
使用反正弦函数求解旋转角度:θ=arcsin(R21’) = arcsin(0.00126) ≈ 0.0722°
三. Halcon中的几何变换
3.1 常用算子
- vector_to_hom_mat2d ( : : Px, Py, Qx, Qy : HomMat2D) —
用来生成像素坐标与机械坐标之间的转换矩阵
描述:
参数:
Px(in):原始点的X坐标。
Py(in):原始点的Y坐标。
Qx(in):变换点的X坐标。
Qy (in):变换点的Y坐标。
HomMat2D(out) :输出转换矩阵。
* 根据实际标定得到的像素坐标和机械位置生成图像坐标系和机械坐标系之间的仿射矩阵
vector_to_hom_mat2d ([0,100,200,0,100,200,0,100,200] ,[0,0,0,100,100,100,200,200,200],[0,10,20,0,10,20,0,10,20],[0,0,0,10,10,10,20,20,20], HomMat2D)
* 查看qx,qy的值 是否和标定的数据差异太大
affine_trans_point_2d (HomMat2D, 1863, 1934, Qx, Qy)
如图:可以输出的转换矩阵含有6个值
实际参与左乘计算的齐次转换矩阵如下所示:
由于该像素当量的标定仅仅只有缩放变换,所以可以看出,只有转换矩阵中的HomMat2D[0]和HomMat2D[4]元素参与计算,分别代表X
和Y
方向的缩放系数。
具体来说,矩阵的生成顺序为:
首先进行旋转变换。
然后进行缩放变换。
最后进行平移变换(如果指定了平移向量)
下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。 |
文章评论