OpenCV 的图像坐标系与我们在数学课上学到的标准笛卡尔坐标系有显著不同,这是初学者最容易混淆的地方。

简单来说,它的核心规则是:原点在左上角,X 轴向右,Y 轴向下。

下面为你详细拆解这个坐标系的构成,以及在不同场景下的使用方式。

🗺️ 核心坐标系:像素坐标系

这是你在 OpenCV 中进行图像操作时最常接触的坐标系。

  • 原点 (0, 0):位于图像的左上角
  • X 轴:水平方向,向右方向。
  • Y 轴:垂直方向,向下方向。
  • 单位:像素(pixel)。

你可以把它想象成一个表格或矩阵(与多维数组的下标一致)行号从上到下递增(对应 Y 轴),列号从左到右递增(对应 X 轴)。

易混淆点:坐标 (x, y) vs 数组索引 [y, x]

这是 OpenCV(尤其是 Python 接口)中最大的“坑”。你需要分清几何坐标数组索引的区别。

  • 几何坐标 (x, y)

    • 这是我们在调用绘图函数时使用的格式。
    • x 代表水平位置(列),y 代表垂直位置(行)。
    • 例如:cv2.circle(img, (50, 100), ...) 表示在 x=50, y=100 的位置画圆。
  • 数组索引 [y, x]

    • 这是我们在直接访问图像数据(NumPy 数组)时使用的格式。
    • OpenCV 图像是一个 (高度, 宽度, 通道) 的矩阵,访问顺序是“先行(行号代表高度Y)后列(列号代表长度X)”。
    • 例如:img[100, 50] 访问的是第 100 行、第 50 列的像素,对应的几何坐标正是 (x=50, y=100)

一句话总结:绘图用 (x, y),取数用 [y, x]这是由像素在内存中存储的格式决定的!!!

📐 其他坐标系

除了像素坐标系,在相机标定、3D 重建等高级应用中,你还会遇到以下两种坐标系:

坐标系名称 原点位置 单位 说明
图像物理坐标系 图像中心(主点) 毫米 (mm) 用于描述像素在成像平面上的物理位置。
相机坐标系 相机光心 毫米 (mm) 三维坐标系,用于描述物体相对于相机的空间位置。

对于绝大多数图像处理任务,你只需要掌握第一种像素坐标系即可。

💻 代码示例

下面这段代码清晰地展示了如何在这个坐标系中进行绘图和访问像素。

python

import cv2
import numpy as np

# 1. 创建一个 400x600 (高x宽) 的黑色图像
img = np.zeros((400, 600, 3), dtype=np.uint8)

# 2. 使用几何坐标 (x, y) 进行绘图
# 在 (x=100, y=50) 处画一个红色的圆
# 注意:这里传入的是 (x, y) 元组
cv2.circle(img, (100, 50), 20, (0, 0, 255), -1)

# 3. 使用数组索引 [y, x] 访问/修改像素
# 将 (x=100, y=50) 这个点的像素值设为蓝色
# 注意:这里使用的是 [y, x] 索引
img[50, 100] = [255, 0, 0]

# 4. 获取图像尺寸
height, width = img.shape[:2] # 高度对应 Y 轴,宽度对应 X 轴
print(f"图像尺寸:{width}x{height}")

cv2.imshow('Coordinate System', img)
cv2.waitKey(0)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