基于EmguCV的摄像机标定及矫正

标签: EmguCV摄像头标定C#

2015-05-03 14:55 501人阅读 评论(6) 收藏 举报

 分类:

C#

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

前言

之前用OpenCV做过摄像机标定及矫正,现在平台换了,改用C#,就用EmguCV做一下,其实就是OpenCV的C#版。

在EmguCV中有两类摄像机标定的类,一个是CvInvoke类,一个是CameraCalibration类,两种标定效果差不多,只不过CvInvoke涉及的函数大多都是指针类型的,而C#对于指针的操作比较麻烦。本文是在CameraCalibration类的基础上完成摄像机标定,用CvInvoke类完成矫正图像。

函数说明

1、角点检测

[csharp] view plain copy print ?

  1. public static PointF[] FindChessboardCorners(
  2. Image<Gray, byte> image,
  3. Size patternSize,
  4. CALIB_CB_TYPE flags
  5. )


Parameters

image
Type: Emgu.CV.Image<Gray, Byte>Source chessboard view
patternSize
Type: System.Drawing.SizeThe number of inner corners per chessboard row and column
flags
Type: Emgu.CV.CvEnum.CALIB_CB_TYPEVarious operation flags

Return Value

Type: PointF[]The corners detected if the chess board pattern is found, otherwise null is returned

注:输入图像需是灰度图,检测之前角点需要开辟空间,如:

[csharp] view plain copy print ?

  1. cornersDetected = new PointF[nPoints];       //nPoints表示单幅图像角点总数
  2. cornersDetected = CameraCalibration.FindChessboardCorners(chessboardImage, patternSize,
  3. CALIB_CB_TYPE.ADAPTIVE_THRESH | CALIB_CB_TYPE.NORMALIZE_IMAGE);

2、标定函数

[csharp] view plain copy print ?

  1. public static double CalibrateCamera(
  2. MCvPoint3D32f[][] objectPoints,
  3. PointF[][] imagePoints,
  4. Size imageSize,
  5. IntrinsicCameraParameters intrinsicParam,
  6. CALIB_TYPE calibrationType,
  7. MCvTermCriteria termCriteria,
  8. out ExtrinsicCameraParameters[] extrinsicParams
  9. )



Parameters

objectPoints
Type: Emgu.CV.Structure.MCvPoint3D32f[][]The 3D location of the object points. The first index is the index of image, second index is the index of the point
imagePoints
Type: System.Drawing..::..PointF[][]The 2D image location of the points. The first index is the index of the image, second index is the index of the point
imageSize
Type: System.Drawing.SizeThe size of the image, used only to initialize intrinsic camera matrix
intrinsicParam
Type: Emgu.CV.IntrinsicCameraParametersThe intrisinc parameters, might contains some initial values. The values will be modified by this function.
calibrationType
Type: Emgu.CV.CvEnum.CALIB_TYPEcCalibration type
termCriteria
Type: Emgu.CV.Structure.MCvTermCriteriaThe termination criteria
extrinsicParams
Type: Emgu.CV.ExtrinsicCameraParameters[]The output array of extrinsic parameters.

Return Value

Type: DoubleThe final reprojection error注:objectPoints表示棋盘角点在世界坐标系下的坐标,有多少幅棋盘图像就应有多少角点坐标集,以物理尺寸为单位。imagePoints表示角点在图像中的坐标,以像素为单位。返回值是重投影误差。

3、映射矩阵求取

[csharp] view plain copy print ?

  1. public static void cvInitUndistortMap(
  2. IntPtr intrinsicMatrix,
  3. IntPtr distortionCoeffs,
  4. IntPtr mapx,
  5. IntPtr mapy
  6. )


Parameters

intrinsicMatrix
Type: System.IntPtrThe camera matrix (A) [fx 0 cx; 0 fy cy; 0 0 1]
distortionCoeffs
Type: System.ntPtrThe vector of distortion coefficients, 4x1 or 1x4 [k1, k2, p1, p2].
mapx
Type: System.IntPtrThe output array of x-coordinates of the map
mapy
Type: System.ntPtrThe output array of y-coordinates of the map

注:定义Matrix类的映射矩阵变量,其属性中包含Ptr,可以直接当指针用,如:

[csharp] view plain copy print ?

  1. private Matrix<float> mapx = new Matrix<float>(height, width);
  2. private Matrix<float> mapy = new Matrix<float>(height, width);

4、几何变换

[csharp]
view plain
copy
print
?

  1. public static void cvRemap(
  2. IntPtr src,
  3. IntPtr dst,
  4. IntPtr mapx,
  5. IntPtr mapy,
  6. int flags,
  7. MCvScalar fillval
  8. )

Parameters

src
Type: System.ntPtr 
Source image
dst
Type: System.IntPtr 
Destination image
mapx
Type: System.IntPtr 
The map of x-coordinates (32fC1 image)
mapy
Type: System.ntPtr 
The map of y-coordinates (32fC1 image)
flags
Type: System.Int32 
A combination of interpolation method and the optional flag CV_WARP_FILL_OUTLIERS
fillval
Type: Emgu.CV.Structure.MCvScalar 
A value used to fill outliers

注:flags定义在 CvEnum下的 WARP枚举类型,调用: (int)WARP.CV_WARP_INVERSE_MAP

程序说明

基于EmguCV摄像机标定及矫正的软件界面如下:

