详细流程讲解:
https://blog.csdn.net/dcrmg/article/details/52939318
opencv官方文档翻译版:
https://www.cnblogs.com/wildbloom/p/8320351.html
相机标定是进行视觉测量和定位的基础工作之一,标定参数准确与否直接关系到整个系统的精度,为此根据自己项目中的经验及参考相关的商用视觉软件的做法将相机标定过程中标定图片的获取过程中需要注意的问题总结如下:
标定板拍摄的张数要能覆盖整个测量空间及整个测量视场,把相机图像分成四个象限(如图1所示),应保证拍摄的标定板图像均匀分布在四个象限中,且在每个象限中建议进行不同方向的两次倾斜,图2是一组推荐摆放方式图片。
标定图片的数量通常在15~25张之间,图像数量太少,容易导致标定参数不准确。
圆或者圆环特征的像素数尽量大于20,标定板的成像尺寸应大致占整幅画面的1/4
用辅助光源对标定板进行打光,保证标定板的亮度足够且均匀
标定板成像不能过爆,过爆会导致特征轮廓的提取的偏移,从而导致圆心提取不准确。
标定板特征成像不能出现明显的离焦距,出现离焦时可通过调整调整标定板的距离、光圈的大小和像距(对于定焦镜头,通常说的调焦就是指调整像距)。
标定过程,相机的光圈、焦距不能发生改变,改变需要重新标定。
---------------------
作者:半路猿
来源:CSDN
原文:https://blog.csdn.net/j_shui/article/details/77262947
版权声明:本文为博主原创文章,转载请附上博文链接!
retval, corners =cv.findChessboardCorners(image, patternSize[, corners[, flags]])
参数:
image:棋盘图像,8位灰度或彩色图像。
patternSize:棋盘的尺寸(注意应为内角点个数,内角点是和其他格子连着的点,边边上的不是!!不是不是不是有几个方格!!比如说“田”字只有一个内角点!!)
corners:存放角点的位置。
flags:迭代的准则
返回值:
retval:是否检测出角点
corners:角点的位置。
corners = cv.cornerSubPix( image, corners, winSize, zeroZone, criteria )
参数:
image:输入图像,8位或者float型。
corners:角点初始坐标。
winsize:搜索窗口为2*winsize+1。
zerozone:死区,不计算区域,避免自相关矩阵的奇异性。没有死区,参数为(-1,-1)
criteria:求角点的迭代终止条件。
返回值:
corner:角点位置。
image =cv.drawChessboardCorners(image, patternSize, corners, patternWasFound )
patternWasFound:标志位,检测是否所有board(不太理解什么意思?)都被检测到,若为是,则将角点连线,否则不连线。
其他同2。
retval, cameraMatrix, distCoeffs, rvecs, tvecs =
cv.calibrateCamera(
objectPoints, imagePoints, imageSize, cameraMatrix,
distCoeffs[, rvecs[, tvecs[, flags[, criteria]]]]
)
objectPoints:世界坐标系里的位置。
imagePoints: 像素坐标。
imageSize:为图像的像素尺寸大小。
cameraMatrix:3*3矩阵,相机内参数矩阵。
disCoeffs:畸变矩阵
rvecs:旋转向量
tvecs:位移向量
flags:标定采用的算法
criteria:迭代终止条件设定。
retval, validPixROI = cv.getOptimalNewCameraMatrix(
cameraMatrix, distCoeffs, imageSize,
alpha[, newImgSize[, centerPrincipalPoint]] )
这个函数是为了微调参数,使图像不会在矫正过程中丢失很多像素,导致被矫正的过小。
imageSize:原始图像尺寸。
newImageSize:校正后图像尺寸。
alpha:取0或1。0返回剪裁后图像,1返回有黑色区域的图像,ROI是一个矩形框,圈出最优的裁切范围。详情请看:
https://www.cnblogs.com/riddick/p/6711263.html
总结一下:就是因为矫正,留下了很多黑色空洞,为了剪掉黑色区域并且保持原图像比例,opencv丢掉了很多像素,因此像素出现了缺失。
centerPrincipalPoint:是否作用于中心。默认为opencv自己根据图像选择位置。
dst = cv.undistort( src, cameraMatrix, distCoeffs[, dst[, newCameraMatrix]] )
scr:待矫正图片。
dst:输出图像。