Saat ini saya sedang bekerja dengan dan membandingkan kinerja beberapa fitur detektor yang disediakan oleh OpenCV sebagai dasar untuk pencocokan fitur visual.
Saya menggunakan deskriptor SIFT . Saya telah menyelesaikan pencocokan yang memuaskan (setelah menolak kecocokan yang buruk) ketika mendeteksi fitur MSER dan DoG (SIFT) .
Saat ini, saya sedang menguji kode saya dengan GFTT (Good Features to Track - Harris corner) untuk mendapatkan perbandingan, dan juga karena dalam aplikasi final, satu set fitur GFTT akan tersedia dari proses pelacakan fitur visual.
Saya menggunakan cv::FeatureDetector::detect(...)
yang menyediakan saya dengan std::vector<cv::KeyPoint>
penuh terdeteksi fitur / keypoints / daerah bunga . Struktur cv::KeyPoint
berisi informasi dasar tentang lokasi fitur, serta informasi tentang size
dan octave
di mana titik kunci telah terdeteksi.
Hasil pertama saya dengan GFTT sangat buruk sampai saya membandingkan tipikal size
dan octave
parameter dalam berbagai jenis fitur:
- MSER menetapkan ukuran (antara 10 dan 40px) dan membiarkan oktaf ke 0
- DoG (SIFT) mengatur ukuran dan oktaf ( rasio ukuran / oktaf antara 20 dan 40)
- GFTT parameter selalu : size = 3 , oktaf = 0
Saya kira itu karena tujuan utama fitur GFTT tidak untuk digunakan dalam pencocokan tetapi hanya dalam pelacakan. Ini menjelaskan rendahnya kualitas hasil pencocokan, karena deskriptor yang diekstraksi dari fitur sekecil itu berhenti bersifat diskriminatif dan tidak berubah-ubah untuk banyak hal , termasuk pergeseran kecil, 1-piksel.
Jika saya secara manual mengatur size
dari GFTT ke 10-12 , saya mendapatkan hasil yang baik, sangat mirip dengan ketika menggunakan MSER atau DoG (SIFT) .
Pertanyaan saya adalah: apakah ada cara yang lebih baik untuk menentukan berapa banyak untuk meningkatkan size
(dan / atau octave
) daripada hanya-berjalan-dengan-10-lihat-jika-itu-berhasil ? Saya ingin menghindari size
peningkatan hardcoding jika mungkin dan menentukan secara pemrograman, tetapi hardcoding tidak apa - apa selama saya memiliki beberapa argumen yang solid yang mendukung pilihan saya pada algoritma baru size
/ size
kenaikan / size
estimasi .
sumber
Jawaban:
Saya tidak yakin sebenarnya ada respons yang baik untuk pertanyaan Anda: skala-ruang hal SIFT dan SURF sebenarnya dikembangkan untuk secara otomatis memperkirakan ukuran lingkungan yang relevan "baik" di sekitar titik kunci seperti sudut (yang merupakan fitur bagus apa untuk melacak adalah).
Sekarang, jawaban yang lebih positif adalah:
membangun basis data titik kunci dan kecocokan yang baik (misalnya menggunakan pola kalibrasi persegi) dan membuat penilaian kinerja otomatis pada basis data ini untuk menemukan ukuran yang benar. Tugas ini sebenarnya dapat benar-benar otomatis (lihat karya Mikolajczyk dan Schmid tentang evaluasi pencocokan poin)
tempelkan fitur bagus Anda dalam piramida gambar untuk juga memiliki semacam skala yang terkait dengannya. Anda dapat mencari referensi pada FAST multi-skala dan poin bunga Harris, yang melakukan sesuatu yang sangat mirip dengan prosedur ini.
Untuk menemukan ukuran blok maksimum secara heuristik, Anda dapat menghitung estimasi gambar Anda dengan blur kotak (yang kurang lebih seperti yang dilakukan operator blockSize) dan melihat kapan sudut menghilang. Namun perlu dicatat bahwa lebih banyak blur mengambil sudut dari lokasi aslinya.
Jika Anda benar-benar mencari beberapa perbaikan cepat dan kotor, coba ukuran antara 5x5 dan 11x11 (ukuran khas yang digunakan dalam pencocokan blok stereo). Jika Anda mencari kriteria yang memuaskan secara intelektual, maka cobalah untuk memaksimalkan kemungkinan pencocokan yang baik dari dua titik fitur di bawah tingkat kebisingan Anda.
sumber
Untuk membantu Anda menentukan parameter terbaik untuk detektor, OpenCV memiliki AjusterAdapter untuk tujuan itu. Saya tidak pernah menggunakannya sendiri tetapi mungkin cara standar untuk secara sistematis menentukan parameter. Perlu diketahui juga bahwa meskipun Keypoints memiliki beberapa properti, tidak semua masuk akal untuk semua algoritma. Karena struktur Keypoint digunakan untuk algoritma yang berbeda, ia memiliki semua bidang itu tetapi kadang-kadang tidak digunakan, itu sebabnya Anda mendapatkan oktaf = 0; IMO.
sumber