opencv相机标定

基于OpenCv的机器人手眼标定(九点标定法)

偶尔善良 提交于 2019-12-25 10:44:49
对于初学者而言,对相机的标定经常模糊不清。不知道机器坐标与相机坐标如何转换,两个坐标系又是如何建立? 我们通常是利用张氏标定法,针对于相机的畸变进行标定,利用校正得到的参数对图形进行处理后再呈现出来。这个方法网上用的人很多,资料也较为全面。这里就不做说明了。本文主要是针对机械手的手眼标定,一般而言目前相机的畸变较小,精度也较为准确,使用该方法进行标定也能得到较好的效果。 首先,对于九点标定而言。我们使用到的是OpenCv中的 estimateRigidTransform 函数。 函数定义如下: Mat estimateRigidTransform(InputArraysrc,InputArraydst,boolfullAffine) 前两个参数,可以是 :src=srcImage (变换之前的图片Mat) dst=transImage(变换之后的图片Mat) 也可以: src=array(变换之前的关键点Array) dst=array(变换之后的关键点Array) 第三个参数: 1(全仿射变换,包括:rotation, translation, scaling,shearing,reflection) 其主要原理为:如果我们有一个点变换之前是[x,y,1],变换后是[x’,y’,1] 则fullAffine表示如下: TX=Y 展开后表示 如果我们想求这【a-f】

初学OpenCV之摄像机标定

