视觉图像坐标转换

1. 透镜成像

相机的镜头系统将三维场景中的光线聚焦到一个平面 (即传感器)。这个过程可以用小孔成像模型来近似描述,尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。

小孔成像模型: 假设有一个理想的小孔,光线通过小孔后在对面形成倒立的实像

在小孔成像模型中,物体到小孔的距离 Z Z Z、焦距 f f f(小孔到成像平面的距离)、物体的实际尺寸 Y Y Y 和 X X X 以及物体在成像平面上的投影尺寸 y y y 和 x x x 之间的关系如下:

Z f = Y y = X x \frac{Z}{f} = \frac{Y}{y} = \frac{X}{x} fZ=yY=xX

其中,

  • Z Z Z 是物体到小孔的距离。
  • f f f 是焦距(小孔到成像平面的距离)。
  • Y Y Y 和 X X X 是物体的实际尺寸。
  • y y y 和 x x x 是物体在成像平面上的投影尺寸

这个模型假设有一个理想的小孔,光线通过小孔后在对面形成倒立的实像。虽然现实中没有完全理想的小孔,但这个模型有助于理解基本原理。

2. 相机内参数

内参数描述了相机的内部几何特性,包括焦距、主点位置、像素比例等 。这些参数通常通过相机标定过程获得,并用于将三维空间中的点投影到二维图像平面上。

三种坐标系的变换

2.1 主要内参数
  1. 焦距(Focal Length)

    • 通常用 f x f_x fx 和 f y f_y fy 表示,分别对应X轴和Y轴方向上的焦距。
    • 焦距决定了相机的视角和放大倍数。
  2. 主点(Principal Point)

    • 通常用 c x c_x cx 和 c y c_y cy 表示,表示光轴与成像平面的交点,即图像中心的像素坐标。
  3. 畸变系数(Distortion Coefficients)

    • 包括径向畸变(Radial Distortion)和切向畸变(Tangential Distortion)系数。
    • 这些系数用于校正镜头引起的图像失真。
2.2 内参数矩阵

内参数通常以一个3x3的矩阵 K K K 表示:

K = f x 0 c x 0 f y c y 0 0 1 K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

其中:

  • f x f_x fx 和 f y f_y fy 是焦距(以像素为单位)。
  • c x c_x cx 和 c y c_y cy 是主点坐标(通常是图像中心)。
2.3 作用
  1. 投影变换:将三维空间中的点投影到二维图像平面上。
  2. 校正畸变:利用畸变系数校正图像中的失真现象,提高图像质量。

3. 外参数

外参数(Extrinsic Parameters)描述了相机相对于某个固定的世界坐标系的位置和姿态,包括旋转矩阵 R R R 和平移向量 t t t。 获取这些参数通常需要通过特定的方法或技术进行标定或估计。以下是几种常见的获取外参数的方法:

3.1 相机标定(Camera Calibration)

相机标定不仅用于获取内参数,还可以同时获得外参数 。常用的方法之一是使用已知几何结构的标定板(如棋盘格),通过多个视角拍摄标定板图像,然后利用这些图像来计算相机的内外参数

使用OpenCV进行相机标定

OpenCV 提供了一套完整的工具来进行相机标定,可以同时获取内参数和外参数。以下是一个简化的步骤说明:

  1. 准备标定板:使用一个已知尺寸的棋盘格作为标定板。
  2. 采集图像:从不同角度拍摄多张包含标定板的图像。
  3. 角点检测:在每张图像中找到棋盘格的角点位置。
  4. 标定过程:使用这些角点信息来计算相机的内外参数。
python 复制代码
import cv2
import numpy as np

def calibrate_camera(images, pattern_size=(9, 6)):
    """
    Calibrate the camera using a set of images with a known chessboard pattern.
    
    Parameters:
    - images: List of image paths containing the chessboard pattern.
    - pattern_size: Tuple (rows, cols) representing the number of inner corners per a chessboard row and column.
    
    Returns:
    - Intrinsic matrix K, distortion coefficients, rotation vectors, and translation vectors.
    """
    # Prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
    objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
    objp[:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1,2)

    # Arrays to store object points and image points from all the images.
    objpoints = []  # 3d point in real world space
    imgpoints = []  # 2d points in image plane.

    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # Find the chess board corners
        ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

        # If found, add object points, image points (after refining them)
        if ret == True:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
            imgpoints.append(corners2)

    # Perform camera calibration
    ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
    return K, dist, rvecs, tvecs

# Example usage
if __name__ == "__main__":
    # Camera calibration using chessboard images
    images = ["image1.jpg", "image2.jpg", "image3.jpg"]  # Replace with actual image paths
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    
    K, dist, rvecs, tvecs = calibrate_camera(images)
    print("Intrinsic matrix K:\n", K)
    print("Distortion coefficients:", dist)
    print("Rotation vectors:", rvecs)
    print("Translation vectors:", tvecs)
3.2 主要外参数
3.2.1旋转矩阵(Rotation Matrix)
  • 旋转矩阵:通常用 R 表示,是一个3x3的正交矩阵,描述了相机相对于世界坐标系的旋转角度。
3.2.2平移向量(Translation Vector)
  • 平移向量:通常用 t 表示,是一个3x1的向量,描述了相机相对于世界坐标系的平移距离。
3.3 外参数矩阵

外参数通常以一个4x4的齐次变换矩阵 T T T 表示:

T = R t 0 T 1 T = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix} T=R0Tt1

其中:

  • R R R 是旋转矩阵。
  • t 是平移向量。
  • 0 T 0^T 0T 是一个1x3的零向量。
3.3 作用
  1. 坐标变换:将三维世界坐标系中的点转换到相机坐标系中。
  2. 姿态估计:确定相机在世界坐标系中的位置和方向,常用于SLAM(同步定位与地图构建)、AR(增强现实)等应用。
相关推荐
格林威2 小时前
C# 相机图像阴影校正:使用OpenCvSharp实现工业相机阴影平场校正功能
人工智能·数码相机·opencv·计算机视觉·c#·机器视觉·工业相机
m0_739312873 小时前
自动驾驶SLAM基础:几何学与运动学全解析
人工智能·自动驾驶·几何学
qq_526099131 天前
单口图像采集卡:被低估的那块“桥“
数码相机
中科同志科技先进封装1 天前
真空炉温控模块更换深度解读:工艺流程与优化策略
人工智能·数码相机
格林威1 天前
C#图像夜间识别率提升:使用OpenCvSharp和Halcon融合DeepSORT实现复杂场景下准确识别
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
敢敢のwings1 天前
LingBot-Depth:把 RGB-D 相机的“缺测”变成可用的空间先验
数码相机
YOLO数据集集合2 天前
基准标记目标检测数据集 |基准标记 视觉定位 相机标定 目标检测 YOLO格式 深度学习数据集 计算机9038期
数码相机·yolo·目标检测·视觉定位·基准标定
BYSJMG2 天前
计算机毕设选题|基于大数据与文本挖掘的自动驾驶事故成因分析及可视化研究|Hadoop+PySpark+Django+Vue
大数据·hadoop·信息可视化·django·自动驾驶·kmeans·课程设计
浪里镖客3 天前
RM65B睿尔曼机械臂与realsense d4354i相机眼在手外的手眼标定
数码相机
长江后浪博客3 天前
陶瓷盘UV喷墨印刷中的Z轴高度测量与防碰撞技术方案
数码相机·uv·陶瓷盘uv打印·uv喷墨印刷·z轴测高·喷头防碰撞·激光位移传感器