双目标定算法

坐标系基础知识:

=> 1.1. 从像素坐标系(u,v) 到 世界坐标系(Xw,Yw,Yw)

这里直接拿上篇博文的结果,中间省去了其它坐标系直接的关系,直接给出,如下所示:

这里写图片描述

公式如下:

这里写图片描述

=> 1.2. 符号规定( Notation )

为了和 张正友教授 的论文相统一,现在把公式符号统一一下。

这里写图片描述

=> 1.3. 推导中的数学基础

第一点 : 旋转向量 R 为正交矩阵,所以又以下的性质:

这里写图片描述

第二点 : 就是 S 。它是尺度因子,它的出现只是为了方便运算,而且对于齐次坐标,尺度因子不会改变坐标值 。


=> 2. 正戏

=> 2.1. Step.1 标定平面到图像平面的单应性(Homography)

刚开始不知道论文中 Homography 不知道是何方神圣,搜索到了最后这番解释:

因为张氏标定是一种基于平面棋盘格的标定,所以想要搞懂张氏标定,首先应该从两个平面的单应性(Homography)映射开始着手。

单应性(Homography) : 在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先看一下,图像平面与标定物棋盘格平面的单应性。

因为标定物是平面,所以我们可以把世界坐标系构造在 Z = 0 的平面上。然后进行单应性计算。令 Z = 0 可以将上式转换为如下形式 ( 直接截取论文中的推导 ) :

这里写图片描述

分析:

H 是一个3x3的矩阵,并且有一个元素作为齐次坐标。因此,H有8个未知量待解 ( 可以分析一下, A 有5个未知量,后面的 [r1,r2,t] 有三个未知量,一共8个) 。

(X,Y) 作为标定物的坐标,可以由设计者人为控制,是已知量 。 (u,v) 是像素坐标,我们可以直接通过摄像机获得。一组对应的 (X,Y) => (u,v) 我们可以获得两组方程。

现在有 8个未知量 待求,所以至少要8个方程。所以至少需要4组对应的点。所以有 4组 (X,Y) => (u,v)就可以算出,图像平面到世界平面的 单应性矩阵H ,这也是张正友标定采用四个角点的棋盘作为标定物的一个原因 (?不知道是否正确) 。

=> 2.2. Step.2 利用约束条件求解内参矩阵A

从Step1可知,应用4个点我们可以获得单应性矩阵H。但是H是内参阵和外参阵的合体。我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来。然后外参也就随之解出了。

这里写图片描述

上式中的 h1,h2 是通过求解单应性矩阵 H 求出来的,所以未知量只剩下 内参矩阵A 。 A中含有5个参数,如果需要完全解出来这5个未知量,则需要 3个不同的单应性矩阵H ( 因为 3个不同的单应性矩阵H在2个约束条件下可以产生6个方程 ) , 那么如何得到 3个不同的单应性矩阵H 呢? 那就是 3张不同的标定平面的照片, 我们大多是通过改变摄像机与标定板间的相对位置来获得不同的标定照片。( 如果用2张照片进行标定,就要舍去一个内参 r=0)

当然这只是张正友标定法不断变换标定板方位的 第一个原因 。第二个原因 是张正友提到的 最大似然估计 ( Maximum-Likelihood Estimation ) ( 这个我还得学习 ) 。

现在开始数学课了:

首先令

这里写图片描述

可以看出 矩阵B 是一个对称矩阵,有效的元素只有 6个 ,所以令一个 6维的向量b ,然后简化公式 ( 就是那两个约束条件 )

这里写图片描述

将运算的结果带入到两个约束条件中,可得到方程组:

这里写图片描述

英文部分也提出了3张图片的作用 ( 不懂的可以再看看前面的分析 )

应用上述公式解出b后,就得到了B,在进行 cholesky分解 就可以得到 摄像机内参矩阵A 。

=> 2.3. Step.3 利用内参矩阵A求解外参矩阵

已经有了内参矩阵A,通过下面的公式,就可以解出来,外参矩阵了。

这里写图片描述


=> 3. 总结

