我是靠谱客的博主 仁爱玫瑰,这篇文章主要介绍相机标定--1.单应矩阵求解,现在分享给大家,希望可以做个参考。

  • 根据张正友相机标定原理(具体请看论文,这里不介绍是因为论文奖的很透彻,是很好的学习资料),首先需要求得单应矩阵,目的是为了得到世界坐标到像素点的映射关系。其中包含了内参和当前标定板下的外参,在后面的标定过程中通过分解单应矩阵得到内外参的初始值。

  • 因为论文写的详细,求解方法就是使用最小二乘拟合求解超定方程。代码就是张相机标定的Python实现。

简要介绍:

  1. 代码结构
  • Data IO
  1. 读取相机上角点的成像坐标,单位是像素
  2. 读取世界坐标,如果是标定板,那就是在标定版建立的,单位是m
  • SVD求解线性方程
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import os import numpy as np import cv2 from scipy import linalg if __name__ == '__main__': print('求解单应矩阵') # 读取内参数据 # 所有文件 files = os.listdir('数据/内参') # print(files) V = [] H_buf = [] for file_name in files: # 不同文件对应不同的但应矩阵,所以需要分别求解 points_img_x = [] points_img_y = [] points_w_x = [] points_w_y = [] points_w_z = [] print(file_name) ofile = open('数据/内参/' + file_name) lines = ofile.readlines() # 构造方程数据 A = [] b = [] for line in lines: # 每一行 这边的数据解析根据自己的数据格式修改 # 第一种格式,为了迎合opencv验证代码 # points_list.append(float(line[:3])) # 序号 points_img_x.append(float(line[6:17])) points_img_y.append(float(line[19:32])) points_w_x.append(float(line[33:44])) points_w_y.append(float(line[45:57])) points_w_z.append(float(line[59:69])) # 第二种格式 直接将点弄到A和b里面 point_img_x = float(line[6:17]) point_img_y = float(line[19:32]) point_w_x = float(line[33:44]) point_w_y = float(line[45:57]) # A.append([point_w_x, point_w_y, 1, 0, 0, 0, -1 * point_w_x * point_img_x, -1 * point_w_y * point_img_x]) A.append([0, 0, 0, point_w_x, point_w_y, 1, -1 * point_w_x * point_img_y, -1 * point_w_y * point_img_y]) # b.append(point_img_x) b.append(point_img_y) points_img = np.array([points_img_x, points_img_y]).transpose() # points_w = np.array([points_w_x, points_w_y, points_w_z]).transpose() points_w = np.array([points_w_x, points_w_y]).transpose() # 和opencv的函数作对比 说明H求的没问题! # srcPoints, dstPoints, method=None, ransacReprojThreshold=None, mask=None, maxIters=None, confidence=None h = cv2.findHomography(points_w, points_img, method=cv2.RANSAC) print('h:', h[0]) print(len(points_img)) print(len(points_w)) A = np.array(A) b = np.array(b) print('A.shape:', A.shape) print('b.shape:', b.shape) x = np.linalg.lstsq(A, b, rcond=None) x = x[0] print('包含单应矩阵参数的x:n', x) # print('re-project test Ax=:n', np.dot(A, x[0])) # print('b=', b) # 恢复H的形状 H = np.array([[x[0], x[1], x[2]], [x[3], x[4], x[5]], [x[6], x[7], 1]]) print('H:n', H) H_buf.append(H)

最后

以上就是仁爱玫瑰最近收集整理的关于相机标定--1.单应矩阵求解的全部内容,更多相关相机标定--1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部