计算机图形学笔记(中篇讲投影变换,有机器视觉标定的影子)
第三章:二维变换
(一)向量分析
向量点乘内积:a1*b1+a2*b2=|a||b|cosy值>0夹角小于90度不分正负(由余弦确定)=0就是垂直
向量叉乘外积:行列式的值=|a||b|siny值>0示表b在a逆时针180度内(由正弦确定)=0就是重合
(二)坐标变换
分类:世界坐标系(全局),建模坐标系(局部),观察坐标系(观察者角度),设备坐标系(输出设备角度),规范坐坐标系(用于中间转换)
图形变换:比例,旋转,镜像,错切,平移,(OPENCV中仿射变换章节也有算法阐述)
齐次坐标表示法:用一个N+1维的向量表示一个N维向量的方法,其中最后一维的常数程为哑坐标(方便矩阵运算)
(1)向量变换
[x*,y*]=[x,y]*M,由x*=a1x+b1y+c1,y*=a2x+b2y+cx知M矩阵为[[a1,b1,c1]T,[a2,b2,c2]T],几何意义上理解为第三维为常数的平面上的一个二维向量
[x*,y*,1]=[x,y,1][[1,0,0],[0,1,0],[Tx,Ty,1]]=[x+Tx,y+Ty,1],平移
[x*,y*,1]=[x,y,1][[1,0,0],[0,1,0],[0,0,S]]=[x,y,S]=[x/S,y/S,1],整体变换S>1时变大,<1时变小
[x*,y*,1]=[x,y,1][[Sx,0,0],[0,Sy,0],[0,0,1]]=[Sx*x,Sy*y,1,比例变换
[x*,y*,1]=[x,y,1][[1,0,0],[0,-1,0],[0,0,1]]=[x,-y,1],关于X轴对称
[x*,y*,1]=[x,y,1][[-1,0,0],[0,1,0],[0,0,1]]=[-x,y,1],关于Y轴对称
[x*,y*,1]=[x,y,1][[-1,0,0],[0,-1,0],[0,0,1]]=[-x,-y,1],关于原点对称
x*=rcos(a+b)=rcosacosb-rsinasinb,y*=rsin(a+b)=rcosasinb+rsinacosb=xsinb+ycosb
[x*,y*,1]=[x,y,1][[cosb,sinb,0],[-sinb,cosb,0],[0,0,1]]=[xcosb-ysinb,xsinb+ycosb,1],绕原点逆时针旋转b角顺时针则b取负
[x*,y*,1]=[x,y,1][[0,1,0],[1,0,0],[0,0,1]]=[y,x,1],关于Y=X对称
二维复合变换就是变换矩阵相乘,注意是符合结合律的,但是不符合交配律
(2)坐标系变换:将P(XP,YP)从XOY坐标系变换到X'O'Y'坐标系:先平移使O与O'重合,再旋转
(3)相对任意参考点变换(不以原点为中心):先把固定点平移到原点,由变换,最后反平移固定点返回
小结:[[a,b,p],[c,d,q],[l,m,s]]:abcd比例旋转对称错切,lm平移,pq投影,s整体比例
(三)窗口与视区变换
窗口:世界坐标系中要显示的区域,定义显示什么
视区:窗口映射到显示器设备上的区域称为视区,定义在何处显示
观察变换:窗口到视区的转换
1、变焦距效果:窗口越小,视区大小不变,就会放大图像某一部分,观察到较大窗口未显示的内容,反之类似照相机变焦
2、整体缩放效果:窗口不变,视区变化,得到整体缩放效果,看到的东西不会变,这个是由窗口决定的
世界坐标系->屏幕坐标系,下面是把窗口中的xx转换成视区中的sx
视区中某点X与视区左边距(sx-vl)/视区长度(vr-vl)=窗口中某点X与窗口左边距(xx-wl)/窗口长度(wr-wl)
注意到视区总长度(vr-vl)比窗口总长度(wr-wl)是个定值,令其为A,则sx=A*x+vl-A*wl,右边常数项是左界比例缩放时产生的残差偏移量
第四章:三维变换
(一)几何变换
T=[[a,b,c,p],[d,e,f,q],[g,h,i,r],[l,m,n,s]],abcdefghi对点进行比例对称旋转错切,lmn平移,s整体缩放,pqr透视投影变换
类似二维,aei是单独对某轴缩放(若要对平面对称则垂直于该平面的轴为-1,如yoz面对称则a=-1;若要对轴对称则另外两轴为-1,如x轴对称则e=i=-1)
旋转时注意右手定则下,绕哪轴旋转,就从该转正方向望过去,例如Z轴从上方竖直向下看决定XOY旋转的逆正顺负
若要绕任意直线旋转矩阵的原则:变成绕坐标轴旋转的问题(与二维类似思路),先把轴变换到轴上,再旋转,再反变换
(二)换影变换:在二维面平面显示三维物体
分类:透视(中心)投影,平行(正,斜)
(1)正投影——三视图(XOZ,YOZ,XOY)
步骤:确定各点坐标,引入齐次坐标求出变换矩阵,运算得到变换后的值,绘图
主视图V面从Y轴正轴望过去:T(xoz)=[[1000],[0000],[0010],[0001]]强行把Y坐标清0
左视图W面从X轴正轴望过去:T(yoz)=[[0000],[0100],[0010],[0001]]强行把X坐标清0,为美观需再绕Z轴逆时针转90度让其与主视图在同一平面上,再沿Z轴平移-X0偏移与主视图分开
府视图H面从Z轴正轴望过去:T(xoy)=[[1000],[0100],[0000],[0001]]强行把Z坐标清0,为美观需再绕X轴顺时针转90度让其与主视图在同一平面上,再沿Z轴平移-Z0偏移与主视图分开
最终:主[x,0,z,1],俯[x,0,-(y+z0),1],侧[-(y+x0),0,z,1]
(2)正投影——正轴测
等轴测:投影面与三个坐标轴之间夹角都相等A=45度,B=-35.26度(如x+y+z=1)
正二测:投影面与两个坐标轴之间夹角都相等A=20.7度,B=19.47度
正三测:投影面与三个坐标轴之间夹角都不等
正轴测图求解:以V面为轴测投影面,先绕Z轴转A角,再绕X轴转-B角,最后向V面投影,变换距阵为T正=TZ+TX+TV
最终:X*=xcosa-ysina,y*=0,z*=-xsinasinb-ycosasinb+zcosb
(3)透视(中心)投影
分类:一点透视如平面z=0,二点透视如平面x+y=1,三点透视如平面x+y+z=1
举例:以一点透视为例:[xyz1]·[[1000],[0100],[0010],[p001]]=[xyz(px+1)],归一化后[x'y'z'1]=[x/(px+1),y/(px+1),z/(px+1),1]
特点:将在x轴上的1/p处产生一个灭点,坐标值为(1/p,0,0),所有平行于X轴的线将延伸交于该点
推理:设投影中心在z=-d处,投影面在XOY上,现要求空间一点P(X,Y,Z)的透视投影P'(X',Y',Z')坐标,则显然x'/x=y'/y=d/(d+z),得到x'=x/(1+z/d),y'=y/(1+z/d),z'=0,透视坐标与Z值成反比,而D值对透视图有缩放功能,若投影串心在无穷远处,则1/d=0,就是平行投影
矩阵:[x',y',z',1]=[x,y,z,1][[1,0,0,0],[0,1,0,0],[0,0,1,1/d],[0,0,0,1]]=[x,y,z,1+z/d]=[x/(1+z/d),y/(1+z/d),z/(1+z/d),1]
改进:开始要先平移到适当位置,再中间透视转换,最后再投影到投影面即某轴坐标清0
T完整=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[l,m,n,1]]·[[1,0,0,0],[0,1,0,0],[0,0,1,1/d],[0,0,0,1]]·[[1,0,0,0],[0,1,0,0],[0,0,0,0],[0,0,0,1]]