简单理解opencv中的坐标系,x,y,h,w

OpenCV中的图像坐标原点在左上角,x轴向右,y轴向下。矩形函数如cv2.rectangle()的坐标参数遵循此规则。而在numpy数组中访问像素时,行优先,即(img[y,x]),与OpenCV的坐标顺序相反。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在查阅opencv有关的技术文章时,经常能够看到如下风格的函数头:

cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), color, 2)

那么这里的x究竟是指图像从左往右数,还是从上往下数呢?

这里直接给出结论:在图片img上画矩形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向:

在这里插入图片描述


上面介绍的是x,y的概念。那么height,width又是什么情况呢?考虑如下代码:

import numpy as np
import cv2

img = np.zeros([100, 500])
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows() 

其创建的为高100,宽500的图像(100行,500列的像素矩阵)。因此,以下代码:

img[50, 250]

访问的是第50行,第250列的像素,即opencv坐标系中的(x = 250, y = 50)。

仔细思考容易发现,二维矩阵的第50行在opencv坐标系中对应的是y=50,而非x=50。


总结,使用cv2中的有关函数时,里面的x,y按照上面说的坐标轴来算;而如果自己手工直接访问图像numpy数组,那么此时的顺序与opencv中的xy顺序是对调的,需要按照矩阵原生的行列规则来。

### OpenCV 中相机坐标系解释 #### 定义与特性 在计机视觉领域,尤其是使用OpenCV处理图像时,理解不同的坐标系至关重要。对于相机坐标系而言,在这个坐标系中,原点通常位于相机的光心处,即相机镜头的中心位置[^4]。具体来说: - **Z轴**:沿着相机的视轴方向延伸,指向远离相机的方向; - **X轴和Y轴**:定义了成像平面内的两个正交方向,遵循右手定则。 这些轴构成了一个三维直角坐标系统,用于描述场景内各物体相对相机的具体方位以及距离信息。 #### 坐标转换过程 当涉及到实际操作时,往往需要将在世界坐标系下表达的空间点映射至对应的图像平面上形成投影点。此过程中会经历如下几个阶段的变化: 1. 将目标点的世界坐标\( P_w \)通过刚体变换(包括旋转和平移)转化为其在当前时刻所对应相机坐标系下的新位置 \( P_c \)[^2]。 这里涉及到了旋转矩阵 \( R \) 和平移向量 \( T \),它们共同决定了如何把全局参照框架里的数据调整适应于特定视角下的局部环境之中。 2. 接着利用针孔模型原理完成从3D到2D坐标的降维投射工作,最终获得该特征点落在感光元件上的确切位置 (u,v) ,也就是常说的像素坐标[^5]。 #### 应用实例展示 为了更好地说明上述理论概念的应用方式,下面给出一段简单Python代码片段作为示范,它展示了怎样借助`cv2.calibrateCamera()`函数来进行多张棋盘格图案照片的同时校准作业,并从中提取出内外参等重要参数值[^3]。 ```python import numpy as np import cv2 def calibrate_camera(images, pattern_size=(9, 6)): objp = np.zeros((np.prod(pattern_size), 3), dtype=np.float32) objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) object_points = [] image_points = [] criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) for img in images: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret: refined_corners = cv2.cornerSubPix( gray, corners, (11, 11), (-1, -1), criteria ) object_points.append(objp) image_points.append(refined_corners) h, w = gray.shape[:2] _, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, (w,h), None, None) return { 'camera_matrix': mtx, 'distortion_coefficients': dist, 'rotation_vectors': rvecs, 'translation_vectors': tvecs } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值