如图所示,界面包含棋盘格信息设置,标定及矫正事件的实现等等。

矫正前后图像对比:

代码实现了从摄像头读取棋盘格图像或者从本地读取图像,图像个数有Imges指定,棋盘格大小有Square Size指定;然后成功检测到角点之后进行摄像头标定,保存角点值和摄像头内参数,通过Rectify按钮实现畸变矫正功能。为避免每次标定时都要检测角点,设置Read Corners按钮,读取角点(包含objectPoints和imagePoints),然后Start Calibrate实现标定。所有的数据都是保存到xml文件中,方便查看和提取。

时间: 2024-10-16 14:34:39

基于EmguCV的摄像机标定及矫正的相关文章

摄像机标定--矫正畸变

之前做过摄像机标定的研究,不过现在忘了好多,昨天下午又捡起来,好好复习一下(主要是学习opencv一书内容). 摄像机标定基本知识: 摄像机标定误差包括内参(4个).畸变参数(径向和切向共5个).外参(平移和旋转共6个). 误差参数分析:摄像机模型采用针孔模型成像模型,由于中心轴安装问题,这就造成了精度误差,就是所谓的相机内参数误差,使用一个3X3的矩阵表示(A) [fx 0 cx; 0 fy cy; 0 0 1].,有四个未知参数:另由于针孔成像采光效率不高,使用了透镜,这就造成的畸变误差:

摄像机标定01

针孔摄像机模型.针孔是一堵想象中的墙(中心有一个微型小孔).光线只能从这个开口中通过,而其余的都被墙所阻挡.下面我们将从一个针孔摄像机模型开始,处理基本几何中的投影射线.遗憾的是,真实的针孔由于不能快速曝光收集足够的光线,因此他不是一个得到图像的好方法.这也是为什么眼睛和摄像机都要使用透镜而不是仅仅只用一个点来收集更多光线的原因.然而,这种利用透镜得到更多光线的缺点是,不仅使我们背离了所使用的简单针孔几何模型,而且引入来自透镜的畸变. 本文将学习如何利用摄像机标定,来矫正(数学方式)因使用透镜而

摄像机标定【转】

1.摄像机外参:决定摄像机坐标与世界坐标系之间相对位置关系. 其中Pw为世界坐标,Pc是摄像机坐标,他们之间关系为 Pc = RPw + T 式中,T= (Tx,Ty,Tz),是平移向量,R = R(α,β,γ)是旋转矩阵,分别是绕摄像机坐标系z轴旋转角度为γ,绕y轴旋转角度为β,绕x轴旋转角度为α.6个参数组成(α,β,γ,Tx,Ty,Tz)为摄像机外参. 2.摄像机内参:确定摄像机从三维空间到二维图像的投影关系. zhenkong摄像机模型为6个参数(f,κ,Sx,Sy,Cx,Cy):远心摄

摄像机标定

转自:http://blog.sina.com.cn/s/blog_b5aa3e0f0101a4tx.html 1.摄像机外参:决定摄像机坐标与世界坐标系之间相对位置关系. 其中Pw为世界坐标,Pc是摄像机坐标,他们之间关系为 Pc = RPw + T 式中,T= (Tx,Ty,Tz),是平移向量,R = R(α,β,γ)是旋转矩阵,分别是绕摄像机坐标系z轴旋转角度为γ,绕y轴旋转角度为β,绕x轴旋转角度为α.6个参数组成(α,β,γ,Tx,Ty,Tz)为摄像机外参. 2.摄像机内参:确定摄像机

C#下的摄像机标定

前言:计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数.在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程称为摄像机标定.标定过程就是确定摄像机的几何和光学参数.摄像机相对于世界坐标系的方位. 内容: 1.假设摄像机所拍摄到的图像与三维空间中的物体之间存在以下一种简单的线性关系:[像]=M[物],这里,矩阵

[OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

部分 VII摄像机标定和 3D 重构 42 摄像机标定 目标 ? 学习摄像机畸变以及摄像机的内部参数和外部参数 ? 学习找到这些参数,对畸变图像进行修复 42.1 基础 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两种:径向畸变和切想畸变.如下图所示,用红色直线将棋盘的两个边标注出来,但是你会发现棋盘的边界并不和红线重合.所有我们认为应该是直线的也都凸出来了.你可以通过访问Distortion (optics)获得更多相关细节. 这种畸变可以通过下面的方程组进行纠正: 于此相似

Matlab 摄像机标定+畸变校正

博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html 对于摄像机我们所关心的主要参数为摄像

基于Emgucv,C#的图片旋转方式

原文:基于Emgucv,C#的图片旋转方式 1 /// <summary> 2 /// 图片旋转 --百度 旋转仿射 3 /// </summary> 4 /// <param name="modelImage"></param> 5 /// <param name="degree"></param> 6 /// <returns></returns> 7 Image&l

利用matlab摄像机标定

(1)输入图像 "Image names"键 Matlab的图形窗口显示出20幅靶标图像 (2) 提取角点 "Extract grid corners"键. 输入要进行角点提取的靶标图像的编号并回车 分别在"wintx ([] = 5) ="和"winty ([] = 5) ="输入行中输入角点提取区域的窗口半宽m和半高n.显示角点提取区域的窗口尺寸(2n+1)x(2m+1),例如,选择缺省时角点提取区域的窗口尺寸为11x11