title:
根据标定点计算R_t矩阵_单应性矩阵方法
一种通过标定像素点和其对应经纬度值 构成映射,来计算视频图像内目标经纬度的方法。
ref:
https://blog.csdn.net/qq_31112205/article/details/103717382
C++ opencv曲线拟合 - 简书 (jianshu.com)
(1129条消息) 非线性拟合(C++版)_c++ 非线性拟合_啊哒哒滴喵喵呀的博客-CSDN博客
说明及方法步骤:
(1) RTK进入高精状态的经纬度值是精确到小数点后7位的。为了便于计算,对于多对经纬度,先对经度和纬度各取一个基数。如下列表格中所示:经度取基数104.817,纬度取基数28.743。先令各经度和纬度减去各自的基数,然后对得到的值再乘以10的5次方(即乘以100,000)。得到lng_Rt和lat_Rt对应列的值。
id | x | y | lng | lat | lng_Rt | lat_Rt |
---|---|---|---|---|---|---|
1 | 1115 | 1036 | 104.8181297 | 28.7430672 | 112.97 | 6.72 |
2 | 1125 | 798 | 104.8181065 | 28.7431113 | 110.65 | 11.13 |
3 | 1124 | 637 | 104.8180804 | 28.7431605 | 108.04 | 16.05 |
4 | 1148 | 548 | 104.8180619 | 28.7432013 | 106.19 | 20.13 |
5 | 1157 | 479 | 104.8180393 | 28.7432466 | 103.93 | 24.66 |
(2) 由于标定的点(不止如上表示例中的5个点)较多,(标定的点当然越多越好),且我们在标定的过程中具有一定的规律,故要先将所有标定的点打乱。再随机取出一些点(如所有标定点的80%)作为计算R和t矩阵的点,并保存为矩阵;剩下的点(如所有标定点去掉前述80%)作为测试R和t矩阵的点。
(3) 利用opencv的方法计算单应性矩阵。其中srcPoints为像素x,y坐标构成的矩阵, dstPoints为经纬度lng和lat构成的矩阵。
h_mat, _ = cv2.findHomography(srcPoints, dstPoints, method=cv2.RANSAC)
(4) 此时,已计算得到旋转矩阵(h_mat),利用预留的测试数据计算误差,依次计算每个像素点(x,y)对应的lng和lat。计算时,由于h_mat是3X3的矩阵,故计算时,(x, y, 1)补全1使作为3X1的矩阵可参与运算。计算得到的3X1的数据,需经如下处理:
result_arr =
[[-1063.646833475444], [-162.28279614654377], [-9.85691385992361]]
lng_Rt = result_arr[0][0] / result_arr[2][0]
lat_Rt = result_arr[1][0] / result_arr[2][0]
(5) 最后计算得出的经纬度值需除以10的5次方,再加上基数。为对应测试像素点经计算得到的经纬度值。
(6) 可以通过距离计算,验证单应性矩阵计算得到的经纬度值与实际标定点经纬度值之间的距离差异,以测试采用(2)中80%计算得到的单应性矩阵是否可用。
(7) 若(6)测试距离差异较大,可重新选取80%的数据,重新计算单应性矩阵 。
源码:
def cv2_find_homography():
file_path = r'label_xy_loglat.csv'
train_percent = 0.8
base_lng = 104.817
base_lat = 28.743
。。。。。。
data_arr = shuffle(data_arr)
train_num = int(train_percent * len(data_arr))
train_data_arr = data_arr[:train_num]
test_data_arr = data_arr[train_num:]
xandy_train_arr = []
lngandlat_train_arr = []
xandy_test_arr = []
lngandlat_test_arr = []
for i in range(len(train_data_arr)):
xandy_train_arr.append([train_data_arr[i][1], train_data_arr[i][2]])
lngandlat_train_arr.append([train_data_arr[i][5], train_data_arr[i][6]])
。。。 。。。
h_mat, _ = cv2.findHomography(srcPoints=xandy_train_mat, dstPoints=lngandlat_train_mat, method=cv2.RANSAC)
print("h_mat.tolist=", h_mat.tolist())
print("h_mat.reshape(1,-1).tolist=", h_mat.reshape(1,-1).tolist())
。。。。。。
for i in range(len(xandy_test_arr)):
video_point_arr = xandy_test_arr[i]
lngandlat = lngandlat_test_arr[i]
test_mat = np.array(video_point_arr).reshape(3, 1)
百度网盘链接
链接:https://pan.baidu.com/s/12_EZf6huVFmXNGHRTS0gpg