手机广角相机标定和畸变校正

摄像头或者相机会因为镜片的光学特性而发生有规律的变形或者畸变,包括桶型畸变,枕型畸变和线性畸变。普通相机的这些畸变十分轻微,人的肉眼几乎分辨不出,所以这时可以不需要校正。对于广角相机,鱼眼相机,由于视角极大,相机透镜的物理属性十分明显,从而容易导致相片极度畸变,这时除了一些追求特殊艺术效果的场合,大部分情况下都需要校正。

这里使用OPENCV算法对相机标定和畸变校正。OPENCV是非常牛B的图像,视频,相机处理算法库,封装了图像计算,图像处理,分像解析,图像分离,图像切割,图像识别,图像滤镜,图像查找,图像匹配等十分强大的函数库。在VR,AR,3D,二维码,车牌,身份证,银行卡识别方面也应用很广。OPENCV底层使用C和C++实现,这使其也有十分优异的速度。智能手机可以使用很多种访求调用OPENCV完成工作,android从早期的JNI和现在的服务调用。从调用方式上来说是越来越简单了,但从应用角度来说,却是选择越来越多,根据不同场合和需求,既可以直接原始JNI,也可以使用JAR调用C,还可以通过OPENCV MANAGER的服务实现。

摄像头或者相机,或者图片的校正分两个步骤,一是标定,二是反畸变。标定过程是求出摄像头或者相机或者图片的畸变参数,通过这些参数使用特定畸变算法对图像进行校正。

 

1.相机标定算法比较复杂,详情参考我的前面博客。这里不再对算法做具体解释说明,只简单介绍一下标定的方法。在OPECV中,标定有两种算法,一种是棋盘纸,类似方格子纸,一种是圆圈阵列纸,两种方法实现的原理一样,都是通过分析图像上固定角点的位置实现,取得的标定的参数也一样,下面具体实现代码,我通过一个布尔变量使得我们的校正算法可以兼容棋盘和圆圈阵列两种方式。核心函数是findCirclesGrid和findChessboardCorners

boolean isChessboard = false;
private void findPattern(Mat grayFrame) {
    isChessboard = false;
    mPatternWasFound = Calib3d.findCirclesGrid(grayFrame, mPatternSize,
            mCorners, Calib3d.CALIB_CB_ASYMMETRIC_GRID);
    if (!mPatternWasFound) {
        isChessboard = true;
        mPatternWasFound = Calib3d.findChessboardCorners(grayFrame, mPatternSize2,
                mCorners, Calib3d.CALIB_CB_NORMALIZE_IMAGE + Calib3d.CALIB_CB_ADAPTIVE_THRESH + Calib3d.CALIB_CB_FAST_CHECK);
    }

}

 

2.求得到角点会在后面转为畸变矩阵存储mDistortionCoefficients,以备反畸变算法调用。核心函数是calibrateCamera

public void calibrate() {
    ArrayList<Mat> rvecs = new ArrayList<Mat>();
    ArrayList<Mat> tvecs = new ArrayList<Mat>();
    Mat reprojectionErrors = new Mat();
    ArrayList<Mat> objectPoints = new ArrayList<Mat>();
    if (isChessboard){
        objectPoints.add(Mat.zeros(mCornersSize2, 1, CvType.CV_32FC3));
    }else {
        objectPoints.add(Mat.zeros(mCornersSize, 1, CvType.CV_32FC3));
    }
    calcBoardCornerPositions(objectPoints.get(0));
    for (int i = 1; i < mCornersBuffer.size(); i++) {
        objectPoints.add(objectPoints.get(0));
    }

    Calib3d.calibrateCamera(objectPoints, mCornersBuffer, mImageSize,
            mCameraMatrix, mDistortionCoefficients, rvecs, tvecs, mFlags);

    mIsCalibrated = Core.checkRange(mCameraMatrix)
            && Core.checkRange(mDistortionCoefficients);

    mRms = computeReprojectionErrors(objectPoints, rvecs, tvecs, reprojectionErrors);
    Log.i(TAG, String.format("Average re-projection error: %f", mRms));
    Log.i(TAG, "Camera matrix: " + mCameraMatrix.dump());
    Log.i(TAG, "Distortion coefficients: " + mDistortionCoefficients.dump());
}

3.最后使用反畸变函数undistort把校正后的图像还原。

public Mat render(CvCameraViewFrame inputFrame) {
    Mat renderedFrame = new Mat(inputFrame.rgba().size(), inputFrame.rgba().type());
    Imgproc.undistort(inputFrame.rgba(), renderedFrame,
            mCalibrator.getCameraMatrix(), mCalibrator.getDistortionCoefficients());

    return renderedFrame;
}

4两种算法的标定比较,两种方法是独立的,都可以达到标定的目的,棋盘纸的方法比较比较慢,圆圈阵列比较快,在低端手机上校正,可以使用圆圈阵列。

 

5.源码下载地址:

https://github.com/blogercn/CameraCalibration

 使用方法,代码编绎APP装入手机中

校正前校正前畸变十分严重,方形屏幕成了流体体



棋盘纸校正



圆圈阵列校正

校正后


前后对比



  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
广角镜头相机是一种具有广阔视角的镜头,可以捕捉更广阔的景物或场景。而Halcon则是一种基于机器视觉的软件开发工具,能够提供强大的图像处理和分析功能。Halcon标定是通过Halcon软件对广角镜头相机进行参数设置和校准,以确保相机捕捉到的图像具有更高的准确性和稳定性。 Halcon标定主要包括相机外参和内参两个方面。相机外参指相机在世界坐标系中的位置和姿态信息,通过给定的物体点在图像中的对应位置,可以计算出相机在空间中的坐标和角度。相机内参则是指相机自身的参数,如焦距、主点坐标等。这些参数对于图像的畸变校正和准确的测量至关重要。 在Halcon标定过程中,我们需要使用一些已知的3D物体,它们均匀地分布在相机的视野范围内,同时还需准备一个灰度棋盘格图案作为校准板。首先,我们需要利用Halcon的标定工具,对相机内参进行标定,即测量焦距和主点坐标等参数。然后,我们将校准板放置在不同的位置和角度,利用相机捕捉到的校准板图像,计算出相机的外参。 通过Halcon标定,我们可以得到准确的相机参数,从而可以进行图像处理、模型测量和目标识别等应用。此外,标定结果还可以用于校正图像中的畸变,使得图像更加真实和可靠。总之,Halcon标定广角镜头相机带来了更大的应用潜力,提高了图像的准确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值