计算机视觉 - 相机建模和参数校准
目录
相机参数标定
一、相机内参矩阵原理
二、相机标定方法——张正友标定法
2.1方法描述
2.2计算内参和外参的初值
三、实验:Matlab实现
3.1实验数据
3.2实验过程
3.3实验结果
四、实验总结
相机参数标定
在拍摄中,相机可能会出现畸变,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变
不同的镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像。
一、相机内参矩阵原理
设P=(X,Y,Z)为场景中的一点,在针孔相机模型中,其要经过以下几个变换,最终变为二维图像上的像点p=(μ,ν)
1、将P从世界坐标系通过刚体变换(旋转和平移)变换到相机坐标系,这个变换过程使用的是相机间的相对位姿,也就是相机的外参数。
2、从相机坐标系,通过透视投影变换到相机的成像平面上的像点p=(x,y)
3、将像点p从成像坐标系,通过缩放和平移变换到像素坐标系上点p=(μ,ν)
相机将场景中的三维点变换为图像中的二维点,也就是各个坐标系变换的组合,可将上面的变换过程整理为矩阵相乘的形式
二、相机标定方法——张正友标定法
2.1方法描述
使用棋盘格标定的方法,将照片中的三维信息压缩为二维(Z=0)
在张氏标定法中,用于标定的棋盘格是三维场景中的一个平面Π,其在成像平面的像是另一个平面π,知道了两个平面的对应点的坐标,就可以求解得到两个平面的单应矩阵H。其中,标定的棋盘格是特制的,其角点的坐标是已知的;图像中的角点,可以通过角点提取算法得到(如Harris角点),这样就可以得到棋盘平面Π和图像平面π的单应矩阵H。
方法步骤:
1、检测每张图片中的棋盘图案的角点;
2、利用解析解估算方法计算出5个内部参数,以及6个外部参数
3、通过基于极大似然准则的优化解,提高A,R,t矩阵的精度。
2.2计算内参和外参的初值
1、计算单应性矩阵H
棋盘格平面到图像平面的单应性关系为:
其中s为尺度因子,K为摄像机内参数,R为旋转矩阵,T为平移向量。令
s对于齐次坐标来说,不会改变齐次坐标值。张氏标定法中,将世界坐标系狗仔在棋盘格平面上,令棋盘格平面为Z=0的平面。则可得
我们把K[r1, r2, t]叫做单应性矩阵H,即
2、计算内参数矩阵
3、计算外参数矩阵
三、实验:Matlab实现
3.1实验数据
我准备了共20张的棋盘数据,在电脑上绘制黑白棋盘表格,并通过测量确定每个小正方格的长宽为 2.54厘米 ,然后再使用手机对棋盘进行拍摄,同时具有角度变换和距离变换等设置。
3.2实验过程
3.2.1实验要求
1.制作棋盘格(每个格子的大小可测量),最好是打印出来,贴在平面上(实在不行就用我刚才演示的黑白棋盘格方法)
2.根据棋盘格,采集10-20张图片,提取角点
3.解算出内外参数,内参截图放在博客中,外部参数最好能可视化
3.2.2标定步骤
3.2.3使用MATLAB自带的工具箱进行标定
MATLAB(matlab calibration toolbox-Matlab标定工具箱使用(单目标定和双目标定)
3.3实验结果
IntrinsicMatrix: [3x3 double] 内参矩阵
四、实验总结
1.Harris角点检测能够快速准确的检测到棋盘网格的边角,这对图像位置信息和空间坐标的标定参考提供了重要的数据。
2.在图片的分析当中,并不是所有拍摄的20张图片都被筛选进标定实验,其中很多不符合设置的,例如光线强度过大、角度变换过大等等影响到了角点检测和参数标定的图片都会被剔除,所以在一开始准备数据时就应该添加更多的图片以增加成功率,在本次实验中就被剔除了8张不合格的图片。
3.从最后的实验结果中,可以知道,我的手机相机的各种内部参数和外部参数。由于每部相机的生产过程当中,或多或少的都会产生一定的误差,而且这些误差也让每一部相机变得独一无二,所以每个人的相机参数都不会完全相同。
4.观察每张标定图可以发现,每张图中设置的X,Y和起始点设置都不是完全一样的,它会根据图片的旋转和角度等因素调整坐标系,说明图片的旋转和角度变换不会影响到标定结果。
上一篇: Opencv 摄像机内部参数校准和使用-III.图像采集
下一篇: 摄像机校准的目的:获得摄像机的内外参考矩阵(同时获得每幅校准图像的选择矩阵和平移矩阵),内外参考系数可以对之后摄像机拍摄的图像进行校正,得到像差相对较小的图像。
推荐阅读
-
计算机视觉 - 相机校准
-
计算机视觉 - 相机建模和参数校准
-
计算机视觉(相机校准;内部参考;外部参考;失真系数)
-
计算机视觉教程 0-3:拍照时为什么会出现死亡视图?解释相机矩阵和像差
-
计算机视觉 - 机内和机外参数
-
相机-IMU 内部和外部参数校准原理详解
-
双目视觉 (II) 相机校准和图像校正
-
用于 ROS+Opencv 的双目相机校准和 orbslam 双目参数匹配
-
为计算机视觉 LIFE 重印相机模型、单应力矩阵和内外部参数采集
-
[姿势估计] 实践记录:使用 Dlib 和 mediapipe 进行人脸姿势估计 - 本文重点介绍方法 2):方法 1:基于深度学习的方法:。 基于深度学习的方法:基于深度学习的方法利用深度学习模型,如卷积神经网络(CNN)或递归神经网络(RNN),直接从人脸图像中学习姿势估计。这些方法能够学习更复杂的特征表征,并在大规模数据集上取得优异的性能。方法二:基于二维校准信息估计三维姿态信息(计算机视觉 PnP 问题)。 特征点定位:人脸姿态估计的第一步是通过特征点定位来检测和定位人脸的关键点,如眼睛、鼻子和嘴巴。这些关键点提供了人脸的局部结构信息,可用于后续的姿势估计。 旋转表示:常见的旋转表示方法包括欧拉角和旋转矩阵。欧拉角通过三个旋转角度(通常是俯仰、偏航和滚动)描述头部的旋转姿态。旋转矩阵是一个 3x3 矩阵,表示头部从一个坐标系到另一个坐标系的变换。 三维模型重建:根据特征点的定位结果,三维人脸模型可用于姿势估计。通过将人脸的二维图像映射到三维模型上,可以估算出人脸的旋转和平移信息。这就需要建立人脸的三维模型,然后通过优化方法将模型与特征点对齐,从而获得姿势估计结果。 特征点定位 特征点定位是用于检测人脸关键部位的五官基础部分,还有其他更多的特征点表示方法,大家可以参考我上一篇文章中介绍的特征点检测方案实践:人脸校正二次定位操作来解决人脸校正的问题,客户在检测关键点的代码上略有修改,坐标转换部分客户见上图 def get_face_info(image). img_copy = image.copy image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = face_detection.process(image) # 在图像上绘制人脸检测注释。 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) box_info, facial = None, None if results.detections: for detection in results. for detection in results.detections: mp_drawing.Drawing.detection = 无 mp_drawing.draw_detection(image, detection) 面部 = detection.location_data.relative_keypoints 返回面部 在上述代码中,返回的数据是五官(6 个关键点的坐标),这是用 mediapipe 库实现的,下面我们可以尝试用另一个库:dlib 来实现。 使用 dlib 使用 Dlib 库在 Python 中实现人脸关键点检测的步骤如下: 确保已安装 Dlib 库,可使用以下命令: pip install dlib 导入必要的库: 加载 Dlib 的人脸检测器和关键点检测器模型: 读取图像并将其灰度化: 使用人脸检测器检测图像中的人脸: 对检测到的人脸进行遍历,并使用关键点检测器检测人脸关键点: 显示绘制了关键点的图像: 以下代码将参数 landmarks_part 添加到要返回的关键点坐标中。