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

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

 

目录(?)[+]

 

前言

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

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

函数说明

1、角点检测

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

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

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

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

2、标定函数

  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. )
  1.  
  2.  
  1.  
  1.  

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、映射矩阵求取

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

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,可以直接当指针用,如:

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

4、几何变换

  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文件中,方便查看和提取。

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

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

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...

  2. halcon摄像机标定

    摄像机标定程序: 注意:E:/calibration_image :为标定图像文件路径       'E:/calibration_description/caltab_123mm.descr:为标定 ...

  3. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  4. [zt]摄像机标定(Camera calibration)笔记

    http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...

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

    部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...

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

      摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...

  7. 相机标定与矫正opencv+MATLAB

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  8. Matlab 摄像机标定+畸变校正

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  9. C#下的摄像机标定

    前言:计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决 ...

随机推荐

  1. MD markdown入门

    1.Headings: 2.Phrase emphasis *italic text* **Bold text** 3.Listing items (在文字之前添加 + , - 或者 * ) -ite ...

  2. BZOJ3130: [Sdoi2013]费用流(二分,最大流)

    Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识.    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...

  3. 数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager

    iOS应用数据存储的常用方式:  1.XML属性列表   (plist归档)  2.NSUserDefaults (偏好设置)  3.NSKeyedArchiver  归档(加密形式)  4.SQLi ...

  4. ios程序启动过程和UIWidnow介绍

    一.iOS程序的完整启动过程(有storyboard) 1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicationMain函数里面做了什么事情: ...

  5. 洛谷 P1732 [TJOI2011]序列

    P1732 [TJOI2011]序列 题目描述 一指数列A={a1, a2, …, an},根据数列A计算数列B={b1, b2, …, bn},其中: 求\sum\limits^n_{i=1} b_ ...

  6. vim-缓存区中打开另外一个文件的方法

    现在有这么一种情况:    我现在在ubuntu用户根目录下--    我根目录下有一个文件夹blogs,这个文件夹下面有两个文件:text1,text2.    我现在从-目录下进行如下操作    ...

  7. 漫漫人生路-学点Jakarta基础-Java8新特性 Stream/Lambda

    背景 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk dat ...

  8. geotif格式的波段描述信息探究

    作者:朱金灿 来源:http://blog.csdn.net/clever101 有时打开一些geotif文件,可以看到它的波段描述,但是它究竟存储在文件的什么位置呢?今天研究了一下,大致搞清了这个问 ...

  9. 虚拟局域网(VLAN)技术在企业网管理中的应用

    虚拟局域网(VLAN)技术在企业网管理中的应用 1.VLAN介绍     所谓VLAN 是指处于不同物理位置的节点根据需要组成不同的逻辑子网,即一个VLAN 就是一个逻辑广播域,它可以覆盖多个网络设备 ...

  10. Android ijkplayer详解使用教程

    1.认识ijkplayer 最近公司准备开发一款视频播放及直播的应用,找了许多开源的框架,大部分都是基于ffmpeg开发的.最开始准备用Vitamio框架开发的,相关的文章也比较丰富,结果对于非个人移 ...