arctan换算角度——Python实现

笛卡尔坐标系

对于平面坐标系,任一射线OP与x轴夹角θ的范围,可以取[0,2π)或者(-π,π],如无特殊说明, 我们统一使用后者。
将笛卡尔空间坐标系中的点 Pc = ( x , y , z ) 表示成球体坐标系中的形式 Ps = ( θ , ϕ , r )
球坐标
其中
球坐标定义
根据球坐标的定义,要求θ∈[−π,π],ϕ∈[−π/2,π/2] ,r∈[0 , +∞)
对于 θ,正切函数的周期是 π,因此反正切函数 arctan 一般也只取一个周期,其定义域是 R,值域是(−π/2 , π/2) 。为了解决这个问题,引入了 Arctan 函数,也就是 arctan2 函数。

arctan2定义

atan2 函数的使用 atan2(delta_y , delta_x)

import math
a = math.atan2(400,-692.820)
# 2.6179936760992044
angle = a/math.pi*180
# 149.99998843242386

atan 函数的使用 atan(delta_y / delta_x)

import math
delta_y = 400
delta_x = -692.820

if delta_x == 0:
    b = math.pi / 2.0
    angle = b/math.pi*180
    if delta_y == 0:
        angle = 0.0
    elif delta_y < 0:
        angle -= 180
else:
    b =  math.atan(delta_y/delta_x) 
    angle = b/math.pi*180
    if delta_y > 0 and delta_x < 0:
        angle = angle + 180
    if delta_y < 0 and delta_x < 0:
        angle = angle - 180

b,angle
# (-0.5235989774905888, 149.99998843242386)

atan 和 atan2 的异同

  1. 参数的个数不同
  2. 两者返回值都是弧度
  3. 如果 delta_x等于0,atan2依然可以计算,但是 atan 则需要提前判断,否则就会导致程序出错
  4. 象限的处理
    四象限

atan2(b,a)是4象限反正切,它的取值不仅取决于正切值b/a,还取决于点(b,a) 落入哪个象限:

  • 当点 (b,a) 落入第一象限(b>0, a>0)时,atan2(b,a)的范围是 0 ~ pi/2
  • 当点 (b,a)落入第二象限(b>0, a<0)时,atan2(b,a)的范围是 pi/2 ~ pi
  • 当点 (b,a)落入第三象限(b<0, a<0)时,atan2(b,a)的范围是 -pi~-pi/2
  • 当点 (b,a) 落入第四象限(b<0, a>0)时,atan2(b,a)的范围是 -pi/2~0

而 atan(b/a) 仅仅根据正切值为a/b求出对应的角度 (可以看作仅仅是2象限反正切):

  • 当 b/a > 0 时,atan(b/a)取值范围是 0 ~ pi/2
  • 当 b/a < 0 时,atan(b/a)取值范围是 -pi/2~0

取值范围

arctan2
二三象限角度

  • 点 (b,a) 落入第一象限 (b>0, a>0)第四象限(b<0, a>0)时,atan2(b,a) = atan(b/a)
  • 点 (b,a) 落入第二象限 (b>0, a<0),b/a<0,故atan(b/a)取值范围始终是 -pi/2~0,然而,atan2(b,a)的范围是 pi/2 ~ pi,故atan(b/a) 计算角度值要加180。
  • 点 (b,a) 落入第三象限(b<0, a<0) ,b/a>0,故 atan(b/a) 取值范围是 0 ~ pi/2,而此时atan2(b,a)的范围是 -pi~-pi/2,故atan(b/a) 计算角度值要减180。

结论: atan 和 atan2函数,建议用 atan2函数


参考文章:

  1. python中 math模块下 atan 和 atan2的区别
  2. Python中的弧度转化以及三角函数
  3. python 计算方位角实例(根据两点的坐标计算)
  4. Arctan的快速近似算法
  5. Numpy中arctan和arctan2的区别
  6. 四象限 Arctan 函数
  7. atan2相关知识汇总
