• Camera Calibration 相机标定


    Camera Calibration 相机标定

    一、相机标定方法

    在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc)、相机外参矩阵(R t)以及畸变矩阵。

    标定的步骤如下:

    1. 准备棋盘格,棋盘格图片可以自行打印,以下使用10*7方格的棋盘格,交点则为9*6,棋盘格的大小1mm,即 gridsize=1

    2. 拍照,拍照的原则是多角度,根据理论至少要两种角度的拍照,实际中通常会拍20张左右;

    3. 使用opencv提供的角点检测函数findChessboardCorners找到棋盘格中的角点,并将每幅图片的角点值存放到list中,同时将棋盘格的角点的三维坐标存放到另一个list。

    4. 使用calibrateCamera函数获取内存矩阵、畸变矩阵、旋转矩阵以及转移矩阵。

    5.使用undistort函数将畸变的图像进行校正并查看校正后的图片效果。

    6. 代码如下(opencv_3.4.3):

    #!/usr/bin/env python3

    # -*- coding: utf-8 -*-

     

    import numpy as np

    import cv2

     

    #图片角点个数

    objp_dict = {

        1: (9, 5),

        2: (9, 6),

        3: (9, 6),

        4: (9, 6),

        5: (9, 6),

        6: (9, 6),

        7: (9, 6),

        8: (9, 6),

        9: (9, 6),

        10: (9, 6),

        11: (9, 6),

        12: (9, 6),

        13: (9, 6),

        14: (9, 6),

        15: (9, 6),

        16: (9, 6),

        18: (9, 6),

        17: (9, 6),

        19: (9, 6),

        20: (9, 6),

    }

     

    objp_list = []

    corners_list = []

     

    for k in objp_dict:

        nx, ny = objp_dict[k]

       

        # Prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) gridsize=1(mm)

        objp = np.zeros((nx*ny,3), np.float32)

        #生成角点的三维坐标

        objp[:,:2] = np.mgrid[0:nx, 0:ny].T.reshape(-1,2)

        # Make a list of calibration images

        fname = 'camera_cal/calibration%s.jpg' % str(k)

        img = cv2.imread(fname)

     

        # Convert to grayscale

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

     

        # Find the chessboard corners

        ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None)

     

        # If found, save & draw corners

        if ret == True:

            # Save object points and corresponding corners

            objp_list.append(objp)

            corners_list.append(corners)

            # Draw and display the corners

            #cv2.drawChessboardCorners(img, (nx, ny), corners, ret)

            #plt.imshow(img)

            #plt.show()

            #print('Found corners for %s' % fname)

        else:

            print('Warning: ret = %s for %s' % (ret, fname))

               

    img = cv2.imread('camera_cal/calibration1.jpg')

    img_size = (img.shape[1], img.shape[0])

    '''

    mtx : 内参矩阵

    dist: 畸变矩阵

    rvecs : 旋转矩阵

    tvecs : 转移矩阵

    '''

    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objp_list, corners_list, img_size,None,None)

     

    #将原始图片转换成未发生畸变的图片

    dst = cv2.undistort(img, mtx, dist, None, mtx)

    com_img = np.hstack((img, dst))

    cv2.namedWindow('image', cv2.WINDOW_NORMAL)

    cv2.imshow('image', com_img)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    二、 什么是相机标定(What is Camera Calibration?)

    找到影响图像成像过程的内部相机参数:

    图像中心(不是width/2, height/2)

    焦距长度

    行像素和列像素的比例因子

     

     扭曲factor

     

     镜片扭曲

     

     三、动机

    Camera Calibration 用于

    重构真实世界模型:Virtual L.A. project

    与世界交互:e.g.机器人

     

      如上图所示,估计红色与蓝色两个点的几何投影

    四、 图像的行列比例(Scaling of Rows and Columns in Image)

    相机像素不是完全符合正方形

    相机输出可能模糊为近似值(NTSC)

    图像可能从数据卡上获得 ·A/D转换器采样NTSC信号

    相机->NTSC信号->转换为数字信号->显示器上显示

     

     五、 混合透镜成像(Compound Lens Imaging)

    单透镜系统在其周围部分会造成图像扭曲(image distort)

    混合透镜可以用于减少彩色效应和针垫效应

     

    普通摄像机的相机图像平面

     

     对同样的摄像机(pinhole camera),相机图像平面(camera image plane)不同

    六、相机标定目标

    将所拍摄图像在三维坐标系中找到对应位置

     

  • 相关阅读:
    Asp.Net细节性问题精萃(转)
    开发OFFICE插件总结(转)
    校内网开心网数据同步引发的讨论(转)
    C++指针探讨 (三) 成员函数指针 (转)
    C++指针探讨 (二) 函数指针 (转)
    【原创】编程获取PE文件信息的方法(转)
    为.net开发者提供的一份关于存储过程的评论(转)
    C++指针探讨 (一)数据指针 (转)
    如何批量修改PPT字体、大小、颜色(转)
    搜索引擎里的爱人(转)
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/12733240.html
Copyright © 2020-2023  润新知