隐身守侯 提交于 2019-12-25 04:58:11
     最近方向定下来是双目立体视觉,主要是做重建这块的研究。大致过程是图像获取->摄像机标定->特征提取->匹配->三维重建,当然开始可以进行图像预处理,矫正,后期可以进行点云的进一步处理,如渲染表面使其更接近于现实物体。   图像获取相对来说比较简单,用相机拍摄目标物(大型场景或特定小型的室内物体)。但有两点需要注意:   1、双目重建所需的图像一般为两张,角度相差不应过大,否则公共部分太少以至于重建效果不佳;整个过程简便,成本也不高,但缺陷是只有两张图像的点云所表示的物体信息不会很全面;   2、标定所需的图像又是另外拍摄的,用张正友标定法的话,把印有黑白棋盘格的图像粘至硬纸板上,然后左右摄像机各自进行拍摄,理论上获得角度(图像)越多,最终标定结果越精确;标定板见下图:   这里主要结合OpenCV对左右摄像机标定做一个简单的介绍,望朋友们指正,一起交流、进步。   摄像机的标定问题是机器视觉领域的入门问题,可以分为传统的摄像机定标方法和摄像机自定标方法。定标的方法有很多中常见的有:Tsai(传统)和张正友(介于传统和自定标)等,   摄像机成像模型和四个坐标系(通用原理)。   摄像机模型采用经典的小孔模型,如图中Oc(光心),像面π表示的是视野平面,其到光心的距离为f(镜头焦距)。   四个坐标系分别为:世界坐标系(Ow),摄像机坐标系(Oc),图像物理坐标系(O1

opencv标定程序

南楼画角 提交于 2019-12-03 07:12:57
一. 标定原理 摄像机在成像的过程中会在边缘产生显著的畸变,对于普通的摄像机拍摄的图像,会产生径向畸变,切向畸变和其他类型的畸变,我们需要对图像进行矫正处理。使用opencv标定图像的过程,先根据一个标定物体计算旋转矩阵和平移向量,寻找标定物的角点cvFindchessboardCorners;再精确角点的位置(也叫亚像素角点)cvfindCornerSubPix;绘制出所有的标定物角点cvDrawChessboardCorners ;使用标定函数计算摄像机的内参数矩阵和畸变系数,旋转变量和平移变量 cvCalibrateCamera2;根据内参数矩阵和畸变系数求出畸变映射cvInitUndistortMap ,再使用重映射转换图片 cvRemap ,也可以使用cvUndistort2完成所有的事项。 二. 函数简介 1. cvFindchessboardCorners 寻找棋盘上的角点位置 2. cvfindCornerSubPix 精确角点位置 3. cvDrawChessboardCorners 绘制检测到的棋盘角点 4. cvCalibrateCamera2 利用定标来计算摄像机的内参数和外参数 5. cvfindExtrinsicCameraParam2 只计算外参数 6. cvRodrigues2 进行旋转矩阵和旋转向量间的转换 7. cvUndistort2

OpenCV 标定摄像头(Python 版本代码,视频中标定,亲测可用)

让人想犯罪 __ 提交于 2019-12-03 07:11:34
在机器视觉领域,摄像头的标定指通过技术手段拿到相机的内参、外参及畸变参数。 相机内参长这样,利用针孔模型,将 3d 物体透视投影到 2d 的相机屏幕上。 P = [ f x 0 c x 0 f y c y 0 0 1 ] P = \begin{bmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y}\\ 0 & 0 & 1 \end{bmatrix} P = ⎣ ⎡ ​ f x ​ 0 0 ​ 0 f y ​ 0 ​ c x ​ c y ​ 1 ​ ⎦ ⎤ ​ 畸变参数包括 2 类, 径向畸变和切向畸变 。 径向畸变 最明显的例子就是鱼眼相机的效果。 大家仔细观察上面的图片,它就能很好地介绍径向畸变。越往镜头边缘,线条弯曲的越明显,本来是直线,现在都变成了曲线,消除畸变就是为了把这些曲线尽量还原成本来的样子。 径向畸变可以被纠正,公式如下。 除了径向畸变外,还有一个畸变就是 切向畸变 。 切向畸变 一般来说,是因为相机镜头制造工艺精度不够,透镜和感光器原件没有平行。从而造成了图像的变形。 矫正公式如下: 两个畸变的参数通常用一个向量表示。 但一般只用 4 个参数。 [ k 1 , k 2 , p 1 , p 2 ] [k_{1} ,k_{2},p_{1},p_{2}] [ k 1 ​ , k 2 ​ , p 1 ​ , p 2 ​ ] 如果用

使用opencv标定双目摄像头

喜夏-厌秋 提交于 2019-12-03 07:11:21
0.前言 接触双目相机标定有一段时间了,这里将自己的学习进行一下小结。双目标定的目的是用于后面的双目测距,不过有关双目测距的内容这里先只介绍双目测距的原理,不涉及双目测距算法。 1.三角测量 这一部分内容《学习opencv》中文版的p452-p454有了详细的论述 注意得到最后的公式是存在很多前提的,包括: (1)两台摄像机光轴平行、焦距相等, 且各自的主点具有相同的像素坐标 (2)两台摄像机成像平面共面且像素行对齐 不过我们拿到的双摄设备往往不能达到这种要求,所以需要标定这一步骤来进行相关的校正 2.双目标定 opencv已经提供了一个demo(samples\cpp\stereo_calib.cpp)实现了标定流程。在此之前按照《学习opencv》相关内容进行不同角度棋盘格图像的采集,选取包含较多位置、角度变化的10-20对图像作为待处理数据。 自己使用vs2015+opencv310,调用stereo_calib.cpp封装好的函数进行了标定,目测效果还可以。这里将附有注释的代码附上来 stereo_calib.h #ifndef _STEREO_CALIB_H_ #define _STEREO_CALIB_H_ #include <io.h> #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgcodecs

opencv标定单相机参数注意事项

落爺英雄遲暮 提交于 2019-12-03 07:06:45
近期使用opencv进行单相机标定,采用张正友的棋盘格网标定方法,标定过程中的注意事项如下: 1. opencv检测棋盘格角点函数,输出角点坐标顺序有两种可能,顺时针或者逆时针。确保每张图片检测出的角点顺序都一致。 2. 标定计算出的每张相片的外参数,是指物方坐标系经过旋转和平移,转换到像空间坐标系的参数,物方坐标系圆点在棋盘格第一个角点处。 3. 标定前需要输入棋盘格尺寸(单位一般用毫米),用于计算每个棋盘格角点在物方坐标系下的坐标。 4. 若自己打印棋盘格,不要让每个格子的尺寸太大,否知会导致提取角点失败,优先保证有较多的行列数。 标定函数代码连接: https://www.jianshu.com/p/d8f612d417f8 来源: CSDN 作者: 大森林_ 链接: https://blog.csdn.net/weixin_41224763/article/details/88531671

OpenCv相机标定——圆形标定板标定

给你一囗甜甜゛ 提交于 2019-12-03 07:06:33
OpenCv相机标定——圆形标定板标定 0.前言 1.标定图案 2.OpenCv标定 3.标定结果分析 0.前言   OpenCv中,相机标定所使用的标定图案分为棋盘格、对称圆形及非对称圆形特征图、ArUco板和ChArUco板等。在OpenCV的官方例程中,采用的是棋盘格图案,因为其操作简单、快速,标定精度满足一般应用场景的需求。对于标定精度要求高的场景,则一般采用圆形标定图案。本文主要介绍如何使用圆形标定图案(对称和非对称)完成相机的标定,并将OpenCv标定结果与Halcon标定结果进行对比分析。 1.标定图案   OpenCv中使用的圆形标定图案如图1所示: OpenCv中,使用圆形标定图案用到的函数为 cv::findCirclesGrid()。函数原型如下:  bool cv::findCirclesGrid(//找到圆心坐标返回True      cv::InputArray,//输入标定图像,8位单通道或三通道      cv::Size patternSize,//标定图案的尺寸      cv::OutputArray centers,//输出数组,为检测到的圆心坐标      int flags,//标志位,对称图案——cv::CALIB_CB_SYMMETRIC_GRID,非对称图案——  cv::CALIB_CB_ASYMMETRIC_GRID     

分别使用Matlab和OpenCV标定微距相机

走远了吗. 提交于 2019-12-03 07:05:31
软件: Matlab 2014a,VS 2013 棋盘格标定板: 方格边长0.5mm,横向角点数19个,纵向角点数15个。 相机内参估算 其实在已知相机的某些参数后,不进行标定也可以估计出大致的内参矩阵。 根据上一篇博文中对图像坐标系、相机坐标系和世界坐标系的学习,可以知道相机内参的形式: fx 0 u0 K = 0 fy v0 0 0 1 内参数为fx,fy,u0,v0。其中:fx=f/dx, fy=f/dy;u0,v0为主点坐标。 理想情况下:fx=fy;u0,v0分别为分辨率的一半,所以在已知焦距、图像分辨率和传感器尺寸等参数后,可以对理想情况下的内参进行估算。 以网上经常作为举例对象的NiKon D700相机为例: 焦距 f=35mm,最高分辨率 4256 2832,传感器尺寸 36.0mm 23.9mm 则可计算出: dx=36.0/4256,dy=23.9/2832 —> fx=f/dx=4137.8,fy=f/dy=4147.3 u0=4256/2=2128,v0=2832/2=1416 内参矩阵即为: 4137.8 0 2128 K = 0 4147.3 1416 0 0 1 但在对精度要求比较高的场合还是需要对相机进行标定,得到相机实际的内参和畸变参数。 Matlab标定工具箱 参考博客:http://blog.csdn.net/jameshater

openCV---相机内外参标定

匿名 (未验证) 提交于 2019-12-02 23:32:01
https://blog.csdn.net/u012319493/article/details/77622053 来源 张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图) https://my.oschina.net/abcijkxyz/blog/787659 将openCV安装目录下的“opencv2.4.8\opencv\sources\samples\cpp”中的有关棋盘的图片复制到工程目录下 这里写图片描述 在“calibdata.txt”中写入以下内容: left01.jpg left02.jpg left03.jpg left04.jpg left05.jpg left06.jpg left07.jpg left08.jpg left09.jpg left10.jpg #include <iostream> #include <sstream> #include <time.h> #include <stdio.h> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2

opencv标定

天涯浪子 提交于 2019-11-26 01:55:28
https://blog.csdn.net/u012319493/article/details/77622053 #include #include #include <time.h> #include <stdio.h> #include #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/calib3d/calib3d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; void main() { ifstream fin(“calibdata.txt”); / 标定所用图像文件的路径 / ofstream fout(“caliberation_result.txt”); / 保存标定结果的文件 / // 读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化 int image_count = 0; / 图像数量 / Size image_size; / 图像的尺寸 / Size board_size = Size(9, 6); / 标定板上每行、列的角点数 / vector image_points_buf; /