精华内容
下载资源
问答
  • 2022-02-09 15:54:07

    Python代码

    import cv2
    import numpy as np
    
    # 定义棋盘格的尺寸
    size = 140
    # 定义标定板尺寸
    boardx = size * 10
    boardy = size * 7
    
    canvas = np.zeros((boardy, boardx, 1), np.uint8) # 创建画布
    for i in range(0, boardx):
        for j in range(0, boardy):
            if (int(i/size) + int(j/size)) % 2 != 0: # 判定是否为奇数格
                canvas[j, i] = 255
    cv2.imwrite("E:/studying/chessboard.png", canvas)
    
    

    样图
    在这里插入图片描述
    以上述为例,导出后像素分辨率为1400*980,为得到固定尺寸(cm)的图像,我们再将其导入PhotoShop加工。
    菜单栏中选择:图像——图像大小,勾选约束比例及缩放样式,再调节宽度或高度。
    在这里插入图片描述
    例如设置宽度为20,则实际每个棋盘格的边长大小为2cm。

    更多相关内容
  • 棋盘格标定

    千次阅读 2020-04-07 21:52:04
    相机标定是我们相机拍摄的物体都处于三维世界坐标系中,而相机拍摄成像时把三维相机坐标系向二维图像坐标系转换。不同镜头成像时的转换矩阵不同可能引入失真,标定的作用是近似地估算出转换矩阵和失真系数。为了估算...

    一、原理

    相机标定是我们相机拍摄的物体都处于三维世界坐标系中,而相机拍摄成像时把三维相机坐标系向二维图像坐标系转换。不同镜头成像时的转换矩阵不同可能引入失真,标定的作用是近似地估算出转换矩阵和失真系数。为了估算,需要知道若干点的三维世界坐标系中的坐标和二维图像坐标系中的坐标。传统的照相机标定方法是通过世界坐标集(Xi,Yi,Zi),以及它们在图像平面上的投影坐标集(ui,vi),计算相机投影矩阵M中的 11个未知参数,需要严格个出三个两两互相垂直的平面来做标定(条件较为严格,一般情况难以实现)。而棋盘标定只需要两个平面,只需要黑白格子相交的角点来标记会比原始标定容易许多。总而言之棋盘标定的意义就在于克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。

    二、相机参数

    2.1计算单应性矩阵H

    根据之前博客介绍的摄像机模型,设三维世界坐标的点为X=[X,Y,Z,1]TX=[X,Y,Z,1]T,二维相机平面像素坐标为m=[u,v,1]Tm=[u,v,1]T,所以标定用的棋盘格平面到图像平面的单应性关系为:
    s0m=K[R,T]X
    其中s为尺度因子,K为摄像机内参数,R为旋转矩阵,T为平移向量。令
    在这里插入图片描述

    注意,s对于齐次坐标来说,不会改变齐次坐标值。张氏标定法中,将世界坐标系狗仔在棋盘格平面上,令棋盘格平面为Z=0的平面。则可得
    在这里插入图片描述

    我们把K[r1, r2, t]叫做单应性矩阵H,即

    在这里插入图片描述
    H是一个齐次矩阵,所以有8个未知数,至少需要8个方程,每对对应点能提供两个方程,所以至少需要四个对应点,就可以算出世界平面到图像平面的单应性矩阵H。

    2.2计算内参数矩阵

    由上式可得
    在这里插入图片描述
    由于旋转矩阵是个酉矩阵,r1和r2正交,可得
    在这里插入图片描述
    代入可得:

    在这里插入图片描述
    每个单应性矩阵能提供两个方程,而内参数矩阵包含5个参数,要求解,至少需要3个单应性矩阵。为了得到三个不同的单应性矩阵,我们使用至少三幅棋盘格平面的图片进行标定。通过改变相机与标定板之间的相对位置来得到三个不同的图片。为了方便计算,定义如下:
    在这里插入图片描述
    可以看到,B是一个对称阵,所以B的有效元素为六个,让这六个元素写成向量b,即
    在这里插入图片描述
    可以推导得到
    在这里插入图片描述
    利用约束条件可以得到:
    在这里插入图片描述
    通过上式,我们至少需要三幅包含棋盘格的图像,可以计算得到B,然后通过cholesky分解,得到相机的内参数矩阵K。

    2.3计算外参数矩阵

    由之前的推导,可得
    在这里插入图片描述

    三、代码及实现

    3.1代码

    # coding=utf-8
    import numpy as np
    import cv2
    import glob
    # 终止标准
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    #w = 7
    #h = 7
    #准备对象点,如(0,0,0),(1,0,0),(2,0,0)......,(6,5,0)
    #objp = np.zeros((w*h,3), np.float32)
    objp = np.zeros((7*7,3), np.float32)
    objp[:,:2] = np.mgrid[0:7,0:7].T.reshape(-1,2)
    
    # 用于存储所有图像中的对象点和图像点的数组。
    objpoints = [] # 在现实世界空间的3d点
    imgpoints = [] # 图像平面中的2d点。
    #glob是个文件名管理工具
    images = glob.glob('C:/Users/jxtx/计算机视觉/4/*.jpg')
    print('...loading')
    for fname in images:
        #对每张图片,识别出角点,记录世界物体坐标和图像坐标
        print('processing img:{fname}')
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰度
        print('grayed')
        #寻找角点,存入corners,ret是找到角点的flag
        #ret, corners = cv2.findChessboardCorners(gray, (w, h),None)
        ret, corners = cv2.findChessboardCorners(gray, (7, 7),None)
    
        # 如果找到,添加对象点,图像点(精炼后)
        if ret == True:
            print('chessboard detected')
            objpoints.append(objp)
            #执行亚像素级角点检测
            corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
            imgpoints.append(corners2)
    
            # 绘制并显示角点
            #img = cv2.drawChessboardCorners(img, (w,h), corners2,ret)
            img = cv2.drawChessboardCorners(img, (7,7), corners2,ret)
            cv2.namedWindow('img',0)
            cv2.resizeWindow('img', 500, 500)
            cv2.imshow('img',img)
            cv2.waitKey(500)
            cv2.destroyAllWindows()
    '''
    传入所有图片各自角点的三维、二维坐标,相机标定。
    每张图片都有自己的旋转和平移矩阵,但是相机内参和畸变系数只有一组。
    mtx,相机内参;dist,畸变系数;revcs,旋转矩阵;tvecs,平移矩阵。
    '''
    
    img2 = cv2.imread("C:/Users/13799/PycharmProjects/untitled1/test/1.jpg")
    print("type objpoints:{objpoints[0].shape}")
    print("type imgpoints:{imgpoints[0].shape}")
    
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
    h,  w = img2.shape[:2]
    
    
    '''
    优化相机内参(camera matrix),这一步可选。
    参数1表示保留所有像素点,同时可能引入黑色像素,
    设为0表示尽可能裁剪不想要的像素,这是个scale,0-1都可以取。
    '''
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
    #纠正畸变
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    
    # 裁剪图像,输出纠正畸变以后的图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    cv2.imwrite('calibresult.png',dst)
    
    #打印我们要求的两个矩阵参数
    print ("newcameramtx外参:\n",newcameramtx)
    print ("dist畸变值:\n",dist)
    print ("newcameramtx旋转(向量)外参:\n",rvecs)
    print ("dist平移(向量)外参:\n",tvecs)
    #计算误差
    tot_error = 0
    for i in range(len(objpoints)):
        imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
        error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
        tot_error += error
    
    print ("total error: ", tot_error/len(objpoints))
    
    
    

    3.2图片集

    在这里插入图片描述

    3.3结果展示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    四、出现的错误及解决

    在这里插入图片描述
    将 print’processing img:{fname}'改成print(‘processing img:{fname}’)

    展开全文
  • 计算机视觉-棋盘格标定

    千次阅读 2021-05-23 10:49:19
    一般来说,标定的过程分为两部分: 第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数; 第二部是从相机坐标系

    1:相机标定

    1.1原理介绍

    相机标定指建立相机图像像素位置与场景点位置之间的关系,根据相机成像模型,由特征点在图像中坐标与世界坐标的对应关系,求解相机模型的参数。相机需要标定的模型参数包括内部参数和外部参数。

    针孔相机成像原理其实就是利用投影将真实的三维世界坐标转换到二维的相机坐标上去,其模型示意图如下图所示:
    在这里插入图片描述
    一般来说,标定的过程分为两个部分:
    第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数;
    第二部是从相机坐标系转为成像平面坐标系(像素坐标系),这一步是三维点到二维点的转换,包括K(相机内参,是对相机物理特性的近似)等参数;
    投影矩阵 : P=K [ R | t ] 是一个3×4矩阵,混合了内参和外参而成。

    1.2相机标定的意义

    (1)一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变;
    (2)另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构出三维场景。具体来说:当我们用摄像机拍照时,从照片里得到一些空间信息(比如距离,尺寸等),是要利用二维图像得到三维信息。我们拍照的时候把空间物体信息通过摄像机变成了二维图像,这个过程本来是不可逆的。但如果我们可以找到一个摄像机的数学模型,就可以 :从二维图像+模型逆推得到原来三维信息。标定就是在找这个模型。
    在这里插入图片描述
    1.3相机标定的作用:
    1)相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;
    在这里插入图片描述
    (2)根据相机成像的几何模型,将世界坐标系中的3D物体映射到2D成像平面上;
    (3)求解多个相机对之间的映射关系。

    2:相机标定步骤

    1、打印一张模板并贴在一个平面上;
    2、从不同角度拍摄若干张模板图像;
    3、检测出图像中的特征点;
    4、求出摄像机的外参数(单应性矩阵)和内参数(最大似然估计)
    5、求出畸变系数;
    6、优化求精。

    3:进行实验

    实验素材:

    在这里插入图片描述

    代码:

    
    import cv2
    import numpy as np
    import glob
    
    # 找棋盘格角点
    # 阈值
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    #棋盘格模板规格
    w = 9   #内角点个数,内角点是和其他格子连着的点
    h = 6
    
    # 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
    objp = np.zeros((w*h,3), np.float32)
    objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
    # 储存棋盘格角点的世界坐标和图像坐标对
    objpoints = [] # 在世界坐标系中的三维点
    imgpoints = [] # 在图像平面的二维点
    
    images = glob.glob('C:/Users/samz305s/Desktop/sy/*.jpg')
    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        # 找到棋盘格角点
        # 棋盘图像(8位灰度或彩色图像)  棋盘尺寸  存放角点的位置
        ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
        # 如果找到足够点对,将其存储起来
        if ret == True:
            # 角点精确检测
            # 输入图像 角点初始坐标 搜索窗口为2*winsize+1 死区 求角点的迭代终止条件
            cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
            objpoints.append(objp)
            imgpoints.append(corners)
            # 将角点在图像上显示
            cv2.drawChessboardCorners(img, (w,h), corners, ret)
            cv2.imshow('findCorners',img)
            cv2.waitKey(1000)
    cv2.destroyAllWindows()
    #标定、去畸变
    # 输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
    # 输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
    # mtx:内参数矩阵
    # dist:畸变系数
    # rvecs:旋转向量 (外参数)
    # tvecs :平移向量 (外参数)
    print (("ret:"),ret)
    print (("mtx:\n"),mtx)        # 内参数矩阵
    print (("dist:\n"),dist)      # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
    print (("rvecs:\n"),rvecs)    # 旋转向量  # 外参数
    print (("tvecs:\n"),tvecs)    # 平移向量  # 外参数
    # 去畸变
    img2 = cv2.imread('C:/Users/samz305s/Desktop/sy/5.jpg')
    h,w = img2.shape[:2]
    # 我们已经得到了相机内参和畸变系数,在将图像去畸变之前,
    # 我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,
    # 通过设定自由自由比例因子alpha。当alpha设为0的时候,
    # 将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;
    # 当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数
    
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    # 根据前面ROI区域裁剪图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    cv2.imwrite('calibresult.jpg',dst)
    
    # 反投影误差
    # 通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。
    # 通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,
    # 然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。
    total_error = 0
    for i in range(len(objpoints)):
        imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
        error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
        total_error += error
    print (("total error: "), total_error/len(objpoints))
    
    
    

    实验结果:

    在这里插入图片描述
    在这里插入图片描述
    修正后的图片
    在这里插入图片描述
    修正前的图片
    在这里插入图片描述

    4:总结与问题:

    1出现的错误:

    Traceback (most recent call last):
      File "C:/Users/samz305s/PycharmProjects/jsjsj-sy5/sy.py", line 45, in <module>
        ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
    cv2.error: OpenCV(4.5.2) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-vi271kac\opencv\modules\calib3d\src\calibration.cpp:3694: error: (-215:Assertion failed) nimages > 0 in function 'cv::calibrateCameraRO'
    
    Process finished with exit code 1
    

    该错误主要由(-215:Assertion failed) nimages > 0 in function 来说明
    原因:
    程序没有检测到包含棋盘格的图片或者图片模糊等问题,导致查找棋盘格角点失败
    解决办法:
    重新拍图片,保持图片的清晰程度以及平整度

    展开全文
  • 在大多数条件下这些参数必须通过实验与计算才能得到,这求解参数的过程就称之为相机标定(或摄像机标定)。 无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及..


    原理解析

    相机标定

    在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。

    无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。

    算法流程

    (1)打印一张棋盘方格图并贴在一个平面上
    (2)从不同角度拍摄若干张模板图像
    (3)检测出图像中的特征点
    (4)由检测到的特征点计算出每幅图像中的平面投影矩阵H
    (5)确定出摄像机的参数

    计算单应性矩阵H

    单应性:在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先确定,图像平面与标定物棋盘格平面的单应性。

    单应性:在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先确定,图像平面与标定物棋盘格平面的单应性。

    设三维世界坐标的点为
    在这里插入图片描述

    二维相机平面像素坐标为

    在这里插入图片描述

    所以标定用的棋盘格平面到图像平面的单应性关系为:
    在这里插入图片描述

    (其中,K为相机的内参矩阵,R为外部参数矩阵(旋转矩阵),T为平移向量。令

    在这里插入图片描述

    设棋盘格位于Z=0的平面,定义旋转矩阵R的第i列为 ri, 则有:
    在这里插入图片描述

    于是空间到图像的映射可改为:H=λK[r1 r2 t]
    其中H 是描述Homographic矩阵,可通过最小二乘,从角点世界坐标到图像坐标的关系求解。

    计算内参数矩阵

    根据步骤1中的式子,令 H 为 H = [h1 h2 h3],则 [h1 h2 h3]=λK[r1 r2 t],再根据正交和归一化的约束可以得到等式:

    在这里插入图片描述
    即每个单应性矩阵能提供两个方程,而内参数矩阵包含5个参数,要求解,至少需要3个单应性矩阵。为了得到三个不同的单应性矩阵,我们使用至少三幅棋盘格平面的图片进行标定。通过改变相机与标定板之间的相对位置来得到三个不同的图片。为了方便计算,我们定义:

    在这里插入图片描述
    B 中的未知量可表示为6D 向量 b,在这里插入图片描述
    设H中的第i列为 hi,在这里插入图片描述,根据b的定义,可以推导出公式在这里插入图片描述,在这里插入图片描述,

    最后推导出:

    在这里插入图片描述
    通过上式,我们可知当观测平面 n ≥ 3 时,即至少3幅棋盘格图像,可以得到b的唯一解,求得相机内参数矩阵K。

    计算外参数矩阵

    外部参数可通过Homography求解,由 H = [h1 h2 h3] = λA[r1 r2 t],可推出:
    在这里插入图片描述

    最大似然估计

    上述的推导结果是基于理想情况下而言,但由于可能存在一些其他干扰,所以使用最大似然估计进行优化。假设拍摄了n张棋盘格图像,每张图像有m个角点。最终获得的最大似然估计公式为:

    在这里插入图片描述

    代码测试

    import cv2
    import numpy as np
    import glob
     
    # 找棋盘格角点
    # 棋盘格模板规格(内角点个数,内角点是和其他格子连着的点,10 X 7)
    w = 10
    h = 7
     
    # 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
    objp = np.zeros((w * h, 3), np.float32)
    objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)
     
    # 储存棋盘格角点的世界坐标和图像坐标对
    objpoints = []  # 在世界坐标系中的三维点
    imgpoints = []  # 在图像平面的二维点
     
    # 标定所用图像(路径不能有中文)
    images = glob.glob('D:\\python\\whh\\pycharmproject\\img_qipan\\*.jpg')  
     
    size = tuple()
    for fname in images:
        img = cv2.imread(fname)
     
        # 修改图像尺寸,参数依次为:输出图像,尺寸,沿x轴,y轴的缩放系数,INTER_AREA在缩小图像时效果较好
        # img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
     
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 转灰度
        size = gray.shape[::-1]                        # 矩阵转置
     
        # 找到棋盘格角点
        # 棋盘图像(8位灰度或彩色图像)  棋盘尺寸  存放角点的位置
        ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
     
        # 角点精确检测
        # criteria:角点精准化迭代过程的终止条件(阈值)
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
     
        # 执行亚像素级角点检测
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
     
        objpoints.append(objp)
        imgpoints.append(corners2)
     
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w, h), corners2, ret)
        cv2.imshow('findCorners', img)
        cv2.waitKey(1000)
     
    """
    标定、去畸变:
    输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
    输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
    """
     
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, size, None, None)
     
    # mtx:内参数矩阵
    # dist:畸变系数
    # rvecs:旋转向量 (外参数)
    # tvecs :平移向量 (外参数)
    print("ret:", ret)
    print("内参数矩阵:\n", mtx,'\n')
    print("畸变系数:\n", dist,'\n')
    print("旋转向量(外参数):\n", rvecs,'\n')
    print("平移向量(外参数):\n", tvecs,'\n')
     
    # 去畸变
    img2 = cv2.imread('D:\\python\\RRJ\\pycharmproject\\img_qipan\\03.jpg')
    h, w = img2.shape[:2]
     
     
    # 我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,
    # 通过设定自由自由比例因子alpha。当alpha设为0的时候,
    # 将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;
    # 当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉
    newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 0, (w, h))  # 自由比例参数
     
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    # 根据前面ROI区域裁剪图片
    x, y, w, h = roi
    dst = dst[y:y + h, x:x + w]
    cv2.imwrite('calibresult.jpg', dst)
     
    # 反投影误差
    # 通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。
    total_error = 0
    for i in range(len(objpoints)):
        imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
        error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
        total_error += error
    print("total error: ", total_error / len(objpoints))
    
    

    实验结果分析

    1.数据集

    使用手机相机一共拍摄16张棋盘格图片,图片统一尺寸为640 X 480,纸张大小为a4,棋盘格大小为11X8个格子,每个格子大小为20X20mm,使用数据集的时候没有取到边缘,所取内角点(内角点是和其他格子连着的点)维数为10X7。
    在这里插入图片描述

    2.实验结果

    在这里插入图片描述

    内参矩阵:
    在这里插入图片描述

    畸变矫正系数:在这里插入图片描述

    展开全文
  • 多种棋盘格标定板,有小的有大的包含超大个棋盘格,6*6,9*10(5cm)19*20、25*30(2.5cm)
  • 相机标定与棋盘格标定

    千次阅读 2020-04-07 14:14:08
    文章目录相机标定相机标定的意义标定参数线性回归优缺点同步标定内部参数和外部参数棋盘格标定图片集harris角点检测求解 Homographic矩阵内外参数结果 相机标定 相机标定的意义 在图像测量过程以及机器视觉应用中,...
  • 相机标定——张正友棋盘格标定

    万次阅读 多人点赞 2019-01-04 14:14:05
    是由于每镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变; 另一是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构...
  • 张正友棋盘格标定

    千次阅读 2020-04-07 16:56:00
    文章目录1、原理1.1 计算外参数...“张正友标定”是指张正友教授1998年提出的单平面棋盘格的摄像机标定方法。 1、原理 针孔相机模型: 1.1 计算外参数 相机外部参数/外方位元素:旋转、平移 由于三角形Cpt与三角形...
  • Opencv相机校准之棋盘格标定

    千次阅读 多人点赞 2020-03-02 22:25:33
    第二个参数patternSize,每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向; 第三个参数corners,用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来...
  • 计算机视觉——张正友棋盘格标定法 一是由于每镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变; 另一是根据标定后的到的相机参数建立...
  • 相机标定(棋盘格标定法)

    千次阅读 2020-04-07 16:19:18
    相机标定(棋盘格标定法) 1、相机标定 1.1、相机标定简介 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型...
  • 利用棋盘格进行相机标定

    千次阅读 2022-02-28 11:34:53
    这里主要是利用棋盘格进行相机标定的实现,开发化境为Ubuntu18.04。相机标定的具体算法原理可自行参考2000年张正友发表的论文《A Flexible New Technique for Camera Calibration》。关于相机标定的实现其实很,...
  • 使用了OpenCvSharp资源开发包,在VS下做了一个棋盘格图像下的相机标定助手小Demo,显然,C#也可以用OpenCv了。这是一个比较好的案例,可以参考下。鄙人不才,也用它做了一个SFM三维重建的Demo,这里就不放了。 ...
  • 文章目录1. 相机标定的目的1.1 相机...校正透视畸变:由于每镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,获取矫正后的图像; 获取相机成像几何模型:相机标定后得到的相机参数可
  • 相机标定张正友——棋盘格标定

    千次阅读 2019-04-14 18:08:18
    是由于每镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变; 另一是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构出...
  • 在机器人视觉抓取任务时,基础是要实现相机像素坐标对应于桌面的世界坐标的转换,很多网友用的方法是利用棋盘格标定实现相机坐标与世界坐标的转换。本质上其实就是通过多个点在世界坐标和像素坐标的对应关系,即:...
  • 棋盘格相机标定图片拍摄方法

    千次阅读 2021-04-28 16:47:30
    (1)棋盘格在图片中占的面积越大越好,或者棋盘格和相机距离和实际使用场景的景物距离相一致。 (2)多种旋转方向。 (3)多种平移。 (4)包含三左右不同距离。 注: (1)标定算法一般用的都是张正友的...
  • 2.标定棋盘格 不能有 明显的反光/阴影 等导致亮暗不均的地方。若出现,可通过调节摄像头,图卡和光源相对位置来规避。 我打印制作了很种类,发现最好的就是,普通办公打印纸。广告类的覆亚膜。都会在室内光源...
  • 文章目录一、相机畸变1、畸变现象2、畸变类型二、相机标定1、畸变校正2、张正友棋盘格标定法2、1棋盘格标定法介绍2、2 棋盘格标定流程2、3 标定工具2、4标定实现 一、相机畸变 1、畸变现象 我们都希望自己的相机...
  • 利用棋盘格图案完成相机标定

    千次阅读 2019-05-16 16:57:44
    摄像机标定 单孔摄像机(照相机)会给图像...棋盘格标定 OpenCV使用棋盘格板进行标定,如下图所示。为了标定相机,我们需要输入一系列三维点和它们对应的二维图像点。在黑白相间的棋盘格上,二维图像点很容易通过...
  • python实现张正友棋盘格标定

    千次阅读 2020-04-07 14:35:07
    原理1.1相机的内参数1.2张氏标定法1.3切向畸变与径向畸变2.环境与代码2.1棋盘环境2.2图片选取2.3代码3.实验结果与分析3.1角点检测结果3.2内参结果截图3.3外参结果截图3.4小结4.遇到的问题及解决方法 1.原理 ** 1.1...
  • 今天,我看见我一同学在用photoshop画棋盘格,用于相机标定的。然后我就不淡定了,决定给他写程序完成这工作。写了1个多小时,终于整完了。把代码放在这,希望能帮到别人。malab的代码,下面是主函数。主函数:...
  • opencv的棋盘格角点提取API需要我们指定棋盘格的横纵点数,才能进行角点的提取。其主要流程是把图片二值化,形态学处理,找到若干四边形,给各个四边形编号,根据所获取的这一组四边形和设置的横纵点数进行漏掉的...
  • 棋盘格生成器可以生成上面四种格式的标定板,想要大想要几行几列都可以动态设置。 非常好用,对于自己写代码或用cad画都比较浪费时间,这生成器可以立刻生成pdf,只要打印机不设置缩放,即可正常尺寸打印。 ...
  • 棋盘相机标定及参数解算

    千次阅读 2020-04-07 14:39:25
    文章目录前言棋盘格制作相机标定原理标定参数线性回归相机标定棋盘格标定棋盘格标定简介标定步骤详细实现代码实验结果及总结 前言 张正友标定法是指张正友教授1998年提出的单平面棋盘格的摄像机标定方法。文中提出的...
  • 对于通常的图像,我们调用matlab工具包中的camera calibrator和 stereo camera calibrator可以从棋盘格图像中提取到正确的角点,如下所示: 在实际标定过程中,由于光线照射角度,材质反射率等因素的影响,可能角点...
  • Visionpro棋盘格校正

    千次阅读 2020-09-23 21:11:18
    棋盘标定板 1.棋盘标定板的要求: 1黑白块必须水平和垂直方向交替排列; 1.2黑白块必须大小相同; 1.3黑白块必须是矩形的,如果它们不是正方形,它们的长宽比应该在0.90到1.10的范围内; 2.采集到的标定板图像的...
  • OpenCV生成标定图(棋盘格)

    千次阅读 2018-10-29 14:19:24
    网上查了一下工业视觉标定板,少则几百大洋,则几千大洋,就想在A4纸上山寨打印一个标定图,就是黑白方格相间的那种。A4纸的标准大小为210*297mm。搞了把小时,其实想明白了之后很简单。从每像素的角度考虑,...
  • 本文首发于微信公众号【事件相机】,原文链接:事件相机标定实践 - 闪烁棋盘格标定 最近项目需要,做了下“闪烁棋盘格标定”的实践。本文详细介绍标定方法和注意事项。 一、生成棋盘格视频 由于事件相机仅能获取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,716
精华内容 686
热门标签
关键字:

多个棋盘格标定