zoukankan      html  css  js  c++  java
  • 基于EmguCV的摄像机标定及矫正

    标签: EmguCV摄像头标定C#
     分类:
    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. )  
    
    
    
    

    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、标定函数

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

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

  • 相关阅读:
    java 整合 ssm (spring+ springmvc+ mybatis)
    java spring 事物 ( 已转账为例 ) 基于 aop 注解
    java spring 事物 ( 已转账为例 ) 基于 xml 配置,事务类型说明
    JAVA Spring 面向切面编程 基本案例(AOP)
    java websocket 简单的聊天室
    java websocket 实现简单的前后端即时通信
    js 通过文件输入框读取文件为 base64 文件, 并借助 canvas 压缩 FileReader, files, drawImage
    js 使用 XMLHttpRequest 请求发送 formdata 对象,从而上传文件
    html5 canvas ( 创建图形对象 ) createImageData
    编写Shell脚本的最佳实践
  • 原文地址:https://www.cnblogs.com/gosteps/p/5289879.html
Copyright © 2011-2022 走看看