以上就是张正友标定法的数学原理和推导,但是张正友自己也说这没有啥实际的物理意义,只是为后面的极大似然参数估计提供初值。而张正友标定中用于提高标定精度的极大似然算法,我也在研究当中,希望以后可以发一篇博客。

 

### 回答1: 双目标定算法是一种寻求最优解的优化算法,它的主要思想是将优化问题分解成两个子问题,然后分别求解它们,最终得到最优解。在python中可以使用scipy库中提供的函数minimize()来解决双目标定算法问题。 ### 回答2: 双目标标定是计算机视觉中的一个重要任务,用于确定双目摄像头的位置和姿态参数。在Python中可以使用OpenCV库来实现双目标定算法。下面是一个简单的示例代码: 首先,导入所需要的库: ```python import numpy as np import cv2 ``` 接下来,定义一个函数来进行双目标定: ```python def stereo_calibration(image_points_left, image_points_right, object_points, image_size): # 定义相机的内参矩阵 camera_matrix_left = np.eye(3, 3) camera_matrix_right = np.eye(3, 3) # 定义畸变系数 distortion_coeffs_left = np.zeros((1, 5)) distortion_coeffs_right = np.zeros((1, 5)) # 进行双目标定 ret, camera_matrix_left, distortion_coeffs_left, camera_matrix_right, distortion_coeffs_right, R, T, E, F = cv2.stereoCalibrate( object_points, image_points_left, image_points_right, camera_matrix_left, distortion_coeffs_left, camera_matrix_right, distortion_coeffs_right, image_size) return ret, camera_matrix_left, distortion_coeffs_left, camera_matrix_right, distortion_coeffs_right, R, T, E, F ``` 参数说明: - `image_points_left`和`image_points_right`是左右摄像头在图像上检测到的角。 - `object_points`是3D空间的角坐标。 - `image_size`是图像的大小。 最后,调用这个函数进行计算并打印结果: ```python image_points_left = ... image_points_right = ... object_points = ... image_size = ... ret, camera_matrix_left, distortion_coeffs_left, camera_matrix_right, distortion_coeffs_right, R, T, E, F = stereo_calibration( image_points_left, image_points_right, object_points, image_size) print("ret:", ret) print("camera_matrix_left:", camera_matrix_left) print("distortion_coeffs_left:", distortion_coeffs_left) print("camera_matrix_right:", camera_matrix_right) print("distortion_coeffs_right:", distortion_coeffs_right) print("R:", R) print("T:", T) print("E:", E) print("F:", F) ``` 这些就是一个简单的双目标定算法的实现。你可以根据你的需求对代码进行修改和优化。 ### 回答3: 双目标定算法是一种基于立体视觉原理,通过计算两个摄像头之间的视差来实现三维目标的定位和测量。下面给出一个简单的基于Python的双目标定算法的实现。 首先,我们需要导入必要的库,如OpenCV、numpy等。 ```python import cv2 import numpy as np ``` 接下来,我们定义一个函数`stereo_matching`来实现立体匹配。它接收两个图像(左右视图)和一些参数作为输入,并输出视差图。 ```python def stereo_matching(left_img, right_img, min_disparity=0, max_disparity=16): # 将图像转换为灰度图 left_gray = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY) right_gray = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY) # 使用SGBM算法进行匹配 stereo = cv2.StereoSGBM_create( minDisparity=min_disparity, numDisparities=max_disparity - min_disparity, blockSize=16, P1=8 * 3 * 3 * 3, P2=32 * 3 * 3 * 3, disp12MaxDiff=1, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32, preFilterCap=63, mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY ) disparity = stereo.compute(left_gray, right_gray) return disparity ``` 在主程序中,我们可以调用`stereo_matching`函数来进行双目标定。首先,读取左右视图图片。 ```python left_img = cv2.imread('left_img.png') right_img = cv2.imread('right_img.png') ``` 然后,调用`stereo_matching`函数来计算视差图。 ```python disparity = stereo_matching(left_img, right_img) ``` 最后,我们可以将视差图显示出来或保存为图片。 ```python cv2.imshow('Disparity', disparity) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('disparity.png', disparity) ``` 这就是一个简单的基于Python的双目标定算法的实现。根据实际需求,你可以根据不同的参数调整算法的性能和结果质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值