摄像机标定程序中用到的OpenCV函数

OpenCV相机标定全过程 如果不使用这个参数,用图像的中心点初始化光轴点坐标(cx, cy),使用最小二乘估算出fx,fy(这种求法好像和张正友的论文不一样,不知道为何要这样处理)。第二个参数是棋盘格内部的角点的行列数(注意:不是棋盘格的行列数,如棋盘格的行列数分别为4、8,而内部角点的行列数分别是3、7,因此这里应该指定为cv::Size(3, 7));当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy的实际输入值将会被忽略,只有fx/fy的比值被计算和使用。启用畸变k4,k5,k6三个畸变参数。 阅读详情

FindChessboardCorners 寻找棋盘图的内角点位置

 

int cvFindChessboardCorners( const void*image, CvSize pattern_size,

CvPoint2D32f* corners,int* corner_count=NULL,

int flags=CV_CALIB_CB_ADAPTIVE_THRESH );

 

image

输入的棋盘图,必须是8位的灰度或者彩色图像。

pattern_size

棋盘图中每行和每列角点的个数。

corners

检测到的角点

corner_count

输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。

flags

各种操作标志,可以是0或者下面值的组合:

CV_CALIB_CB_ADAPTIVE_THRESH - 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。

CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。

CV_CALIB_CB_FILTER_QUADS - 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。

函数cvFindChessboardCorners试图确定输入图像是否是棋盘模式,并确定角点的位置。如果所有角点都被检测到切它们都被以一定顺序排布(一行一行地,每行从左到右),函数返回非零值,否则在函数不能发现所有角点或者记录它们地情况下,函数返回0。例如一个正常地棋盘图右8x8个方块和7x7个内角点,内角点是黑色方块相互联通地位置。这个函数检测到地坐标只是一个大约地值,如果要精确地确定它们的位置,可以使用函数cvFindCornerSubPix。

 

 


FindCornerSubPix 寻找棋盘图的内角点位置

精确角点位置

void cvFindCornerSubPix( const CvArr* image, CvPoint2D32f* corners,

                        int count, CvSize win, CvSize zero_zone,

                         CvTermCriteria criteria );

image

输入图像.

corners

输入角点的初始坐标,也存储精确的输出坐标

count

角点数目

win

搜索窗口的一半尺寸。如果win=(5,5) 那么使用 5*2+1 × 5*2+1 = 11 × 11 大小的搜索窗口

zero_zone

死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为 (-1,-1) 表示没有死区。

criteria

求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确度达到某个设定值。 criteria 可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。

函数cvFindCornerSubPix通过迭代来发现具有子象素精度的角点位置,或如图所示的放射鞍点(radial saddle points)。

子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点q到其邻域点p 的向量和p点处的图像梯度正交(服从图像和测量噪声)。考虑以下的表达式:

εi=DIpiT·(q-pi)

其中,DIpi表示在q的一个邻域点pi处的图像梯度,q的值通过最小化εi得到。通过将εi设为0,可以建立系统方程如下:

sumi(DIpi·DIpiT)·q - sumi(DIpi·DIpiT·pi) = 0

其中q的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数G和第二个梯度参数b,得到:

q=G-1·b

该算法将搜索窗的中心设为新的中心q,然后迭代,直到找到低于某个阈值点的中心位置。

 


DrawChessBoardCorners 绘制检测到的棋盘角点

 

void cvDrawChessboardCorners( CvArr* image,CvSize pattern_size,CvPoint2D32f*corners,

int count,int pattern_was_found );

 

image

结果图像,必须是8位彩色图像。

pattern_size

每行和每列地内角点数目。

corners

检测到地角点数组。

count

角点数目。

pattern_was_found

指示完整地棋盘被发现(≠0)还是没有发现(=0)。可以传输cvFindChessboardCorners函数的返回值。

当棋盘没有完全检测出时,函数cvDrawChessboardCorners以红色圆圈绘制检测到的棋盘角点;如果整个棋盘都检测到,则用直线连接所有的角点。

 


CalibrateCamera2利用定标来计算摄像机的内参数和外参数

void cvCalibrateCamera2 ( const CvMat* object_points,

               constCvMat* image_points,const CvMat* point_counts,

               CvSizeimage_size, CvMat* intrinsic_matrix,

               CvMat*distortion_coeffs, CvMat* rotation_vectors=NULL,

               CvMat*translation_vectors=NULL, int flags=0 );

 

object_points

定标点的世界坐标,为3xN或者Nx3的矩阵,这里N是所有视图中点的总数。

image_points

定标点的图像坐标,为2xN或者Nx2的矩阵,这里N是所有视图中点的总数。

point_counts

向量,指定不同视图里点的数目,1xM或者Mx1向量,M是视图数目。

