基于EmguCV的摄像机标定及矫正
版权声明:本文为博主原创文章,未经博主允许不得转载。
前言
之前用OpenCV做过摄像机标定及矫正,现在平台换了,改用C#,就用EmguCV做一下,其实就是OpenCV的C#版。
在EmguCV中有两类摄像机标定的类,一个是CvInvoke类,一个是CameraCalibration类,两种标定效果差不多,只不过CvInvoke涉及的函数大多都是指针类型的,而C#对于指针的操作比较麻烦。本文是在CameraCalibration类的基础上完成摄像机标定,用CvInvoke类完成矫正图像。
函数说明
1、角点检测
- public static PointF[] FindChessboardCorners(
- Image<Gray, byte> image,
- Size patternSize,
- CALIB_CB_TYPE flags
- )
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
注:输入图像需是灰度图,检测之前角点需要开辟空间,如:
- cornersDetected = new PointF[nPoints]; //nPoints表示单幅图像角点总数
- cornersDetected = CameraCalibration.FindChessboardCorners(chessboardImage, patternSize,
- CALIB_CB_TYPE.ADAPTIVE_THRESH | CALIB_CB_TYPE.NORMALIZE_IMAGE);
2、标定函数
- public static double CalibrateCamera(
- MCvPoint3D32f[][] objectPoints,
- PointF[][] imagePoints,
- Size imageSize,
- IntrinsicCameraParameters intrinsicParam,
- CALIB_TYPE calibrationType,
- MCvTermCriteria termCriteria,
- out ExtrinsicCameraParameters[] extrinsicParams
- )
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、映射矩阵求取
- public static void cvInitUndistortMap(
- IntPtr intrinsicMatrix,
- IntPtr distortionCoeffs,
- IntPtr mapx,
- IntPtr mapy
- )
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,可以直接当指针用,如:
- private Matrix<float> mapx = new Matrix<float>(height, width);
- private Matrix<float> mapy = new Matrix<float>(height, width);
4、几何变换
- public static void cvRemap(
- IntPtr src,
- IntPtr dst,
- IntPtr mapx,
- IntPtr mapy,
- int flags,
- MCvScalar fillval
- )
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的摄像机标定及矫正的更多相关文章
- 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定
本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...
- halcon摄像机标定
摄像机标定程序: 注意:E:/calibration_image :为标定图像文件路径 'E:/calibration_description/caltab_123mm.descr:为标定 ...
- 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII
部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...
- 【OpenCV】摄像机标定+畸变校正
摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...
- 相机标定与矫正opencv+MATLAB
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- Matlab 摄像机标定+畸变校正
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- C#下的摄像机标定
前言:计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决 ...
随机推荐
- happy Mom ——php mysqli DES加密
看完<爱你就像爱生命>这本书,真的看出小波哥很有才,跟小波哥比起来,我唯一拿的出手的可能就是我比他的颜值了.想起一句话,人不是因为美丽而可爱,而是因为可爱而美丽.所以我对我的要求是,继续修 ...
- 【Henu ACM Round#17 C】Kitahara Haruki's Gift
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 判断sum/2这个价值能不能得到就可以了. 则就是一个01背包模型了. 判断某个价值能否得到. f[j]表示价值j能否得到. f[0 ...
- 解决切换场景时NGUI图集资源未释放的问题
使用unity3d编辑器,在切换场景的时候.NGUI的图集没有释放造成内存不足游戏闪退的问题. 默认情况下,unity3d切换场景之后会释放不用的内存,即内部会调用Resources.UnloadUn ...
- 你如何理解 HTML5 的 section?会在什么场景使用?为什么这些场景使用 section 而不是 div?
section元素表示文档或应用的一个部分.所谓“部分”,这里是指按照主题分组的内容区域,通常会带有标题.[也就是每个section对应不同的主题.注意是内容本身的主题,而不是其他人为设定的划分标准. ...
- Vue项目自动转换 px 为 rem,高保真还原设计图
技术栈 vue-cli:使用脚手架工具创建项目. postcss-pxtorem:转换px为rem的插件. 自动设置根节点html的font-size 因为rem单位是相对于根节点的字体大小的,所以通 ...
- js全局的解析与执行过程
先看下面实例的执行结果: alert(a);//undefined alert(b);//报错 alert(f);//输出f函数字符串 alert(g);//undefined var a = 1; ...
- $.each(data, function (index, value) { })的用法;json和list<>的互相转换
在json中常常碰到这样的代码: jquery $.each(data, function (index, value) { }) 遍历处理data,可以是数组.DOM.json等,取决于直接给 ...
- IFC数据模式架构的四个概念层
IFC模型体系结构由四个层次构成, 从下到上依次是 资源层(Resource Layer).核心层(Core Layer).交互层(Interoperability Layer).领域层(Domain ...
- postgresql 不同数据库不同模式下的数据迁移
编写不容易,转载请注明出处谢谢, 数据迁移 因为之前爬虫的时候,一部分数据并没有上传到服务器,在本地.本来用的就是postgresql,也没用多久,数据迁移的时候,也遇到了很多问题,第一次使pg_du ...
- JavaScript学习总结(10)——实用JS代码大全
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event. ...