### 空间坐标系中角度换算到二维框架角 在计算机视觉领域,从三维空间坐标系向二维图像平面投影的过程中涉及到多个变换矩阵的应用。当考虑将空间坐标系中的角度信息映射至二维框架内时,主要依赖于内外参数矩阵以及旋转和平移矢量。 #### 坐标系转换原理 为了实现这一目标,首先要理解不同坐标系之间的关系: - **世界坐标系**:用于描述场景内的实际位置。 - **相机坐标系**:以相机透镜的几何中心(光心)为原点建立起来的一个右手笛卡尔坐标体系,在此坐标下 Zc 轴沿相机视方向指向前方[Xc,Yc,Zc] 表达方式遵循特定规则[^1]。 接着是通过一系列线性代数运算完成由世界坐标系到相机坐标系再到最终图像坐标的转变过程。其中涉及到了两个重要的概念——内部参数和外部参数。 ##### 内部参数 这些参数反映了相机本身的属性,比如焦距 f、主点偏移 cx,cy 及像素比例因子 kx,ky 等因素共同决定了如何将真实世界的尺寸单位转化为图像平面上对应的像素值。具体来说就是构建了一个 3×3 的内参矩阵 K 来表征上述特性: ```matlab K = [fx 0 cx; 0 fy cy; 0 0 1]; ``` 此处 fx=f*kx,fy=f*ky 分别代表横向与纵向的有效焦距乘以各自的比例系数;cx 和 cy 则指定了光学中心相对于图像左上角的位置偏差。 ##### 外部参数 而外参部分则是用来刻画相机姿态变化情况下的相对位姿调整,即绕着某个固定参考点发生的旋转变换 R 加上整体移动 T 形成的整体刚体运动效果。一般会组合成一个增广形式如下所示: \[ \begin{bmatrix}R & t\\0&1\end{bmatrix}\] 这里 R 是个标准正交阵表达了纯旋转成分,t 向量记录了平移分量的信息。 #### 角度换算方法 假设给定一条位于三维空间里的直线 L 定义了一组基底 {n,d}, 其中 n=(nx,ny,nz)^T 属于单位法向量指示该直线的方向,d=[dx,dy,dz]^T 描述起点坐标,则任意一点 P(x,y,z) 若满足方程 nx*(x-dx)+ny*(y-dy)+nz*(z-dz)=0 即可断言其落在指定直线上面。现在想要知道这条直线投射下来之后跟屏幕 X 或者 Y 方向上形成的夹角 θ ,那么就需要先求解出它所对应的那个斜率 m=-nx/ny (如果 ny=0 需要特殊处理),进而利用反正切函数 arctan(m) 得到最后的结果θ=arctan(-nx/ny)[^5]. 另外值得注意的是由于存在透视效应的影响,远近不同的两点即使原本平行也会呈现出汇聚的趋势,所以在某些情况下可能还需要引入额外校准手段消除这种失真现象带来的误差影响。 #### 示例代码展示 下面给出一段简单的 Python 代码片段作为例子说明如何基于 OpenCV 库执行基本的空间坐标转二维的操作流程: ```python import cv2 import numpy as np def project_3dto2d(points_3D, camera_matrix, rvec, tvec): points_2D, _ = cv2.projectPoints(points_3D, rvec, tvec, camera_matrix, None) return points_2D.reshape((-1, 2)) # Example usage: camera_matrix = np.array([[800., 0., 320.], [0., 800., 240.], [0., 0., 1.]]) rvec = np.zeros((3, 1)) # Rotation vector (identity rotation) tvec = np.zeros((3, 1)) # Translation vector (no translation) points_world = np.float32([[-1,-1,0], [-1,1,0],[-1,1,2],[1,1,2]]) image_points = project_3dto2d(points_world, camera_matrix, rvec, tvec) print(image_points) ``` 这段程序实现了从几个预定义的世界坐标点出发,经过仿射变换后获得它们在虚拟摄像头拍摄所得图片里应有的确切落脚之处的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值