image_size

图像大小,只用在初始化内参数时。

intrinsic_matrix

输出内参矩阵(A) ,如果指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部分或者全部必须被初始化。

distortion_coeffs

输出大小为4x1或者1x4的向量,里面为形变参数[k1, k2, p1, p2]。

rotation_vectors

输出大小为3xM或者Mx3的矩阵,里面为旋转向量(旋转矩阵的紧凑表示方式,具体参考函数cvRodrigues2)

translation_vectors

输出大小为3xM或Mx3的矩阵,里面为平移向量。

flags

不同的标志,可以是0,或者下面值的组合:

·  CV_CALIB_USE_INTRINSIC_GUESS- 内参数矩阵包含fx,fy,cx和cy的初始值。否则,(cx,cy)被初始化到图像中心(这儿用到图像大小),焦距用最小平方差方式计算得到。注意,如果内部参数已知,没有必要使用这个函数,使用cvFindExtrinsicCameraParams2则可。

·  CV_CALIB_FIX_PRINCIPAL_POINT- 主点在全局优化过程中不变,一直在中心位置或者在其他指定的位置(当CV_CALIB_USE_INTRINSIC_GUESS设置的时候)。

·  CV_CALIB_FIX_ASPECT_RATIO- 优化过程中认为fx和fy中只有一个独立变量,保持比例fx/fy不变,fx/fy的值跟内参数矩阵初始化时的值一样。在这种情况下, (fx, fy)的实际初始值或者从输入内存矩阵中读取(当CV_CALIB_USE_INTRINSIC_GUESS被指定时),或者采用估计值(后者情况中fx和fy可能被设置为任意值,只有比值被使用)。

·  CV_CALIB_ZERO_TANGENT_DIST– 切向形变参数(p1, p2)被设置为0,其值在优化过程中保持为0。

函数cvCalibrateCamera2从每个视图中估计相机的内参数和外参数。3维物体上的点和它们对应的在每个视图的2维投影必须被指定。这些可以通过使用一个已知几何形状切具有容易检测的特征点的物体来实现。这样的一个物体被称作定标设备或者定标模式,OpenCV有内建的把棋盘当作定标设备方法(参考cvFindChessboardCorners)。目前,传入初始化的内参数(当CV_CALIB_USE_INTRINSIC_GUESS被设置时)只支持平面定标设备(物体点的Z坐标必须时全0或者全1)。不过3维定标设备依然可以用在提供初始内参数矩阵情况。在内参数和外参数矩阵的初始值都计算出之后,它们会被优化用来减小反投影误差(图像上的实际坐标跟cvProjectPoints2计算出的图像坐标的差的平方和)。

 


Undistort2校正图像因相机镜头引起的变形

void cvUndistort2( const CvArr* src, CvArr* dst,

                  const CvMat* intrinsic_matrix,

                  const CvMat* distortion_coeffs );

 

src

原始图像(已经变形的图像)。

dst

结果图像(已经校正的图像)。

intrinsic_matrix

相机内参数矩阵,格式为 。

distortion_coeffs

四个变形系数组成的向量,大小为4x1或者1x4,格式为[k1,k2,p1,p2]。

函数cvUndistort2对图像进行变换来抵消径向和切向镜头变形。相机参数和变形参数可以通过函数cvCalibrateCamera2取得。使用本节开始时提到的公式,对每个输出图像像素计算其在输入图像中的位置,然后输出图像的像素值通过双线性插值来计算。如果图像得分辨率跟定标时用得图像分辨率不一样,fx、fy、cx和cy需要相应调整,因为形变并没有变化。

 


FindExtrinsicCameraParams2计算指定视图的摄像机外参数

void cvFindExtrinsicCameraParams2 ( const CvMat*object_points,

                                   const CvMat*image_points,

                                   const CvMat*intrinsic_matrix,

                                   const CvMat*distortion_coeffs,

                                   CvMat*rotation_vector,

                                   CvMat*translation_vector );

object_points

定标点的坐标,为3xN或者Nx3的矩阵,这里N是视图中的个数。

image_points

定标点在图像内的坐标,为2xN或者Nx2的矩阵,这里N是视图中的个数。

intrinsic_matrix

内参矩阵(A) 。

distortion_coeffs

大小为4x1或者1x4的向量,里面为形变参数[k1,k2,p1,p2]。如果是NULL,所有的形变系数都为0。

rotation_vector

输出大小为3x1或者1x3的矩阵,里面为旋转向量(旋转矩阵的紧凑表示方式,具体参考函数cvRodrigues2)。

translation_vector

大小为3x1或1x3的矩阵,里面为平移向量。

