相机标定

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。本实训主要介绍张正友相机标定方法,实训通过知识讲解与具体实践相结合的方式,帮助理解该相机标定法的基本原理与操作。

第1关:坐标变换及角点检测

import cv2
import numpy as np

def task1():

    fname = '/data/workspace/myshixun/task1/5test1.jpg'
    # criteria:角点精准化迭代过程的终止条件
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    objp = np.zeros((7*7,3), np.float32)
    '''
    设定世界坐标下点的坐标值,因为用的是棋盘可以直接按网格取;
    假定棋盘正好在x-y平面上,这样z值直接取0,简化初始化步骤。
    mgrid把列向量[0:cbraw]复制了cbcol列,把行向量[0:cbcol]复制了cbraw行。
    转置reshape后,每行都是4×6网格中的某个点的坐标。
    '''
    objp[:,:2] = np.mgrid[0:7,0:7].T.reshape(-1,2)

    objpoints = [] # 3d point in real world space
    imgpoints = [] # 2d points in image plane.

    # 识别出角点,记录世界物体坐标和图像坐标
    img = cv2.imread(fname) #source image
    cv2.imwrite('/data/workspace/myshixun/task1/out/5test1.png', img)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转灰度
    # 寻找角点,存入corners,ret是找到角点的flag
    ########## Begin ##########
    ret,corners = cv2.findChessboardCorners(gray,(7,7),None)

    ########## End ##########

    if ret == True:
        objpoints.append(objp)
        # 执行亚像素级角点检测
        ########## Begin ##########
        corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        
        ########## End ##########
        
        imgpoints.append(corners2)
        # 在棋盘上绘制角点
        img = cv2.drawChessboardCorners(img,(7,7),corners2,ret)
        # 保存图像
        filepath = '/data/workspace/myshixun/task1/'
        cv2.imwrite(filepath + 'out/img.png', img)

第2关:相机标定

import cv2
import numpy as np

def calb():
    #criteria:角点精准化迭代过程的终止条件
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

    objp = np.zeros((7*7,3), np.float32)
    '''
    设定世界坐标下点的坐标值,因为用的是棋盘可以直接按网格取;
    假定棋盘正好在x-y平面上,这样z值直接取0,简化初始化步骤。
    mgrid把列向量[0:cbraw]复制了cbcol列,把行向量[0:cbcol]复制了cbraw行。
    转置reshape后,每行都是4×6网格中的某个点的坐标。
    '''
    objp[:,:2] = np.mgrid[0:7,0:7].T.reshape(-1,2)

    objpoints = [] # 3d point in real world space
    imgpoints = [] # 2d points in image plane.

    fname = "/data/workspace/myshixun/task2/5test1.jpg"
    #识别出角点,记录世界物体坐标和图像坐标
    img = cv2.imread(fname) #source image
    cv2.imwrite('/data/workspace/myshixun/task2/out/5test1.png', img)

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #转灰度
    #寻找角点,存入corners,ret是找到角点的flag
    ret, corners = cv2.findChessboardCorners(gray,(7,7),None)


    if ret == True:
         objpoints.append(objp)
         #执行亚像素级角点检测
         corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
         imgpoints.append(corners2)
         #在棋盘上绘制角点,只是可视化工具
         img = cv2.drawChessboardCorners(img,(7,7),corners2,ret)

    '''
    传入所有图片各自角点的三维、二维坐标,相机标定。
    每张图片都有自己的旋转和平移矩阵,但是相机内参和畸变系数只有一组。
    mtx,相机内参;dist,畸变系数;revcs,旋转矩阵;tvecs,平移矩阵。
    '''
    ########## Begin ##########
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
    ########## End ##########
    h,w = img.shape[:2]
    '''
    优化相机内参(camera matrix),这一步可选。
    参数1表示保留所有像素点,同时可能引入黑色像素,
    设为0表示尽可能裁剪不想要的像素,这是个scale,0-1都可以取。
    '''
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
    #纠正畸变
    ########## Begin ##########
    dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
    ########## End ##########
    #这步只是输出纠正畸变以后的图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    cv2.imwrite('/data/workspace/myshixun/task2/out/calibresult.png',dst)

大家需要平台上的实验答案,可以留言,博主尽量帮助你们分享!!!!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值