概述
-
根据张正友相机标定原理(具体请看论文,这里不介绍是因为论文奖的很透彻,是很好的学习资料),首先需要求得单应矩阵,目的是为了得到世界坐标到像素点的映射关系。其中包含了内参和当前标定板下的外参,在后面的标定过程中通过分解单应矩阵得到内外参的初始值。
-
因为论文写的详细,求解方法就是使用最小二乘拟合求解超定方程。代码就是张相机标定的Python实现。
简要介绍:
- 代码结构
- Data IO
- 读取相机上角点的成像坐标,单位是像素
- 读取世界坐标,如果是标定板,那就是在标定版建立的,单位是m
- SVD求解线性方程
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.单应矩阵求解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复