Contents — find the section you need
Misalkan sebuah gambar yang diambil dengan kamera memiliki beberapa titik 3D yang diketahui pada peta yang sesuai dengan titik-titik di dalamnya. Masalah menemukan di mana kamera ditempatkan dan ke arah mana kamera tersebut mengarah adalah PnP (Perspective-n-Point). Metode ini umum digunakan dalam pelacakan peta Visual SLAM, overlay objek virtual dalam AR, kalibrasi tangan-mata untuk robot, dan estimasi pose untuk kamera survei.
0. Ringkasan 30 Detik
- Inputnya adalah matriks intrinsik kamera K, titik 3D yang diketahui \mathbf X_i, dan titik gambar yang sesuai \mathbf u_i. Outputnya adalah rotasi R dan translasi t.
-
Metode ini meminimalkan kesalahan reproyeksi dari persamaan proyeksi \mathbf u_i\sim K(R\mathbf X_i+t). Dengan 3 titik, P3P memberikan solusi kandidat; dengan 4 titik atau lebih, redundansi memungkinkan Anda mendeteksi outlier. - EPnP mengekspresikan setiap titik sebagai kombinasi linier dari 4 titik kontrol virtual, menyelesaikan banyak titik dengan cepat. Optimasi nonlinier akhir seperti Levenberg–Marquardt kemudian menyempurnakan hasilnya.
-
Jika outlier tercampur dalam korespondensi, seluruh estimasi pose dapat runtuh, sehingga diverifikasi dengan RANSAC-PnP, pemeriksaan kedalaman positif, dan konsistensi antar frame.
-
Degenerasi dan divergensi umum terjadi ketika titik-titik hampir koplanar, paralaks kecil, intrinsik salah, atau terdapat efek rolling shutter atau objek dinamis dalam adegan.
1. Model Proyeksi
Gambar 1 — ID yang cocok mendefinisikan korespondensi 3D–2D. PnP membentuk hipotesis pose, menolak outlier dengan residual reproyeksi, dan menyempurnakan R,t , yang memetakan koordinat dunia ke koordinat kamera.
Misalkan sebuah titik dalam kerangka koordinat kamera adalah \mathbf X_c=R\mathbf X_w+t . Dalam model lubang jarum, koordinat gambar yang dinormalisasi adalah
dan koordinat piksel diperoleh melalui matriks intrinsik
sebagai \mathbf u\sim K\mathbf X_c . R\in SO(3) adalah rotasi dan t adalah translasi. Jika ada distorsi lensa, koreksi distorsi diperlukan sebelum dan sesudah proyeksi.
Yang tidak diketahui adalah 6 derajat kebebasan, yaitu 3 rotasi ditambah 3 translasi. Dengan n korespondensi antara titik 3D \mathbf X_i dan pengamatan \mathbf u_i , kesalahan reproyeksi
diminimalkan. \pi adalah pembagian perspektif dan \rho adalah kerugian robust seperti Huber.
Jangan bingung antara transformasi dengan posisi kamera
solvePnP OpenCV mengembalikan rvec, tvec untuk transformasi yang memetakan titik objek/dunia ke dalam bingkai kamera. Untuk mendapatkan pusat kamera di dunia Untuk koordinat, gunakan \mathbf C_w=-R^Tt; untuk pose kamera, balikkan T_{cw} untuk mendapatkan T_{wc}. Menganggap tvec sebagai posisi dunia kamera adalah kesalahan umum. Hindari juga menerapkan distorsi dua kali ketika titik gambar masukan telah dikoreksi distorsinya.
2. P3P, AP3P, dan EPnP
P3P (Perspective-3-Point), yang memulihkan jarak dari pusat kamera menggunakan sudut gambar dari 3 titik dan jarak antara titik-titik 3D, memiliki hingga 4 solusi. Solusi yang benar dipilih dengan memeriksa terhadap titik ke-4 atau terhadap pose peta yang diketahui. AP3P adalah varian cepat yang mengatur ulang solusi secara aljabar.
Ketika ada banyak titik, EPnP (Efficient PnP) mengekspresikan setiap titik 3D sebagai jumlah tertimbang dari 4 titik kontrol virtual.
Koordinat kamera titik kontrol ditemukan dari persamaan linear, dan rotasi serta translasi dipulihkan dari koordinat tersebut. Karena biaya komputasinya hampir linear terhadap jumlah titik, metode ini sangat cocok untuk membangun pose awal dari banyak landmark SLAM. Setelah solusi awal, kesalahan reproyeksi disempurnakan secara iteratif dengan Levenberg–Marquardt.
3. RANSAC-PnP
Korespondensi titik fitur tercampur dengan pola yang tampak serupa, objek bergerak, dan ID peta yang salah. Pendekatan standar adalah RANSAC: membangun pose sementara dari himpunan titik minimal, mereproyeksikan setiap korespondensi, dan menghitung berapa banyak inlier yang berada dalam ambang batas. Jumlah iterasi N yang dibutuhkan, dengan mempertimbangkan tingkat outlier \epsilon, ukuran sampel minimal s, dan probabilitas keberhasilan p, ditentukan oleh
Karena jumlah iterasi yang dibutuhkan meningkat tajam seiring dengan tingkat outlier, turunkan \epsilon terlebih dahulu menggunakan uji rasio titik fitur, dispersi berbasis grid, atau mask objek dinamis. solvePnPRansac OpenCV digunakan dengan secara eksplisit menentukan jumlah titik, flag (EPNP, P3P, SQPNP, dll.), ambang reproyeksi, dan kepercayaan.
4. Mendeteksi Degenerasi
Himpunan titik koplanar
Jika semua titik 3D terletak pada bidang yang sama, kedalaman dan pose dari PnP menjadi ambigu, dan geometrinya juga dapat dijelaskan oleh homografi. Kalibrasi papan catur sengaja menggunakan bidang, tetapi Anda perlu memilih sudut pandang dan tata letak titik yang cukup membatasi derajat kebebasan pose. Sebuah penanda AR tunggal yang dilihat dari depan menjadi tidak stabil dalam kedalaman adalah fenomena yang sama.
Cakupan gambar sempit dan jangkauan jauh
PnP Secara langsung menggunakan satu gambar dan titik 3D yang diketahui, sehingga paralaks antar-bingkai bukanlah input yang diperlukan. Namun demikian, kondisinya buruk ketika korespondensi hanya menempati wilayah gambar yang kecil, target jauh dan tampak kecil, atau titik 3D memiliki sedikit variasi kedalaman. Jangan menerima hasil hanya dari jumlah inliernya saja: periksa cakupan gambar, RMSE reproyeksi, dan kovariansi pose atau sensitivitas terhadap gangguan, lalu gabungkan IMU atau sensor kedalaman bila diperlukan.
Kalibrasi dan pengaturan waktu
Kesalahan dalam panjang fokus, titik utama, dan distorsi berubah menjadi kesalahan reproyeksi sistematis di setiap titik. Lensa yang matriks intrinsiknya berubah dengan zoom, suhu, atau fokus perlu dikalibrasi ulang. Pada kendaraan dan drone, jika pengaturan waktu baris rana bergulir tidak sinkron dengan IMU, PnP akan mengembalikan pose kamera yang "bengkok".
5. Peran PnP dalam Visual SLAM
Dalam Visual SLAM, seiring bertambahnya jumlah titik peta yang sebelumnya ditriangulasi, kamera Pose dapat dilacak frame demi frame dengan PnP. Dengan pose yang dipertahankan tetap, titik-titik baru ditriangulasi, dan setelah cukup banyak keyframe terkumpul, Bundle Adjustment secara bersamaan mengoptimalkan pose dan peta. Ini paling mudah dipahami sebagai pembagian kerja: PnP adalah front end yang ringan, dan Bundle Adjustment menangani konsistensi global.
6. Daftar Periksa Implementasi
-
Kalibrasi K dan distorsi dengan papan catur atau yang serupa, dan catat kesalahan reproyeksi.
-
Sejajarkan satuan (m/mm) dan kerangka koordinat titik 3D dengan keadaan koreksi distorsi titik gambar.
-
Persempit korespondensi dengan uji rasio, tetangga terdekat bersama, dan pelacakan temporal.
-
Hapus outlier dengan RANSAC-PnP, dan simpan distribusi inlier dan kesalahan reproyeksi.
-
Periksa apakah kedalaman positif, apakah perubahan pose masuk akal secara fisik, dan apakah perbedaan dari frame sebelumnya wajar.
-
Jika kondisi terpenuhi Jika hasilnya buruk, kembali ke IMU, kedalaman, homografi, atau inisialisasi ulang.
Urutan implementasi minimal
Dengan OpenCV, pertama-tama dapatkan rvec, tvec, inliers dari solvePnPRansac, berikan hanya inlier ke solvePnPRefineLM, dan akhirnya gunakan projectPoints untuk menghitung sendiri RMSE inlier dan distribusi kesalahan. Pengembalian API yang berhasil saja tidak mendeteksi ketidaksesuaian yang berlebihan, titik yang berkelompok, atau pose yang secara fisik tidak mungkin.
ok, rvec, tvec, inliers = cv2.solvePnPRansac(
object_points, image_points, K, dist,
flags=cv2.SOLVEPNP_EPNP,
reprojectionError=3.0, confidence=0.999, iterationsCount=200,
)
if not ok or inliers is None or len(inliers) < 6:
raise RuntimeError("PnP failed or has too few inliers")
idx = inliers.ravel()
rvec, tvec = cv2.solvePnPRefineLM(
object_points[idx], image_points[idx], K, dist, rvec, tvec
)
projected, _ = cv2.projectPoints(object_points[idx], rvec, tvec, K, dist)
rmse = np.sqrt(np.mean(np.sum(
(projected.reshape(-1, 2) - image_points[idx].reshape(-1, 2)) ** 2,
axis=1,
)))
R, _ = cv2.Rodrigues(rvec)
camera_center_world = -R.T @ tvec.reshape(3, 1)
Baik 3.0 px maupun enam inlier bukanlah ambang batas penerimaan universal; keduanya hanya nilai awal untuk contoh ini. Turunkan ambang batas dari resolusi gambar, presisi fitur, dan kesalahan pose yang diizinkan aplikasi. Verifikasi juga bahwa inlier tidak berkelompok di satu sudut gambar dan bahwa setiap titik memiliki kedalaman bingkai kamera Z_c>0.
7. Ringkasan
PnP P3P/EPnP adalah jembatan yang mengubah korespondensi antara peta 3D dan gambar 2D menjadi pose kamera dengan 6 derajat kebebasan. Bangun solusi awal dengan P3P/EPnP, hilangkan outlier dengan RANSAC, dan perbaiki dengan optimasi nonlinier. Hanya dengan mengelola tata letak titik, kalibrasi, paralaks, dan sinkronisasi waktu secara bersamaan, ini menjadi estimasi pose yang stabil untuk Visual SLAM atau AR.
Apakah PnP hanya membutuhkan dua gambar?
Input dasarnya adalah titik 3D yang diketahui, korespondensi gambar 2D-nya, dan intrinsik kamera. Ini berbeda dari estimasi gerakan dari pencocokan 2D-ke-2D.
Komentar
Silakan masuk terlebih dahulu.
Belum ada data.