函数cvFindExtrinsicCameraParams2使用已知的内参数和某个视图的外参数来估计相机的外参数。3维物体上的点坐标和相应的2维投影必须被指定。这个函数也可以用来最小化反投影误差。

 

 


GoodFeaturesToTrack 确定图像的强角点

 

void cvGoodFeaturesToTrack( const CvArr*image, CvArr* eig_image, CvArr* temp_image,

CvPoint2D32f* corners, int* corner_count,

double quality_level, double min_distance,

const CvArr* mask=NULL );

image

输入图像,8-位或浮点32-比特,单通道

eig_image

临时浮点32-位图像,尺寸与输入图像一致

temp_image

另外一个临时图像,格式与尺寸与 eig_image 一致

corners

输出参数,检测到的角点

corner_count

输出参数,检测到的角点数目

quality_level

最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。

min_distance

限制因子。得到的角点的最小距离。使用 Euclidian 距离

mask

ROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像。

函数cvGoodFeaturesToTrack 在图像中寻找具有大特征值的角点。该函数,首先用cvCornerMinEigenVal 计算输入图像的每一个象素点的最小特征值,并将结果存储到变量 eig_image 中。然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。下一步将最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。最后,函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于 min_distance )。

 

OpenCV内部函数cvFindExtrinsicCameraParams2解析(一) 本文对cvFindExtrinsicCameraParams2函数中特征点在一个平面上时的外参估计方法进行解析,这个方法是平面标定板会执行的路线。 阅读详情

相关推荐

opencv常见用法和opencv3->opencv4版本切换

identifier “CV_AA” is undefined: #include <opencv2/imgproc/imgproc_c.h> identifier “CV_GRAY2RGB” is undefined: #include <opencv2/imgproc/types_c.h>

weixin_43848456的博客 1万+

VINF_FUSION编译出现大量的error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope错误

错误 /home/lee/catkin_ws/src/VINS-Fusion/camera_models/src/chessboard 解决 1.查看自己的OPENCV版本 pkg-config --modversion opencv 2.找到错误代码位置 /home/lee/catkin_ws/src/VINS-Fusion/camera_models/src/chessboard 大概错误就是自己安装了不同版本的opencv,vins里需要opencv3,但是默认的opencv是4,所以要在cm

qq_40904854的博客 3777

【OpenCV】摄像机标定+畸变校正

通过MATLAB和OpenCV对摄像机进行标定,附程序!

王强_CASIA的博客 8万+

GVINS编译出现大量的error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope错误

错误: /home/knight/GVINS_GI/src/GVINS-main/camera_model/src/chessboard/Chessboard.cc:38:43: error: ‘CV_CALIB_CB_NORMALIZE_IMAGE’ was not declared in this scope CV_CALIB_CB_NORMALIZE_IMAGE + 解决: 1.查看自己的OPENCV版本 pkg-config --modversion opencv 2.看出错代码位置 /ho

qq_41861406的博客 5193

摄像机高精度标定的一些方法

摄像机标定从标定板类型可以分为:一维标定物,二维标定物和三维标定物(哈哈) 一维标定物标定算法是利用摄像机投影过程中的交比不变性的原理,常用来标定摄像机阵列(多个摄像机)。具体原理可参考:基于一维标定物的多摄像机标定。一维标定物见下图所示,一个直杆上有3个点,三个点之间的距离需要实现精确测量。在标定过程中,只需要在各个摄像机的视场空间不断挥动标定杆,就可以精确标定摄像机的内外参数。一维标定物在多摄像机标定中使用起来非常灵活方便,非常建议在该种场景下使用。 (在这里特别感谢一下吴福朝,张广军等人在早期对传统的

zouzoupaopao229的专栏 1万+

机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定

机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定标签(空格分隔): 机器视觉本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译)强烈建议阅读机器视觉学习笔记(4)——单目摄像机标定参数说明之后再阅读本文1.单目摄像机标定目的单目摄像机标定的目的就是使摄像机实际状态无限接近理论推导的理想状态。单目摄像机标定最终

moverzp的博客 2万+

基于opencv的摄像机标定

基于opencv的摄像机标定

daijuting的博客 3573

机器视觉学习笔记(7)——基于OpenCV的双目摄像机标定

机器视觉学习笔记(7)——基于OpenCV的双目摄像机标定标签: 机器视觉本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译)阅读本文之前请先阅读以下三篇博文: 机器视觉学习笔记(4)——单目摄像机标定参数说明 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定 机器视觉学习笔记(6)——双目摄像机标定参

moverzp的博客 1万+

机器视觉学习笔记(4)——单目摄像机标定参数说明

