精华内容
下载资源
问答
  • 相机内参标定

    2019-10-24 09:24:14
    MATLAB、OpenCV及Ros下相机内参标定整理
    展开全文
  • 相机内参标定文件ost.yml,已经完成标定
  • 相机内参标定 Python实现 根据单应矩阵求出内参,包含单应矩阵文件加载,内参求解。算法是张正友相机标定方法的部分复现
  • 相机内参标定.zip

    2021-02-23 09:16:28
    乐视体感相机Astra Pro内参标定参数(彩色+深度)
  • Python计算机视觉-张氏相机内参标定

    千次阅读 2019-04-14 20:46:42
    相机内参标定 原理简述: 单孔摄像机(照相机)会给图像带来很多畸变,畸变主要有两种:径向畸变(图像像素点以畸变中心为中心点,沿着径向产生的位置偏差导致成像发生形变)和切向畸变(由于透镜与成像平面不可能...

    相机内参标定

    原理简述
    单孔摄像机(照相机)会给图像带来很多畸变,畸变主要有两种:径向畸变(图像像素点以畸变中心为中心点,沿着径向产生的位置偏差导致成像发生形变)和切向畸变(由于透镜与成像平面不可能绝对平行造成)。通过拍摄实际规格已知的标定板可以得到n个对应的世界坐标三维点 Xi 和对应的图像坐标二维点 xi,这些三维点到二维点的转换都可以通过相机内参 K,相机外参 R 和 t,以及畸变参数 s 经过一系列的矩阵变换得到。图像间的对应关系可以来求解这些相机参数,所以用线性方法求解内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像进行矫正,得到畸变相对很小的图像。
    初始的标定方法需要三面相互垂直且带有大量不同大小透光点的高精度标定板,而张正友教授1998年提出的单平面棋盘格摄像机标定方法假定图像位于 Z=0 (XY)平面上进行标定,已知两个平面的对应点的坐标就可以求解得到两个平面的单应矩阵H,而黑白棋盘格的角点便于检测,位置信息便于获取,因此仅需使用一个打印出来的棋盘格就可以实现参数标定。

    标定原理详解
    https://blog.csdn.net/honyniu/article/details/51004397
    http://www.cnblogs.com/Undo-self-blog/p/8448500.html
    张氏标定详解https://www.jianshu.com/p/9d2fe4c2e3b7

    输入:20张标定板照片。标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标。
    输出:相机内部参数,畸变系数矩阵,反向投影误差。

    尝试标定的流程如下:

    1. 使用手机相机拍摄,准备标定图片;

    2. 对每一张标定图片,提取Harris角点信息;

    3. 对每一张标定图片,进一步提取亚像素角点信息;

    4. 在棋盘标定图上绘制找到的内角点;

    5. 相机标定,修正畸变图像;

    6. 计算标定误差;

    使用的图片集:
    在这里插入图片描述
    标定源码:

    #coding:utf-8
    import cv2
    import numpy as np
    import glob
    
    # 找棋盘格角点
    # 阈值
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    #棋盘格模板规格
    w = 11
    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('./image/Calibration/*.jpg')
    for fname in images:
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        # 找到棋盘格角点
        ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
        # 如果找到足够点对,将其存储起来
        if ret is True:
            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(1)
    cv2.destroyAllWindows()
    
    # 标定
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
    
    # 去畸变
    img2 = cv2.imread('./image/Calibration/1.jpg')
    h,  w = img2.shape[:2]
    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.png', dst)
    print("newcameramtx:\n", newcameramtx)
    print("dist:\n", dist)
    
    # 反投影误差
    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))
    
    

    其中误差计算部分用到的 range() 函数原为 Python2.x 中的 xrange(),需根据环境自行修改:
    在这里插入图片描述
    我的手机型号为 Samsung Galaxy S8,标定结果如下:
    其中 newcameramtx 为内参矩阵,dist 为畸变系数矩阵,total error 是反向投影误差统计值
    在这里插入图片描述
    畸变图像与原图对比:
    在这里插入图片描述在这里插入图片描述
    Tips

    1. 为使内部参数误差尽可能小应获取15-20张图像,并且相机位置和姿态应尽可能多变(得到区别很明显的外部参数);
    2. 正常模式下我们的手机相机都是全自动变焦,因此可以使用专业模式定焦拍摄。
    展开全文
  • 单目相机内参标定(python) 一、 标定原理 标定原理网上一大堆,就不在这赘述了,直接上代码。 import cv2 import numpy as np import glob # 找棋盘格角点标定并且写入文件 # 设置寻找亚像素角点的参数,采用的...

    单目相机内参标定(python)

    标定原理网上一大堆,就不在这赘述了,直接上代码。

    import cv2
    import numpy as np
    import glob
    
    # 找棋盘格角点标定并且写入文件
    # 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)  # 阈值
    # 棋盘格模板规格
    w = 8   # 9 - 1
    h = 6   # 7  - 1
    # 世界坐标系中的棋盘格点,例如(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)
    objp = objp * 21  # 棋盘方块边长21 mm
    
    # 储存棋盘格角点的世界坐标和图像坐标对
    objpoints = []  # 在世界坐标系中的三维点
    imgpoints = []  # 在图像平面的二维点
    
    images = glob.glob('E:/code/1_21mm_2/*.jpg')  # 拍摄的十几张棋盘图片所在目录
    
    i = 1
    for fname in images:
        img = cv2.imread(fname)
        # 获取画面中心点
        h1, w1 = img.shape[0], img.shape[1]
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        u, v = img.shape[:2]
        print(u, v)
        # 找到棋盘格角点
        ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
        # 如果找到足够点对,将其存储起来
        if ret == True:
            print("i:", i)
            i = i+1
            # 对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别
            cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
            objpoints.append(objp)
            imgpoints.append(corners)
            # 将角点在图像上显示
            cv2.drawChessboardCorners(img, (w, h), corners, ret)
            cv2.namedWindow('findCorners', cv2.WINDOW_NORMAL)
            cv2.resizeWindow('findCorners', 640, 480)
            cv2.imshow('findCorners', img)
            cv2.waitKey(200)
    cv2.destroyAllWindows()
    #  标定
    print('正在计算')
    ret, mtx, dist, rvecs, tvecs = \
        cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
    cv_file = cv2.FileStorage("E:/code/1_21mm_2/camera.yaml", cv2.FILE_STORAGE_WRITE)
    cv_file.write("camera_matrix", mtx)
    cv_file.write("dist_coeff", dist)
    # 请注意,*释放*不会关闭()FileStorage对象
    
    cv_file.release()
    
    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)  # 平移向量  # 外参数
    newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (u, v), 0, (u, v))
    print('newcameramtx外参', newcameramtx)
    camera = cv2.VideoCapture(0)
    
    while True:
        (grabbed, frame) = camera.read()
        h1, w1 = frame.shape[:2]
        # 打开标定文件
        cv_file = cv2.FileStorage("E:/code/1_21mm_2/camera.yaml", cv2.FILE_STORAGE_READ)
        camera_matrix = cv_file.getNode("camera_matrix").mat()
        dist_matrix = cv_file.getNode("dist_coeff").mat()
        cv_file.release()
    
        newcameramtx, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_matrix, (u, v), 0, (u, v))
        # 纠正畸变
        dst1 = cv2.undistort(frame, camera_matrix, dist_matrix, None, newcameramtx)
        mapx, mapy = cv2.initUndistortRectifyMap(camera_matrix, dist_matrix, None, newcameramtx, (w1, h1), 5)
        dst2 = cv2.remap(frame, mapx, mapy, cv2.INTER_LINEAR)
    
    
        # 裁剪图像,输出纠正畸变以后的图片
        x, y, w1, h1 = roi
        dst1 = dst1[y:y + h1, x:x + w1]
    
        cv2.imshow('dst1', dst1)
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 按q保存一张图片
            cv2.imwrite("E:/code/1_21mm_2/frame.jpg", dst1)
            break
    
    camera.release()
    cv2.destroyAllWindows()
    

    相机标定的棋盘生成程序见:https://blog.csdn.net/qq_42598221/article/details/119212743

    展开全文
  • Matlab相机内参标定及参数理解

    千次阅读 2019-10-17 09:40:33
    Matlab相机内外参标定Matlab相机内参标定相机成像模型功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...

    Matlab相机内参标定

    相机的标定有很多种工具和方法,例如opencv,ROS,Visp等都可以进行相机标定。由于最近一直在用Matlab控制KUKA机器人做一些项目,所以我就选择了Matlab进行相机的内外参标定,这里也主要分享和记录在使用Matlab标定过程中的一些方法和细节。

    相机成像模型

    想要弄懂相机的内外参标定以及明白标定结果的各项参数,首先要知道并理解相机的成像模型。有些博客已经讲的非常清楚,分享一些我参考阅读的博客:
    1.https://blog.csdn.net/lxy_2011/article/details/80675803(五参数模型)
    2.https://blog.csdn.net/striving1234/article/details/78433648(四参数模型)
    3.https://blog.csdn.net/qq_37791134/article/details/80942171

    内参数模型

    这些博客中均未提到相机成像的参数模型,下面简单介绍下相关的参数模型。相机成像模型主要有三参数,四参数,五参数模型。

    四参数模型
    在这里插入图片描述
    其中Kx,Ky分别为X轴和Y轴的放大系数,这个是可以由相机标定直接得到的,该参数模型是最为常用的。
    三参数模型
    在这里插入图片描述
    如果不考虑放大系数Kx,Ky的差异,构成的相机内参数模型就只有三个参数k,u0,v0.
    五参数模型
    在这里插入图片描述
    在考虑放大系数Kx,Ky的差异与耦合作用的情况下,构成相机的内参数模型就具有五个参数,Matlab标定工具箱得到的结果就是该参数模型。

    Zc的理解

    由射影几何原理可知,同一图像点可以对应若干个不同的空间点,如图所示:
    在这里插入图片描述直线OP上的所有点具有相同的图像坐标。当z=f时,该点就成为图像点在成像平面上的成像点坐标,当z=1时,该点为图像点在焦距归一化成像平面上的成像点坐标。利用相机的内参,就可以求出图像点在焦距归一化成像平面上的成像点坐标:
    在这里插入图片描述
    Zc表示点在相机坐标系下的Z轴方向的坐标,一般可以理解为深度,相机内参标定是得不到Zc的值,这也是普通针孔相机无法进行3D还原的原因。因为三维世界的坐标点会对应唯一的图像坐标点,但由于Zc未知,是无法还原这一过程的。所以引入归一化平面这个概念,它是一个假想的平面,可以理解为实际点坐标的一种缩放。
    可以参考这篇博客https://blog.csdn.net/weixin_38213410/article/details/89673663

    Matlab标定工具箱

    在理解了相机的成像模型和参数模型后,我们使用Matlab自带的标定工具箱来进行相机内参的标定。这个很多博客也都有介绍,我只记录一下一些应该注意的地方。

    参数勾选

    从Matlab应用程序中找到cameraCalibrator或者命令行直接输入cameraCalibrator即可打开标定工具箱,标定前可以自主选择一些参数,如图所示:
    在这里插入图片描述勾选2Coefficients表示径向畸变用两个参数表达,勾选3Coefficients表示径向畸变用两个参数表达。Skew是计算两轴的耦合,勾选得到的内参矩阵是五参数模型,不勾选得到的是四参数模型,Tangential Distortion是计算切向畸变的。

    标定结果

    从文件夹输入相应图片(10张以上)便可以进行标定了。下面是我的标定结果:
    在这里插入图片描述
    从标定的结果可以得到很多有用的信息,当然最关心的还是cameraParams.IntrinsicMatrix,它得到的其实是之前提到参数模型内参矩阵的转置矩阵。

    外参理解

    从标定的结果我们还可以得到Camera Extrinsics,它表示相机固定不动,每次相机相对于拍摄图片的位姿。这个位姿求解是利用PnP原理得到的,相机相对于世界坐标系的位姿在手眼相机标定中有很重要的作用,具体使用我会在下一篇博客中讲到。
    在这里插入图片描述这张图就是Matlab标定得到的,可以直观看到每次拍摄的照片相对于相机的位置,也就是相机的外参。

    总结

    相机内参标定教程非常多,这里也只是总结并记录一下自己在使用过程中的一些理解,希望对大家有所帮助。为了方便采集图片和内外参标定,我还用matlab编写了GUI,后续也会分享。我会在下一篇中继续介绍手眼相机的标定原理以及方法。

    展开全文
  • kalibr 相机内参标定流程和结果分析

    千次阅读 2019-04-30 10:29:06
    kalibr的多相机内参标定,默认同时进行外参标定,如果对于无交叉视野的多相机内参标定如何进行呢? kalibr在完成target提取之后,会将提取到的角点按照时间戳进行排序: 内参优化过程: 初始化 第一次优化: ......
  • opencv+vs2013进行相机内参标定(camera calibration),代码中有一两处需要修改下参数,比如输入图片的大小不同需要修改下
  • 多种棋盘格标定板,有小的有大的包含超大个棋盘格,6*6,9*10(5cm)19*20、25*30(2.5cm)
  • 在做相机方面的工作,需要进行内参标定,之前一直是在用matlab中camera_calibrate做的,需要拍摄多张标定板图片另外还需要安装matlab软件,工程操作有误可能带来后续计算位姿误差,因此在做内参标定优化,发现内参...
  • python 相机内参标定

    2020-06-09 15:14:50
    抄这位大哥的 python+opencv相机标定, 他的 第10行 objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2), 6和9写反了好像。 import cv2 import numpy as np import glob # 棋盘格角点数 h, w = 7, 5 # 设置寻找亚...
  • Matlab相机内参标定

    2020-06-03 10:11:36
    1、找到matlab Camera Calibration工具箱,点击进入2、Add image导入录制好的图片,录制的图片需分布在左中右...5、Export Camera Parameters,可在workspace中看到标定结果 Attention:IntrinsicMatrix 需做转置 ...
  • 相机标定
  • 本章摘要:本章讲解相机畸变产生的原因,标定原理,以及如何通过opencv实现相机内参标定
  • 转自:http://blog.sina.com.cn/s/blog_723702bc0102xfjs.html功能 : 相机内参标定ImgPath := '3d_machine_vision/calib/'dev_close_window ()dev_open_window (0, 0, 652, 494, 'black', WindowHandle)dev_update...
  • 单目相机内参标定棋盘生成生成棋盘 生成棋盘 创建自定义的棋盘标定图,这个没啥要说的,就是调用了opencv的画矩形框的函数,代码如下: #生成想要的标定图,大小自定义 import cv2 import sys #读入一张空白图片,...
  • kalibr相机内参标定优化过程和原理

    千次阅读 2019-05-06 12:01:53
    如果是多相机标定,在完成内参标定的同时,也会完成具有交叉视野相机外参的的标定。初始估计步骤也会进行多相机基线距离的估计,用作后续的迭代优化。 优化过程如下: 将提取到的靶标角点按照打上时间标签,然后...
  • 疑问: 一直有一个问题,就是单目相机标定的时候大都是移动标定板,固定相机不动,也没有说出个所以然来,但是为什么没有教程说固定标定板不动,移动相机呢? 解答: 希望大佬看到后不吝赐教。 ...
  • 单目相机内参标定注意事项

    千次阅读 2019-04-25 09:51:59
    为了提高单目相机标定的精度,认真看了张正友标定法的原文,并且学习过网上一些牛人的方法,但是大部分时候说的很笼统,自己把这些经验总结起来并都测试了一下,感觉靠谱的结论列出如下: (1)在标定时,标定模板...
  • 第一部分 工业相机基础知识 本部分主要参考以下文章: 【计算机视觉】相机成相之像距、物距、焦距 CCD以及镜头入门知识 工业摄像头传感器尺寸与像元尺寸的关系 1.相机成像 根据相机成像原理,可得到如下图: 其中:...
  • 世界坐标系是一个假想的坐标系,用作一般参考,可根据需要自由定义。...对于N张无畸变的图像来说,共有4个内参+6N个外参来标定,每张棋盘图上有4个有效的角点,可以提供8个约束,则需要8N>=4+...
  • 关于相机标定,其主要可以在MATLAB、OpenCv和ros下进行标定标定方法很大一部分是参考张正友标定的方法。 相关博客参考: 1) 相机标定 matlab opencv ROS三种方法标定步骤 二、MATLAB环境下相机标定方法 ...
  • 登龙这是我的第 111篇原创今天在家总结了下标定 ZED 相机的步骤,方便开学后直接开整。一、准备工作一个 8x6 的棋盘标定板,边长 10.8 cm,因为标定用的是内部角点,所以实际打印出是 9x7 大小保证一个 5m X 5m 的无...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,172
精华内容 1,668
关键字:

相机内参标定