Eine Methode zur Berechnung des Längen- und Breitengrads eines Ziels in einem Videobild durch Zuordnung der kalibrierten Pixelpunkte und ihrer entsprechenden Längen- und Breitengrade.

Titel:

Berechnen Sie die R_t-Matrix_Homographie-Matrixmethode basierend auf Kalibrierungspunkten

Eine Methode zur Berechnung des Längen- und Breitengrads eines Ziels in einem Videobild durch Erstellen einer Zuordnung zwischen kalibrierten Pixeln und ihren entsprechenden Längen- und Breitengradwerten.

Ref:

https://blog.csdn.net/qq_31112205/article/details/103717382

C++-OpenCV-Kurvenanpassung – Jianshu (jianshu.com)

(1129 Nachrichten) Nichtlineare Anpassung (C++-Version)_c++ Nichtlineare Anpassung_ahdadadi meow meows Blog-CSDN-Blog

Anleitung und Methodenschritte:

(1) Wenn RTK in den hochpräzisen Zustand wechselt, sind die Längen- und Breitengrade auf 7 Dezimalstellen genau. Um die Berechnung zu erleichtern, nehmen Sie für mehrere Längen- und Breitengrade zunächst eine Basis für jeden Längen- und Breitengrad. Wie in der folgenden Tabelle dargestellt, wird der Längengrad als Basis 104,817 und der Breitengrad als Basis 28,743 verwendet. Subtrahieren Sie jeden Breiten- und Längengrad von seiner jeweiligen Basis und multiplizieren Sie dann den resultierenden Wert mit 10 hoch zur fünften Potenz (d. h. mit 100.000). Rufen Sie die Werte der entsprechenden Spalten von lng_Rt und lat_Rt ab.

Ausweis X j 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) Da es viele Kalibrierungspunkte gibt (mehr als die 5 Punkte im obigen Beispiel) (je mehr Kalibrierungspunkte, desto besser) und wir im Kalibrierungsprozess bestimmte Regeln haben, müssen wir zuerst die kalibrierten Punkte stören. Wählen Sie dann zufällig einige Punkte (z. B. 80 % aller Kalibrierungspunkte) als Punkte für die Berechnung der R- und t-Matrizen aus und speichern Sie sie als Matrizen. Die verbleibenden Punkte (z. B. alle Kalibrierungspunkte abzüglich der oben genannten 80 %) werden als verwendet Punkte zum Testen der R- und t-Matrizen. .

(3) Verwenden Sie die OpenCV-Methode, um die Homographiematrix zu berechnen. Unter diesen ist srcPoints eine Matrix aus Pixel-x- und y-Koordinaten und dstPoints eine Matrix aus Längen- und Breitengraden lng und lat.

h_mat, _ = cv2.findHomography(srcPoints, dstPoints, method=cv2.RANSAC)

(4) Zu diesem Zeitpunkt wurde die Rotationsmatrix (h_mat) berechnet, der Fehler wird unter Verwendung der reservierten Testdaten berechnet und die LNG und Lat, die jedem Pixel (x, y) entsprechen, werden nacheinander berechnet. Da h_mat während der Berechnung eine 3X3-Matrix ist, wird (x, y, 1) mit 1 vervollständigt, sodass es als 3X1-Matrix an der Operation teilnehmen kann. Die berechneten 3X1-Daten müssen wie folgt verarbeitet werden:

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) Der endgültig berechnete Längen- und Breitengradwert muss durch 10 hoch zur fünften Potenz plus der Basiszahl geteilt werden. ist der berechnete Längen- und Breitengradwert des entsprechenden Testpixelpunkts.

(6) Der Abstandsunterschied zwischen den von der Homographiematrix berechneten Längen- und Breitengradwerten und den tatsächlichen Längen- und Breitengradwerten des Kalibrierungspunkts kann durch Entfernungsberechnung überprüft werden, um zu testen, ob die Homographiematrix anhand von 80 % der Werte berechnet wurde ​in (2) ist verfügbar.

​ (7) Wenn die Testentfernungsdifferenz in (6) groß ist, können 80 % der Daten erneut ausgewählt und die Homographiematrix neu berechnet werden.

Quellcode:

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)
    

Link zur Baidu-Netzwerkfestplatte

链接:https://pan.baidu.com/s/12_EZf6huVFmXNGHRTS0gpg 

Guess you like

Origin blog.csdn.net/qq_42835363/article/details/131522453