タイトル:
キャリブレーション点に基づいて R_t 行列_ホモグラフィ行列法を計算します
校正されたピクセルとそれに対応する経度および緯度の値の間のマッピングを作成することによって、ビデオ画像内のターゲットの経度および緯度を計算する方法。
参照:
https://blog.csdn.net/qq_31112205/article/details/103717382
C++ opencv カーブフィッティング - Jianshu (jianshu.com)
(メッセージ数 1129) 非線形フィッティング (C++ 版)_c++ 非線形フィッティング_ahdadadi meow meow のブログ - CSDN ブログ
手順と方法の手順:
(1)RTKが高精度状態になった時の経度、緯度の値は小数点以下7桁までの精度です。計算を容易にするために、経度と緯度の複数のペアについて、まず経度と緯度のそれぞれの基数を取得します。次の表に示すように、経度は基数 104.817 として取得され、緯度は基数 28.743 として取得されます。各緯度と経度をそれぞれの基数から減算し、その結果の値に 10 の 5 乗 (つまり、100,000) を掛けます。lng_Rtとlat_Rtの対応する列の値を取得します。
ID | バツ | y | lng | 緯度 | 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 ポイント以上) があり (キャリブレーション ポイントが多いほど良い)、キャリブレーション プロセスには特定のルールがあるため、最初にキャリブレーション ポイントを中断する必要があります。次に、R 行列と t 行列を計算するための点としていくつかの点 (すべての校正点の 80% など) をランダムに抽出し、行列として保存し、残りの点 (すべての校正点から前述の 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) ホモグラフィー行列によって計算された経度および緯度の値と、実際の校正ポイントの経度および緯度の値との間の距離の差は、値の 80% を使用してホモグラフィー行列が計算されたかどうかを距離計算によって検証できます。 (2)のが利用可能です。
(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)
Baidu ネットワーク ディスク リンク
链接:https://pan.baidu.com/s/12_EZf6huVFmXNGHRTS0gpg