精华内容
下载资源
问答
  • 仿射坐标系的定义
    2021-03-26 20:23:03
    1.1.坐标系分类:
    1)HALCON标准坐标系:亚像素精确坐标系 标准坐标系,图像坐标系
    	定义:像素中心坐标,HALCON标准子像素坐标系
              原点位于左上角(-0.5,-0.5)像素中心;右下角(rows+0.5,cols+0.5)
    	用途:
    	affine_trans_point_2d 以_2d结尾的函数还可以用于像素坐标系
    	area_center
    
    2)像素坐标系:边缘居中坐标
    	定义:原点位于左上角(0,0)像素中心;右下角(rows-1,cols-1)
    	用途:矩阵运算
    		affine_trans_contour_xld
    		affine_trans_image
    		affine_trans_image_size
    		affine_trans_polygon_xld
    		affine_trans_region
    		affine_trans_pixel   注1
    		
    		注1:
    			首先将输入坐标从HALCON标准坐标系(原点位于左上像素中心)
    			转换为原点在左上像素左上角的像素坐标系。
    			用HomMat2D转换后结果将转换回标准坐标系。
    		
    		projective_trans_contour_xld
    		projective_trans_image
    		projective_trans_image_size
    		projective_trans_pixel
    		projective_trans_region
    		
    		注意:
    		以projective_开头运算符使用投影变换矩阵,所用矩阵被写在三维坐标系的XY平面投影中。 
    		因此,轴有赋值行:y坐标,列:x坐标,需要转换坐标。
    		
    		find_aniso_shape_model  基于形状的模板匹配函数
    		find_aniso_shape_models
    		find_scaled_shape_model
    		find_scaled_shape_models
    		find_shape_model
    		find_shape_models
    		
    	说明:标准坐标系和像素坐标系相差0.5piexl
    3)极坐标
    	用途:
    		polar_trans_image_ext
    		polar_trans_image_inv
    		polar_trans_region
    		polar_trans_region_inv
    		polar_trans_contour_xld
    		polar_trans_contour_xld_inv
    		polar_trans_image (legacy)
    1.2.标准坐标系和像素坐标系相互转换
    	area_center(Image,Area,Row,Column)
    	vector_angle_to_rigid(Row,Column,0,Row,Column,rad(90),HomMat2D)
    
    	hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
    	hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
    	affine_trans_image(Image, ImageAffineTrans, HomMat2DAdapted,'constant', 'false') 
    	
    	之所以对旋转矩阵进行变换是因为旋转中心点坐标是基于标准图像坐标系,图片左上角的坐标是(0.5,0.5)
    	hom_mat2d_translate 是矩阵左乘;hom_mat2d_translate_local是矩阵右乘,基于本地坐标系
    	Row和Column指的的是图片像素坐标
    2.测试:	
    *在黑色背景上画矩形并填充:矩形中心和图像中心重合
    width:=200
    height:=160
    
    gen_image_const (image, 'byte', width, height) 
    gen_rectangle1(rect,60,60,100,140)
    *gen_rectangle1(rect,20,60,100,100)//第二次测试矩形:中心点不重合
    overpaint_region (image, rect, 125, 'fill') 
    
    *创建3个窗口
    dev_open_window(0,0,width,height,'black',winHnd1)
    dev_open_window(0,0,width,height,'black',winHnd2)
    dev_open_window(0,0,width,height,'black',winHnd3)
    
    *比较未旋转和旋转图像的数据:
    get_image_size(image,width11,height11)
    area_center(image,Area11,Row11,Column11)
    
    *方法1:
    *创建旋转矩阵:旋转地点为 (height/2,width/2)
    *注意顺序
    hom_mat2d_identity(matrix1)
    hom_mat2d_rotate(matrix1,rad(90),height/2,width/2,r_matrix1)
    
    *不需纠正
    affine_trans_image(image, r_image1, r_matrix1,'constant', 'false') 
    get_image_size(r_image1,width12,height12)
    area_center(r_image1,Area12,Row12,Column12)
    
    dev_set_window(winHnd1)
    dev_display(r_image1)
    *方法2:需纠正-先转换在修正
    hom_mat2d_identity(matrix2)
    hom_mat2d_rotate(matrix2,rad(90),Row11,Column11,r_matrix2)
    get_image_size(image,width21,height21)
    area_center(image,Area21,Row21,Column21)
    
    *数据修正:
    hom_mat2d_translate(r_matrix2, 0.5, 0.5, HomMat2DTmp)
    hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, adjust_matrix2)
    
    *仿射变换:
    affine_trans_image(image, r_image2, adjust_matrix2,'constant', 'false')  
    
    get_image_size(image,width22,height22)
    area_center(r_image2,Area22,Row22,Column22)
    
    dev_set_window(winHnd2)
    dev_display(r_image2)
    *方法3:需纠正-直接修改原始数据
    hom_mat2d_identity(matrix3)
    hom_mat2d_rotate(matrix3,rad(90),Row11+0.5,Column11+0.5,r_matrix3)
    get_image_size(image,width31,height31)
    area_center(image,Area31,Row31,Column31)
    
    *仿射变换:  
    affine_trans_image(image, r_image3, r_matrix3,'constant', 'false')
     
    get_image_size(r_image3,width32,height32)
    area_center(r_image3,Area32,Row32,Column32)
    
    dev_set_window(winHnd3)
    dev_display(r_image3)
    
    *测试结果:
    b1:=(width11+width12+width21+width22+width31+width32)-6*width11
    b2:=(height11+height12+height21+height22+height31+height32)-6*height11
    b3:=(Area11+Area12+Area21+Area22+Area31+Area32)-3*Area11-3*Area12
    b4:=(Row11+Row12+Row21+Row22+Row31+Row32)-6*Row11
    b5:=(Column11+Column12+Column21+Column22+Column31+Column32)-6*Column11
    ok:=(b1+b2+b3+b4+b5)==0
    具体文档请参考:
    https://www.mvtec.com/doc/halcon/1811/en/toc_transformations_2dtransformations.html
    https://blog.csdn.net/qingzhuyuxian/article/details/93734539	

     

    更多相关内容
  • 仿射变换和透视变换和图像坐标系、相机坐标系和世界坐标系定义开篇仿射变换透视变换图像坐标系、相机坐标系和世界坐标系三维的点投影在二维平面上坐标系和坐标变换公式合体Zhang方法 开篇 本文主要介绍计算机视觉...

    开篇

    本文主要介绍计算机视觉的位姿估计,相机标定原理,和zhang方法求解内外相机参数。

    仿射变换

    这个是一般的仿射变换的公式。

    为了能够更好的理解它,我们首先来看看下面几幅图:

    在这里插入图片描述
    上面的x和y分别代表像素的坐标,然后x0,y0代表的是平移量。然后生成了新的位置u和v。然后旋转也是一样的。首先这个旋转一定要在原点,所以一般opencv的第一步就是把这个图像的中心放到原点。最终在平移回去
    在这里插入图片描述

    上面这个是缩放的公式,都是大同小异,一样的到底。把x放大Sx倍,把y放大Sy倍。那么现在再来看看咱们上面的那仿射变换的公式。
    在这里插入图片描述
    其中A中的对角线决定 缩放,反对角线决定 旋转 或 错切。
    这就好比缩放的公式乘以了旋转的公式加上了平移的变化。
    这里有一点要注意的就是多边形的图片不能用仿射变换,因为会导致四边形的边消失,可以看看这个:https://www.zhihu.com/question/20666664/answer/15790507
    (个人认为是在Shear的过程中,多边形可能会在某个值重合成一条线,这里我也不太明白,有大牛可以告知一下)
    这里一般来说,opencv中的实现需要咱们提供至少6个点,其中三个点是输入,后三个是输出。

    透视变换

    先上一张图,其实我觉得透视变换就是仿射变换的升级版。
    在这里插入图片描述
    在这里插入图片描述
    透视变换就是从左图转换到了右图。相信也很容易理解。相当于换了个视角来看事物。如下图:
    在这里插入图片描述
    下面来看看公式:
    在这里插入图片描述
    opencv的实现和仿射变换差不多,不过这个是需要至少4个点集才能进行。就比如上面那个公路的图,首先自己要决定点在哪里,这个图的话肯定选择的是白线上的点,得到坐标之后,如果想变成一个类似于长方形的(就是右图)的图像的话,这里的点的坐标也是需要自己决定的,如果想要使刚刚左图中选择的点成为一些比如平行等关系,需要自己合理安排一下,然后套到公式里面进行暴力求解,求得这9个值。

    图像坐标系、相机坐标系和世界坐标系

    图像左边西和相机坐标系和时间坐标系都是可以用过线性变化来互相转化的。先看看这幅图:
    在这里插入图片描述
    图中壶的位置是图像坐标系,也可以说是物体坐标系,两个相机有两个不同的相机坐标系,然后相机和物体存在的这个房间或者什么地方可以被叫做世界坐标系。
    怎么样才能从一个坐标系变换到另外一个坐标系呢?
    首先来看看坐标系是如何旋转的。
    在这里插入图片描述
    同理,上图是绕Z轴旋转的示意图,当然也可以绕x或y轴旋转。
    在这里插入图片描述
    那么从一个坐标系可以通过各种旋转加平移变成另外一个坐标系。通过上面的等式,我们可以看到物体点P通过旋转位移便可以得到在相机坐标系的坐标

    三维的点投影在二维平面上

    这个说白了就是一个小孔成像模型,摄像机通过小孔,把成像映射在平面的点上。
    在这里插入图片描述
    对应的公式就是上面图右下角的公式,便可以得到对应的二维平面坐标

    坐标系和坐标变换

    在这里插入图片描述
    首先,图像坐标系和像素坐标系都是二维的。只不过他们的度量单位和原点不同而已。像素坐标系是以每个像素为基本单位,就好比说咱们一副3*3的图像一共有9个像素一个道理。但图像坐标系的单位是mm,dx,dy分别代表的是一个像素点的长和宽,单位是mm。

    公式合体

    在这里插入图片描述
    其中,在这里插入图片描述算是外参矩阵,后面的RT矩阵是内参矩阵。看下图
    在这里插入图片描述
    很明显我们最后有了12个未知数,然后每一个点可以为我们带来二个式子。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    所以现在就是解方程了,只要有6个点切非共面(如果不满足这个的话求出来的解不满足正交矩阵,咱们的R旋转矩阵一定是正交矩阵),变可以得出内参和外参。
    需要注意的是这里的求出来的解是内参加外参的一个矩阵。所以这里需要QR分解出来R。具体的求解方法可以看看opencv solvePnp函数。
    还有就是这个内参数:
    现以NiKon D700相机为例,焦距 f = 35mm 最高分辨率:4256×2832 传感器尺寸:36.0×23.9 mm
    根据以上定义可以有:
    u0= 4256/2 = 2128 v0= 2832/2 = 1416 dx = 36.0/4256 dy = 23.9/2832
    fx = f/dx = 4137.8 fy = f/dy = 4147.3
    分辨率可以从显示分辨率与图像分辨率两个方向来分类。
    [1]显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。
    [2]图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。

    Zhang方法

    在这里插入图片描述
    在这里插入图片描述
    需要小心的是,当我们使用真实的数据求解时,将计算得到的r向量放在一起(R=(r1,r2,r3)),我们并不能得到精确的旋转矩阵R,使得R为正交阵。

    为了解决这个问题,我们常使用强制的方法,即对R进行奇异值分解,R=UDVT,U,V为正交阵,D为对角阵,如果R是正交阵,那么奇异值分解后的对角阵D是单位阵,那么我们将单位阵I代替对角阵D,进而重构出满足正交条件的R.

    奇异值分解的含义: https://www.cnblogs.com/endlesscoding/p/10033527.html
    从上面的图片的压缩结果中可以看出来,奇异值可以被看作成一个矩阵的代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,就可以基本上还原出数据本身。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我对这个的理解就是咱们一般用的照相机之类的拍照都会有一定的误差,而这个误差就出现在透镜的凸凹的状况。一般我们用一个相机拍摄一个三维的东西,咱们会有物体真实的角点,和图片上的角点,然后用这些先计算一遍,不考虑畸变的外参数和内参数。然后在通过一个叫做Brown的方法来计算畸变参数。然后我们就可以用这些参数去估计坐标系旋转。

    展开全文
  • 曲线Curve结构定义一级目录 /// Curve related structs. pub mod curve { pub use crate::{ field::{Field, FieldStorage}, group::{Affine, AffineStorage, Jacobian, AFFINE_G, CURVE_B}, scalar::Scalar, };...

    2021SC@SDUSC

    libsecp256k1比特币密码算法开源库(四)中定义了有限域下椭圆曲线的相关运算,在那一篇中对于椭圆曲线几何加法运算的过程有了非常详细的说明。但是在那一篇中,对与不同的两点P和Q,计算其几何加法结果R必须要经过非常重要的一步,即求斜率m:
    m = y P − y Q x P − x Q   m o d   p = ( y P − y Q ) ( x P − x Q ) − 1 m o d   p m=\frac{y_P-y_Q}{x_P-x_Q} \,mod\,p=(y_P-y_Q)(x_P-x_Q)^{-1} mod\,p m=xPxQyPyQmodp=(yPyQ)(xPxQ)1modp在这一步中不可避免地要求一个乘法逆元,即 ( x P − x Q ) − 1 (x_P-x_Q)^{-1} (xPxQ)1。计算乘法逆元可以使用扩展欧几里得算法,这个开销或许不是很大,但这里的 x P x_P xP x Q x_Q xQ都是非常大的数(BigInt),用扩展欧几里得算法计算相应的乘法逆元是非常困难的。除此之外,计算椭圆曲线的标量乘法也有非常关键的一步,也就是计算最开始两个相同数的几何加法,其中也要计算斜率m:
    m = 3 x P 2 + a 2 y P   m o d   p = ( 3 x P 2 + a ) ( 2 y P ) − 1   m o d   p m =\frac {3 x_P^2 + a} { 2 y_P }\, mod\,p=(3 x_P^2 + a)(2 y_P)^{-1}\, mod\,p m=2yP3xP2+amodp=(3xP2+a)(2yP)1modp在这一步中还是不可避免地要求乘法逆元 ( 2 y P ) − 1 (2 y_P)^{-1} (2yP)1

    除此之外,在介绍椭圆曲线群中的元素中,除了那些满足椭圆曲线方程具有横纵坐标的点之外,我还提到一个“无穷远点”。这个无穷远点从何而来,本文将会进行解答。

    那么在实际算法实现过程中,避开扩展欧几里得算法,以求更加快速高效地求大数的乘法逆元是很重要的一个问题。实际上,在椭圆曲线上点的表示有两种形式:仿射坐标Affine表示和射影坐标Projection表示,通过将椭圆曲线上的点坐标从仿射坐标转换到射影坐标中,就可以巧妙地避开扩展欧几里得算法。下面开始:

    Affine 仿射坐标

    虽然这里给仿射坐标放了一个title,但其实这里已经没有必要给仿射坐标讲太多东西了。之前几篇讲的椭圆曲线的方程表示和坐标运算其实都是基于仿射坐标的。也就是说,椭圆曲线的仿射方程就是 y 2 = x 3 + a x + b y^2=x^3+ax+b y2x3axb,在有限域中,这个方程也就表达为 y 2 = ( x 3 + a x + b )   m o d   p y^2=(x^3+ax+b)\,mod\,p y2(x3axb)modp。也就是说,在仿射坐标下才存在要使用扩展欧几里得算法求解乘法逆元的问题。

    Projection射影坐标

    射影坐标分为:标准射影坐标、Jacobian加重射影坐标、Chudnovsky射影坐标。在椭圆曲线中使用的是Jacobian加重射影坐标,Chudnovsky射影坐标和这里的椭圆曲线没什么关系,所以不讲它。为了说明白Jacobian加重射影坐标,先从最基本的标准射影坐标开始。

    标准射影坐标

    在仿射坐标中,我们有椭圆曲线方程: y 2 = x 3 + a x + b y^2=x^3+ax+b y2x3axb,对应点的坐标就是 ( x , y ) (x,y) (x,y),射影坐标是三维的,一个点的坐标表示为 ( x , y , z ) (x,y,z) (x,y,z)。这里我们规定:
    在标准射影坐标中,点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z , y z ) (\frac xz,\frac yz) (zx,zy)
    同理有,在仿射坐标中的点 ( x , y ) (x,y) (x,y)对应标准射影坐标中的点 ( x , y , 1 ) (x,y,1) (x,y,1)

    有了这样的一个对应关系,我们令椭圆曲线方程 y 2 = x 3 + a x + b   y^2=x^3+ax+b\, y2x3axb   x = x z   \,x=\frac xz\, x=zx   y = y z   \,y=\frac yz\, y=zy就得到了标准射影坐标中的椭圆曲线方程: y 2 z = x 3 + a x z 2 + b z 3   y^2z=x^3+axz^2+bz^3\, y2zx3axz2bz3可以看到,由于点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z , y z ) (\frac xz,\frac yz) (zx,zy),这就使得z不能为0,如果z为零,在射影坐标中的点 ( 0 , y , 0 ) (0,y,0) (0,y,0)就找不到一个对应的仿射坐标值。但实际上椭圆曲线的点还是以射影坐标为准,也就是说就是有这样一个点 ( 0 , y , 0 ) (0,y,0) (0,y,0),于是在仿射坐标中称这个点为“无穷远点”,也就是在射影坐标中这个z=0的点。

    有了上面的从仿射坐标到标准射影坐标的映射关系,可以定义在标准射影坐标下的几何加法运算。令P和Q为不相等的两点, P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) Q ( x 2 , y 2 , z 2 ) Q(x_2,y_2,z_2) Q(x2,y2,z2),令 R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),且R=P+Q(几何加法运算),标准射影坐标下的几何加法运算过程如下: λ 1 = x 1 z 2 λ 2 = x 2 z 1 λ 3 = λ 1 − λ 2 λ 4 = y 1 z 2 λ 5 = y 2 z 1 λ 6 = λ 4 − λ 5 λ 7 = λ 1 + λ 2 λ 8 = z 1 z 2 λ 9 = λ 3 2 λ 10 = λ 3 λ 9 λ 11 = λ 8 λ 6 2 − λ 7 λ 9 x 3 = λ 3 λ 11 y 3 = λ 6 ( λ 9 λ 1 − λ 11 ) − λ 4 λ 10 z 3 = λ 10 λ 8 \lambda_1=x_1z_2\\\lambda_2=x_2z_1\\\lambda_3=\lambda_1-\lambda_2\\\lambda_4=y_1z_2\\\lambda_5=y_2z_1\\\lambda_6=\lambda_4-\lambda_5\\\lambda_7=\lambda_1+\lambda_2\\\lambda_8=z_1z_2\\\lambda_9=\lambda_3^2\\\lambda_{10}=\lambda_3\lambda_9\\\lambda_{11}=\lambda_8\lambda_6^2-\lambda_7\lambda_9\\x_3=\lambda_3\lambda_{11}\\y_3=\lambda_6(\lambda_9\lambda_1-\lambda_{11})-\lambda_4\lambda_{10}\\z_3=\lambda_{10}\lambda_{8} λ1=x1z2λ2=x2z1λ3=λ1λ2λ4=y1z2λ5=y2z1λ6=λ4λ5λ7=λ1+λ2λ8=z1z2λ9=λ32λ10=λ3λ9λ11=λ8λ62λ7λ9x3=λ3λ11y3=λ6(λ9λ1λ11)λ4λ10z3=λ10λ8最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点标准射影坐标。

    对于标量乘法中,我们首先需要计算两个相等点P+P,即计算2P,令 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),标准射影坐标运算过程如下:
    λ 1 = 3 x 1 2 + a z 1 2 λ 2 = 2 y 1 z 1 λ 3 = y 1 2 λ 4 = λ 3 x 1 z 1 λ 5 = λ 2 2 λ 6 = λ 1 2 − 8 λ 4 x 3 = λ 2 λ 6 y 3 = λ 1 ( 4 λ 4 − λ 6 ) − 2 λ 5 λ 3 z 3 = λ 2 λ 5 λ_1 = 3x_1^2 +az^2_1\\λ_2 = 2y_1z_1\\λ_3 = y^2_1\\λ_4 = λ_3x_1z_1\\λ_5 = λ_2^2\\λ_6 = λ^2_1 −8λ_4\\ x_3 = λ_2λ_6\\y_3 = λ_1(4λ_4 −λ_6)−2λ_5λ_3\\z_3 = λ_2λ_5 λ1=3x12+az12λ2=2y1z1λ3=y12λ4=λ3x1z1λ5=λ22λ6=λ128λ4x3=λ2λ6y3=λ1(4λ4λ6)2λ5λ3z3=λ2λ5最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点标准射影坐标。

    上面的公式对于libsecp256k1开源库其实意义不大,在libsecp256k1开源库中使用的射影坐标是Jacobian加重射影坐标。

    Jacobian加重射影坐标

    Jacobian加重射影坐标与标准射影坐标方法类似,在Jacobian加重射影坐标中,一个射影点的坐标表示为 ( x , y , z ) (x,y,z) (x,y,z),这里我们规定:
    在Jacobian加重射影坐标,点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z 2 , y z 3 ) (\frac {x}{z^2},\frac {y}{z^3}) (z2x,z3y)
    同理有,在仿射坐标中的点 ( x , y ) (x,y) (x,y)对应Jacobian加重射影坐标中的点 ( x , y , 1 ) (x,y,1) (x,y,1)

    有了这样的一个对应关系,我们令椭圆曲线方程 y 2 = x 3 + a x + b   y^2=x^3+ax+b\, y2x3axb   x = x z 2   \,x=\frac {x}{z^2}\, x=z2x   y = y z 3   \,y=\frac {y}{z^3}\, y=z3y就得到了Jacobian加重射影坐标中的椭圆曲线方程: y 2 = x 3 + a x z 4 + b z 6   y^2=x^3+axz^4+bz^6\, y2x3axz4bz6同样可以看到,由于点 ( x , y , z ) (x,y,z) (x,y,z)对应仿射坐标中的点 ( x z 2 , y z 3 ) (\frac {x}{z^2},\frac {y}{z^3}) (z2x,z3y),当z为零,有射影坐标中的点 ( x , y , 0 ) (x,y,0) (x,y,0),该点同样的在仿射坐标中称为“无穷远点”,也就是在射影坐标中这个z=0的点。

    有了上面的从仿射坐标到Jacobian加重射影坐标的映射关系,可以定义在Jacobian加重射影坐标下的几何加法运算。令P和Q为不相等的两点, P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) Q ( x 2 , y 2 , z 2 ) Q(x_2,y_2,z_2) Q(x2,y2,z2),令 R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),且R=P+Q(几何加法运算),Jacobian加重射影坐标下的几何加法运算过程如下: λ 1 = x 1 z 2 2 λ 2 = x 2 z 1 2 λ 3 = λ 1 − λ 2 λ 4 = y 1 z 2 3 λ 5 = y 2 z 1 3 λ 6 = λ 4 − λ 5 λ 7 = λ 1 + λ 2 λ 8 = λ 4 + λ 5 x 3 = λ 6 2 − λ 7 λ 3 2 λ 9 = λ 7 λ 3 2 − 2 x 3 y 3 = ( λ 9 λ 6 − λ 8 λ 3 3 ) / 2 z 3 = z 1 z 2 λ 3 λ_1=x_1z_2^2\\λ_2=x_2z_1^2\\λ_3 = λ_1 −λ_2\\λ_4 = y_1z^3_2\\λ_5 = y_2z^3_1\\λ_6 = λ_4 −λ_5\\λ_7 = λ_1 +λ_2\\ λ_8 = λ_4 +λ_5\\x_3 = λ^2_6 −λ_7λ^2_3\\λ_9 = λ_7λ^2_3 −2x_3\\y_3 = (λ_9λ_6 −λ_8λ_3^3)/2\\z_3 = z_1z_2λ_3 λ1=x1z22λ2=x2z12λ3=λ1λ2λ4=y1z23λ5=y2z13λ6=λ4λ5λ7=λ1+λ2λ8=λ4+λ5x3=λ62λ7λ32λ9=λ7λ322x3y3=(λ9λ6λ8λ33)/2z3=z1z2λ3最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点Jacobian加重射影坐标。

    对于标量乘法中,我们首先需要计算两个相等点P+P,即计算2P,令 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1) P(x1,y1,z1) R ( x 3 , y 3 , z 3 ) R(x_3,y_3,z_3) R(x3,y3,z3),Jacobian加重射影坐标运算过程如下:
    λ 1 = 3 x 1 2 + a z 1 4 λ 2 = 4 x 1 y 1 2 λ 3 = 8 y 1 4 x 3 = λ 1 2 − 2 λ 2 y 3 = λ 1 ( λ 2 − x 3 ) − λ 3 z 3 = 2 y 1 z 1 λ_1 = 3x_1^2 +az^4_1\\λ_2 = 4x_1y^2_1\\λ_3 = 8y^4_1\\x_3 = λ^2_1 −2λ_2\\y_3 = λ_1(λ_2 −x_3)−λ_3\\z_3 = 2y_1z_1 λ1=3x12+az14λ2=4x1y12λ3=8y14x3=λ122λ2y3=λ1(λ2x3)λ3z3=2y1z1最后得到的 x 3 , y 3 , z 3 x_3,y_3,z_3 x3,y3,z3即为得到的R点Jacobian加重射影坐标。

    可以看到,在这两个过程中没有除法运算,也就不需要定义乘法逆元。那么这时候想要避开扩展欧几里得算法求乘法逆元就很简单了:只需将椭圆曲线在仿射坐标中的点,转化为在射影坐标中的点,用射影坐标几何加法运算得到结果点,最后再把这个点的射影坐标转化为仿射坐标就可以了。

    libsecp256k1的坐标转换

    在libsecp256k1中就采用了从仿射坐标到射影坐标再到仿射坐标的过程。
    libsecp256k1采用的坐标就是Jacobian加重射影坐标。这个方法避开了扩展欧几里得算法求乘法逆元,大大提高了算法效率。

    同时注意,在secp256k1中定义椭圆曲线参数a=0,b=7,那么就可以得到Jacobian射影坐标中的secp256k1椭圆曲线方程: y 2 = x 3 + 7 z 6   y^2=x^3+7z^6\, y2x37z6同样地,把a=0代入到上面Jacobian加重射影坐标几何加法运算公式中,就可以得到secp256k1在射影坐标中的几何加法运算过程。

    展开全文
  • 仿射变换与齐次坐标

    千次阅读 2018-06-08 21:51:31
    仿射变换与齐次坐标October 12, 2011gcchengLeave a commentGo to comments仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到的基本概念。这篇文章主要讲述什么是...

    仿射变换与齐次坐标

    Affine Transformation仿射变换(Affine Transformation)和齐次坐标系(Homogeneous Coordinate)是计算机图形学中经常碰到的基本概念。这篇文章主要讲述什么是仿射变换和齐次坐标系,以及在图形系统中为什么要是用它们。不求全面,只为自己学习理解。

    仿射变换其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换。统一平移变换和线性变换的一种变换我们起了个名字叫“仿射变换”。这个新的变换就不再单纯的是两个线性空间的映射了,而是变成了两个仿射空间的映射关系。为了更好地理解仿射变换,首先就要知道线性变换以及它的不足。在未说明的情况下,下面使用的是卡迪尔坐标系。

    所谓线性变换是指两个线性空间的映射,一个变换\mathcal{L}:\mathcal{A}\to\mathcal{B}是线性变换,必须满足两个条件,也就是我们经常说的线性条件:

    L(u+v)=L(u)+L(v)      additivity

    L({\alpha}u)={alpha}L(u)      homogeneity

    举个例子说明一下。建设L是一个二维绕原点旋转变换,uv是旋转角度。我们知道“一次性旋转u+v度”和“先旋转u度再旋转v读”达到的效果是一样的;同样地,“一次性旋转{\alpha}u度”和“旋转{\alpha}次u度”也是一张的。

    线性变换可以用矩阵来表示。假设p=(x,y)^{T}是二维空间中的点,T是一线性变换,那么存在一个矩阵A,使得p'=(x',y')^{T}=T(p)=Ap。上面的旋转变换R,以及缩放S变换都有相应的变换矩阵

    \left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{cc} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \\ \end{array} } \right] \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]

    \left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{cc} S_x & 0 \\ 0 & S_y \\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ \end{array} } \right]

    但是在卡迪尔坐标系中,平移变换却不能用矩阵来表示。一个平移变换T具有如下的形式

    \left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=T(p)= I \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]+\left[ {\begin{array}{c} t_x \\ t_y \\ \end{array} } \right]

    我们可以很容易地验证,平移变换T是不能写成两个矩阵乘积形式的。使用齐次坐标系很好的解决了这个问题(可能还有其它的原因)。齐次坐标系统其实是用高维坐标来表示一个低维的点,就好比我们用(x,1)来表示一个长度值一样,其实用一个x就可以了,但是用高一维的表示,在有的时候会带来便利。一个N维的卡迪尔坐标系中的一个点p=(x_1,x_2,...,x_N),在齐次坐标系中有无数的N+1维点与之对应,这些点可以描述为p_H=(\omega x_1,\omega x_2,...,\omega x_N,\omega)\omega取不同的值,我们变得到齐次坐标系中不同的点。当把这些点映射到\omega=1平面(不改变x_i之间比例),我们又降维得到对应的卡迪尔坐标系中的点。在OpenGL中我们是用(x,y,z,1)(\omega=1)来表示一点三维的点,显然这个点与卡迪尔坐标系中的点(x,y,z)是一一对应的。在计算的过程中,会出现第四个分量不为\omega \neq 1的情况,这时我们也总是同除以\omega使齐次坐标正规化。现在回来让我们看看使用齐次坐标时,对应的线性变换是什么形式。假设p=(x,y,1)^{T}是二维点对应的齐次坐标,与上面使用卡迪尔坐标系类似,我们可以得到相应的线性变换如旋转变换R和缩放变换S的矩阵表示:

    \left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{ccc} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1\\\end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

    \left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{ccc} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

    容易验证, (x', y')的值并没有变化。但是使用齐次坐标后,平移操作便也可以使用矩阵来表示了(如下),平移量出现在变换矩阵的最右侧。

    \left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=T(p)= \left[ {\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

    最后,我们给出仿射变换稍微正式点的定义。一个仿射变换T,可以表示成一个线性变换A后平移tT(p)=Ap+t,其中p是待变换的点齐次坐标表示。T可以表示成如下的形式:

    \bf{T}=\left[ {\begin{array}{cccc} a_11&a_12&a_13&t_1\\ a_21&a_22&a_23&t_2\\ a_31&a32&a33&t_3\\ 0&0&0&1\\ \end{array}} \right]

    其中,\bf{A}=\left[ {\begin{array}{ccc} a_11&a_12&a_13\\ a_21&a_22&a_23\\ a_31&a32&a33\\ \end{array}} \right]表示线性变换;\bf{t}=\left[ {\begin{array}{c} t_1\\ t_2\\ t_3\\ \end{array}} \right]表示平移变换;右下角的数字可以进行整体缩放,当为1时,表示不进行整体缩放。

    仿射变换之所以重要,另一个重要的原因是仿射变换后不改变点的共线/共面性,而且还保持比例,这对图形系统尤其重要。例如,根据这个性质,如果我们要变换一个三角形,只需要对三个定点v1,v2,v3进行变换T就可以了,对于原先边v1v2上的点,变换后一定还在边后T(v1)T(v2)上。

    总结一下,仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。

    Advertisements

    展开全文
  • 在几何学中,坐标系是使用一个或多个数字或坐标来唯一确定点或其他几何元素在诸如欧几里得空间的流形上的位置的系统。坐标的顺序很重要,它们有时通过它们在有序元组中的位置来标识,有时通过字母标识,如“ x坐标”...
  • 理论性内容 1.1 世界坐标系(World coordinate system) 1.2 解剖坐标系(Anatomical coordinate system) 1.3 图像坐标系(Image coordinate system) 1.4 坐标系转换(图像坐标系到解剖坐标系) 1.4.1 理论 1.4.1 ...
  • 医学影像中的坐标系

    2022-03-30 00:31:10
    坐标系是一种识别点位置的方法。在医学界,成像应用中常用的坐标系有三种:全局坐标系、解剖学坐标系和医学图像坐标系
  • Slicer学习笔记(三十六)slicer坐标系1、坐标系统1.1、世界坐标系1.2、解剖坐标系1.3、图像坐标系1.4、图像变换1.5、二维示例或计算IJtoLS矩阵1.6、与其他软件/约定的关系1.7、参考 后面几篇博客以Slicer学习笔记...
  • ArcGIS——GIS中的坐标系

    万次阅读 多人点赞 2017-10-13 11:08:26
    从第一次上地图学的课开始,对GIS最基本的地图坐标系统就很迷。也难怪,我那时候并不是GIS专业的学生,仅仅是一门开卷考试的专业选修课,就没怎么在意。 等我真正接触到了各种空间数据产品,我才知道万里长征第一...
  • Unity 中的坐标系

    2020-04-24 14:37:45
    2、【OpenGL】02 - OpenGL中的坐标系 3、矩阵理论(这个是京东地址) 4、维基百科(文中的数学概念出处) 5、msdn mul 6、msdn matrix 7、unity shader lab built-in 8、nvidia bump map tutorial 9、...
  • 2. 建模坐标系:局部坐标系,独立于世界坐标系定义物体的几何特性 3. 观察坐标系:从观察者的角度对整个世界坐标系内的对象进行重定定位和描述,用于指定图形的输出范围 4. 设备坐标系:适合特定输出设备输出...
  • 图像坐标系、世界坐标系

    万次阅读 2016-11-22 14:02:20
    OpenCV学习笔记(十五)——摄像机的标定和3D重建calib3D ...这里研究生的摄像机模型都是针孔摄像机,摄像机的标定问题是CV领域的一个入门级的问题,初学摄像机标定时会被各种坐标系弄晕,这里再介绍一下, 常
  • 几何变换——关于透视变换和仿射变换以及齐次坐标系的讨论 2019/10/26 FesianXu 前言 在本文首先介绍了引入齐次坐标系的必要性,随后介绍了在几何变换中常见的投射变换和仿射变换,这俩种变换在计算机视觉问题中...
  • 图像坐标空间变换:仿射变换(Affine Transformation)

    千次阅读 多人点赞 2020-05-04 19:32:44
    文章目录仿射变换(Affine Transformation)简介仿射变换的基础类型恒等尺度旋转剪切水平剪切垂直剪切镜像平移仿射变换通式一个需要小心的坑:图像索引与坐标的关系求解仿射变换矩阵一种特殊的仿射变换及变换矩阵...
  • WebGIS开发过程中会遇到这样一种情况:需要使用OpenLayers加载一个未校准的CAD导出的位图;并且还需要通过经纬度坐标...由于从CAD导出的位图并不带有定位信息,所以需要通过仿射变换将图上的像素坐标转换到地理坐标...
  • 矩阵与坐标系的映射关系

    千次阅读 2020-01-01 11:53:00
    下图展示了矩阵和二维坐标系的关系,二维坐标系可以看成图像,把这种关系应用到图像变换,就得到图像处理的方式变换,应用到三维空间坐标中,就得到三维空间坐标系变换关系。 仿射变换 仿射变换主要包括平移变换、...
  • 三维空间中左右手坐标系的判定

    千次阅读 2016-08-30 17:18:03
    1.右手坐标系 在三维空间中,Z轴的正方向是由右手定则确定的,右手定则同时确定了个轴的正旋转方向。利用右手定则确定Z轴的正方向的步骤是: a.大拇指与食指呈垂直状态,大拇指指向X轴的正方向。 b.食指指向...
  • 只要涉及到地图开发,无论如何关于坐标系的概念是逃不掉的,谁让地球它是个球呢。
  • GeoTools是在java下的gis开源软件,以下介绍坐标转换的两种方法:投影转换和仿射变换投影转换这里以xian80经纬度坐标转xian80,3度分带 111中央经线平面坐标为例转换函数如下:1 Point pointXian80 = ...
  • PythonGDAL给图像设置投影坐标系

    千次阅读 2021-03-22 16:05:28
    网站上下载的部分遥感数据只有地理坐标,没有投影坐标,本文章尝试给“只有地理坐标的图片”添加投影坐标。 原始数据:山东地区ASTER GDEM30m数据,该数据只有WGS84地理坐标 目标数据:给该数据添加UTM-50N 1....
  • Apollo坐标系转换

    千次阅读 2019-09-18 11:49:37
    文章目录RFU和FLU的关系右-前-天坐标(RFU)前-左-天坐标(FLU)欧拉角Pitch、Yaw、Roll坐标系转换计算IMU转World示例代码IMU转FLU坐标系其他坐标转换rslidar-->FLUrslidar-->world参考文章矩阵旋转的讲解 RFU...
  • 本节从基础的欧式空间、投影空间、笛卡尔坐标、向量、矩阵、线性空间着手介绍,从向量空间的点和向量的表示法着手说明齐次坐标概念引入的过程,并介绍了齐次坐标的作用。
  • 先说一说什么叫齐次坐标系:能够明显的区分点与- 向量,并且便于计算机做图形处理时进行仿射变换的坐标系。 在欧式空间,两条平行线是不会相交的(可以想象成两条平行的光线)。但是,再想象一下或者我们经常看到的...
  • arcgis地理配准再定义投影即可给它加上原图的坐标系。 2.假设有上千张图片,可用Python和GDAL给图片加坐标系。 -实现思路 使用GDAL需要知道待投影图片的地理坐标信息、仿射矩阵参数。 仿射矩阵参数是干什么的?见...
  • 视觉和halcon软件中各坐标系的解释及原理 世界坐标系(刚性变换到)-----------相机坐标系 (外参R与t)
  • 由于当时的“一边倒”政治趋向,故我国采用了前苏联的克拉索夫斯基椭球参数,并与前苏联1942年坐标系进行联测,通过计算建立了我国大地坐标系,定名为1954年北京坐标系。因此,1954年北京坐标系可以认为是前苏联1942...
  • 图像坐标系转世界坐标系的方法

    千次阅读 2017-05-06 10:03:31
     为了定量地描述光学成像过程,我们首先定义以下几种坐标系:世界坐标系、摄像机坐标系、象平面坐标系和计算机图像坐标系。   世界坐标系也称真实或现实世界坐标系,即XYZ坐标系,它是客观世界的绝对坐标。一般...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,783
精华内容 1,913
热门标签
关键字:

仿射坐标系的定义