ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

相机标定与畸变矫正,解决的是同一个问题的两端:标定是“搞清楚相机把世界扭曲成了什么样”,矫正是“把扭曲的图像拉回正常”。

相机标定与畸变矫正,解决的是同一个问题的两端:标定是“搞清楚相机把世界扭曲成了什么样”,矫正是“把扭曲的图像拉回正常”。 相机标定与畸变矫正解决的是同一个问题的两端标定是“搞清楚相机把世界扭曲成了什么样”矫正是“把扭曲的图像拉回正常”。为什么需要标定工业视觉测量的前提是图像中的像素坐标和真实世界的物理坐标之间存在确定的对应关系。但这个关系不是简单的线性缩放——镜头会引入畸变相机安装角度会引入透视变形。标定的目标就是求解相机的内参和外参内参描述相机自身的特性焦距fx, fy、主点cx, cy、畸变系数k1, k2, p1, p2, k3。这些参数一旦标定只要相机和镜头不动就保持不变。外参描述相机相对于世界坐标系的位置和姿态旋转矩阵 R 和平移向量 t。如果相机移动了外参需要重新标定。畸变镜头的“先天缺陷”畸变主要分两类径向畸变由镜头形状引起表现为图像边缘的“桶形”或“枕形”弯曲。直线拍出来变成弯的就是径向畸变。它用 k1、k2、k3 三个系数描述越靠近边缘越明显。切向畸变由镜头和传感器不平行引起表现为图像的“剪切”变形。它用 p1、p2 两个系数描述通常比径向畸变小得多。畸变模型的核心公式是x_distorted x(1 k1r² k2r⁴ k3r⁶) 2p1xy p2(r² 2x²) y_distorted y(1 k1r² k2r⁴ k3r⁶) p1(r² 2y²) 2p2xy其中 r² x² y²。标定的过程就是通过已知的世界坐标和对应的图像坐标反解出 k1、k2、p1、p2、k3 这些系数。标定流程用棋盘格求解第一步制作标定板。最常用的是棋盘格标定板黑白方格交替每个方格的物理尺寸已知如 10mm。棋盘格的优势是角点检测精度高OpenCV 和 Halcon 都有现成的角点检测算子。第二步拍摄多张不同姿态的标定板图像。一般需要 10-20 张覆盖图像的各个区域中心、四角、边缘并且标定板要有不同的倾斜角度。只拍正对相机的图标定结果会不准——因为畸变在边缘最明显必须让标定板出现在图像边缘。第三步检测角点。OpenCV 用FindChessboardCorners找到棋盘格的内角点再用CornerSubPix做亚像素精化。// OpenCV 标定varobjectPointsnewListMat();varimagePointsnewListMat();SizeboardSizenewSize(9,6);// 内角点数floatsquareSize10.0f;// 方格物理尺寸 mm// 对每张标定图MatgraynewMat();Cv2.CvtColor(image,gray,ColorConversionCodes.BGR2GRAY);varcornersnewListPoint2f();boolfoundCv2.FindChessboardCorners(gray,boardSize,corners);if(found){Cv2.CornerSubPix(gray,corners,newSize(11,11),newSize(-1,-1),newTermCriteria(CriteriaTypes.Eps|CriteriaTypes.MaxIter,30,0.001));imagePoints.Add(Mat.FromArray(corners.ToArray()));objectPoints.Add(GenerateObjectPoints(boardSize,squareSize));}// 标定MatcameraMatrixnewMat();MatdistCoeffsnewMat();Cv2.CalibrateCamera(objectPoints,imagePoints,gray.Size(),cameraMatrix,distCoeffs,out_,out_);第四步评估标定质量。CalibrateCamera返回的重投影误差reprojection error是核心指标。它表示用标定出的参数把世界点投影回图像后与检测到的角点之间的平均偏差。小于 0.5 像素算好小于 0.2 像素算优秀。如果误差大于 1 像素说明标定板图像质量有问题或者姿态覆盖不够。畸变矫正两种方式方式一Undistort直接矫正。对整幅图像做畸变矫正输出一张“拉直”的图。适合需要保存矫正后图像的场景。MatundistortednewMat();Cv2.Undistort(src,undistorted,cameraMatrix,distCoeffs);方式二InitUndistortRectifyMapRemap。预先计算矫正映射表后续每帧用Remap快速应用。高帧率场景必须用这种方式因为映射表只算一次每帧只做查表操作。Matmap1newMat(),map2newMat();Cv2.InitUndistortRectifyMap(cameraMatrix,distCoeffs,newMat(),cameraMatrix,imageSize,MatType.CV_32FC1,map1,map2);// 每帧Cv2.Remap(src,dst,map1,map2,InterpolationFlags.Linear);工业实操要点标定板要覆盖整个视野。畸变在图像边缘最严重如果标定板只在中心区域拍摄边缘的畸变系数就标不准。正确做法是让标定板出现在图像的中心、四角、四边每个位置都有不同倾斜角度的图像。标定后不要动相机和镜头。一旦标定完成相机和镜头的相对位置、焦距、光圈都不能再变。动了任何一个标定就失效了。工业现场通常把相机和镜头锁死标定一次用很久。畸变矫正会损失边缘像素。矫正后图像边缘可能被“拉”出视野或者出现黑边。如果检测区域靠近图像边缘需要预留余量。精度要求极高时用远心镜头。远心镜头的畸变极小几乎不需要矫正而且没有透视误差。代价是视野小、工作距离固定、价格高。一句话总结标定是用已知尺寸的标定板反解出相机的内参和畸变系数。矫正是用这些系数把畸变图像拉直。标定的质量决定了测量的上限——重投影误差小于 0.2 像素是工业级标定的基本门槛。
返回列表