OpenCV - Mengekstrak deskriptor SIFT/SURF dari patch yang telah dipotong sebelumnya

Saya memiliki satu set tambalan abu-abu 100K 64x64 (yang sudah selaras, artinya semuanya memiliki orientasi yang sama) dan saya ingin mengekstrak deskriptor SIFT dari masing-masing tambalan menggunakan OpenCV.

Jelas bagi saya bahwa yang perlu saya lakukan hanyalah mendefinisikan vektor dengan satu titik kunci kp sehingga: kp.x=32, kp.y=32.

Namun, saya tidak tahu cara mengatur parameter kp.size. Dari memeriksa kode SIFT, sepertinya ia melakukan beberapa perhitungan non-sepele dengan parameter tersebut alih-alih hanya berasumsi bahwa itu adalah ukuran patch.

Pertanyaan 1: apa yang harus menjadi parameter kp.size saat mengekstraksi deskriptor SIFT dari patch berukuran 64x64?

Pertanyaan 2: apa yang harus menjadi parameter kp.size saat mengekstraksi deskriptor SURF dari patch berukuran 64x64?


person GilLevi    schedule 12.09.2014    source sumber
comment
lihat 1. makalah SIFT/SURF asli bagaimana skala fitur dan ukuran deskriptor dihubungkan. 2. kode openCV apakah menggunakan komputasi yang sama. Atau Anda bisa memodifikasi kode openCV SIFT/SURF untuk mencetak skala dan ukuran deskriptor dan menguji beberapa nilai;)   -  person Micka    schedule 12.09.2014
comment
github.com/hpatches/hpatches-benchmark/blob/ master/python/ ini skripnya   -  person old-ufo    schedule 10.06.2019


Jawaban (2)


Jika Anda melihat sift publikasi asli, skala titik kuncinya adalah digunakan untuk memberi bobot pada histogram besaran dan orientasi gradien (paragraf 6. Deskriptor gambar lokal). Jadi dalam kasus Anda, karena tambalan abu-abu sejajar, terserah Anda untuk memutuskan apakah Anda ingin memberi bobot pada kontribusi piksel lebih jauh dari pusat tambalan atau tidak, dan pilih skalanya (yaitu dengan jendela pembobotan gaussian ) sesuai.

Untuk SURF, pada dasarnya prinsipnya sama kecuali bahwa alih-alih besaran gradien, respons terhadap wavelet haar yang digunakan, namun Anda masih dapat memberi bobot pada respons tersebut dengan jendela gaussian.

Selain itu, karena Anda bekerja dengan tambalan yang selaras tersebut, saya menyarankan Anda untuk tidak menggunakan fungsi tingkat tinggi OpenCV, tetapi cukup menggunakan/mengode ulang bagian ekstraksi deskriptor, dan menerapkan bobot apa pun yang Anda inginkan untuk menghitung representasi tambalan Anda. Salah satu alasan untuk melakukan hal ini adalah, dalam contoh SIFT, penghitungan deskriptor SIFT mungkin "menambahkan titik kunci baru" ke titik kunci yang Anda berikan, jika algoritme "tidak puas" dengan orientasi titik kunci, maka algoritma akan menduplikasi titik kunci tersebut pada saat yang sama. lokasinya tetapi orientasinya berbeda.

person remi    schedule 22.09.2014

Oke. Jadi deskriptor SIFT biasanya menggunakan lingkungan grid 4x4, setiap grid biasanya berukuran 4x4 piksel. Oleh karena itu lingkungan dalam piksel biasanya 16x16. Scale/size adalah parameter untuk menentukan besarnya downsampling/blurring/radius keypoint. Jadi menurut saya dalam kasus Anda, ini adalah 4.

Anda mungkin juga tahu bahwa titik kunci SIFT juga berfungsi pada lapisan subpiksel. (32,32) tidak akan menjadi pusat patch gambar Anda, yang sebenarnya adalah (32,5, 32,5) jika dimensi gambar Anda (x,y) dimulai dari 1. Jika dimulai dari 0, maka akan menjadi (31,5, 31.5)- seperti dalam kasus opencv.

person The Nomadic Coder    schedule 22.09.2014