机器视觉学习笔记(4)——单目摄像机标定参数说明标签: 机器视觉1.针孔摄像机模型 在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理。投影平面到小孔的距离为焦距f,物体到小孔的距离为Z,其中物体和投影是倒立相似的关系,下图为针孔摄像机的投影示意图: 如果按照实际的投影关系建立坐标系,那么投影坐标和物体坐标的符号总是相反的,考虑起来不太方便,于是在“数学上”把投影平面平移到其关于小孔对称的位

moverzp的博客 3万+

Python-OpenCV相机标定、张正友标定法

一、相机标定介绍: 相机标定是进行视觉测量和定位的基础工作之一,标定参数准确与否直接关系到整个系统的精度,为此根据自己项目中的经验及参考相关的商用视觉软件的做法将相机标定过程中标定图片的获取过程中需要注意的问题总结如下: 标定板拍摄的张数要能覆盖整个测量空间及整个测量视场,把相机图像分成四个象限,应保证拍摄的标定板图像均匀分布在四个象限中,且在每个象限中建议进行不同方向的两次倾斜,下图是一组推荐摆...

weixin_42653918的博客 1万+

多摄像机标定和去畸变

Table of Contents 1、kalibr多摄像机标定 1.1 系统安装,环境配置:实测Ubuntu 16.04 1.2 多摄像机标定 2、OpenCV双目标定 3、Matlab多摄像机标定 4、利用标定矩阵去畸变 进行摄像机标定的目的:求出相机的内、外参数,以及畸变参数。 标定相机后通常是想做两件事:一个是由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜...

aaron19890330的专栏 9299

opencv标定程序

一. 标定原理摄像机在成像的过程中会在边缘产生显著的畸变,对于普通的摄像机拍摄的图像,会产生径向畸变,切向畸变和其他类型的畸变,我们需要对图像进行矫正处理。使用opencv对图像进行标定。

u014773418的专栏 2865

摄像机标定的简单理解与纪要

该文章是在阅读许多博客关于标定的说法中,结合自己理解而整理的一部分。如有雷同,纯属抄袭,请联系我删除即可。 一、相机标定的方法和意义: 1、什么是相机标定: 图像测量和机器视觉应用过程中,为确定空间物体表妹某一点的三维几何位置与其在图像中对应点之间的相互关系,必须建立摄像机的几何模型,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验和计算得到,这个求解的过程就称之为摄像机的标定。 2、相机标定的意义“ 无论是在图像测量还是机器视觉应用中,摄像机参数...

qq_40896597的博客 8363

opencv摄像机标定+姿势估计

文章目录1.原理2.如何找到对象点和图像点3.用opencv方法获取对象点和图像点4.进行摄像机标定并校正图像 1.原理 今天的低价单孔摄像机(照相机)会给图像带来很多畸变。畸变主要有两种:径向畸变和切想畸变。如果我们想对畸变的图像进行校正就必须找到五个造成畸变的系数:Distortion cofficients = (k1;k2;p1;p2;k3)(k1; k2; p1; p2; k3)(k...

方寸想法,编码宇宙 1619

摄像机标定原理与操作

参考:https://wenku.baidu.com/view/d6eb27c1524de518964b7d51.html 一、标定方法分类: 1.传统的摄像机标定:是在一定的摄像机模型下,基于特定的实验条件, 如形状、尺寸己知的标定物,经过对其进行图像处理,利用一系列数学变换和计算方法,求取摄像机模型的内部参数和外部参数。 相机内参:摄像机成像的基本参数,如主点(图像中心)、焦距、径向镜头畸变、偏轴镜头畸变以及其它系统误差参数。 相机外参:旋转矩阵R,相对位移t。(需要双目相机) 2.摄像机自标定:不依赖

西柚小老弟 6162

使用opencv进行相机标定(python)

前言 今天介绍一个比较复杂的话题——照相机标定 为社么会复杂呢?因为解释起来比较麻烦,会涉及到很多数学公式。 本文将运用张正友相机标定的数学原理,并给出标定流程。OpenCV中已经封装好了一系列函数,我们使用这些函数可以实现张正友相机标定。那么首先说明一下什么是相机标定? 一个摄像机可以大致分为三个部分:镜头 、感光元件(CCD和CMOS)、处理电路。当光线透过镜头,会在感光元件上形成一个物体的“...

qq_42399848的博客 8596

OpenCV摄像机标定例程笔记

//使用opencv2.4.6中samples/cpp/tutorial_code/calib3d/camera_calibration/camera_calibration.cpp#include #include #include #include #include #include #include #include using namespace cv;using namespace st

That's IT 5460

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 794
上一篇: opencv中cvCalibrateCamera2()的函数细解
下一篇: 最近一段vc++程序的错误及解决(mark)
张良007
博客等级 码龄16年 100粉丝 25原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值