Saya memiliki gambar biner 160x120 seperti:
Saya ingin mendeteksi sudut gumpalan putih itu. Mereka sebelumnya ditutup oleh morfologi matematika sehingga tidak boleh memiliki sudut dalam. Dalam kasus khusus ini, saya ingin 16 sudut, seperti:
Upaya pertama saya menggunakan beberapa fungsi OpenCV seperti goodFeaturesToTrack atau FAST tetapi mereka sangat lambat (ditambah FAST sangat tidak stabil). Ide saya adalah melakukan perhitungan seperti itu pada GPU, karena sumber gambar saya berasal dari itu. Saya mencari ide di web tentang cara menulis shader seperti itu (saya menggunakan OpenGL ES 2.0), tetapi tidak menemukan apa pun yang konkret. Adakah yang tahu bagaimana saya bisa memulai algoritma seperti itu?
image-processing
computer-vision
Stéphane Péchard
sumber
sumber
Jawaban:
Ukuran gambar apa yang Anda operasikan? Berapa frame rate? Pada perangkat keras apa? CEPAT cantik, eh, cepat dalam pengalaman saya.
Saya juga melihat FAST digunakan sebagai detektor ROI dengan goodFeaturesToTrack dijalankan pada ROI yang diidentifikasi untuk memberikan stabilitas yang lebih baik tanpa menjalankan penalti gFTT pada keseluruhan gambar.
The "Harris" sudut detektor juga berpotensi sangat cepat seperti yang terdiri dari operasi yang sangat sederhana (tidak ada sqrt () per pixel misalnya!) - tidak stabil seperti gFTT, tapi mungkin lebih daripada CEPAT.
(Dalam hal implementasi GPU, Googling
gpu corner
tampaknya menghadirkan cukup banyak tautan, tetapi saya tidak tahu seberapa cocok mereka - saya cenderung menerapkannya dalam FPGA.)sumber
Saya kebetulan mengimplementasikan sesuatu seperti ini pada OpenGL ES 2.0 menggunakan deteksi sudut Harris, dan sementara saya belum sepenuhnya selesai, saya pikir saya akan berbagi implementasi berbasis shader yang saya miliki sejauh ini. Saya telah melakukan ini sebagai bagian dari kerangka kerja open source berbasis iOS , sehingga Anda dapat memeriksa kode jika Anda ingin tahu bagaimana beberapa langkah tertentu bekerja.
Untuk melakukan ini, saya menggunakan langkah-langkah berikut:
Hitung turunan X dan Y dengan mengurangi nilai saluran merah dari piksel kiri dan kanan dan di atas dan di bawah piksel saat ini. Saya kemudian menyimpan turunan x kuadrat di saluran merah, turunan Y kuadrat di saluran hijau, dan produk turunan X dan Y di saluran biru. Shader fragmen untuk ini terlihat seperti berikut:
di mana variasi hanyalah koordinat tekstur offset di setiap arah. Saya menghitung ulang ini dalam vertex shader untuk menghilangkan pembacaan tekstur dependen, yang terkenal lambat pada GPU seluler ini.
Terapkan blur Gaussian ke gambar turunan ini. Saya menggunakan blur horizontal dan vertikal yang terpisah, dan memanfaatkan penyaringan tekstur perangkat keras untuk melakukan blur sembilan-hit dengan hanya lima tekstur yang dibaca pada setiap lintasan. Saya menggambarkan shader ini dalam jawaban Stack Overflow ini .
Jalankan perhitungan deteksi sudut Harris yang sebenarnya menggunakan nilai turunan input kabur. Dalam hal ini, saya sebenarnya menggunakan perhitungan yang dijelaskan oleh Alison Noble di Ph.D. disertasi "Deskripsi Permukaan Gambar". Shader yang menangani ini terlihat seperti berikut:
Lakukan penekanan lokal non-maksimum dan terapkan ambang batas untuk menyorot piksel yang lewat. Saya menggunakan shader fragmen berikut untuk sampel delapan piksel di sekitar piksel pusat dan mengidentifikasi apakah itu maksimum dalam pengelompokan itu:
Proses ini menghasilkan peta cornerness dari objek Anda yang terlihat seperti ini:
Poin-poin berikut diidentifikasi sebagai sudut berdasarkan penindasan dan ambang batas yang tidak maksimal:
Dengan ambang yang tepat ditetapkan untuk filter ini, ini dapat mengidentifikasi semua 16 sudut dalam gambar ini, meskipun cenderung menempatkan sudut-sudut piksel atau lebih di dalam tepi sebenarnya dari objek.
Pada iPhone 4, deteksi sudut ini dapat dijalankan pada 20 FPS pada 640x480 frame video yang berasal dari kamera, dan iPhone 4S dapat dengan mudah memproses video dengan ukuran itu pada 60+ FPS. Ini seharusnya jauh lebih baik daripada pemrosesan yang terikat CPU untuk tugas seperti ini, meskipun saat ini proses membaca kembali poin-poinnya adalah terikat-CPU dan sedikit lebih lambat dari yang seharusnya.
Jika Anda ingin melihat ini dalam tindakan, Anda dapat mengambil kode untuk kerangka kerja saya dan menjalankan contoh FilterShowcase yang menyertainya. Contoh deteksi sudut Harris ada berjalan pada video langsung dari kamera perangkat, meskipun seperti yang saya sebutkan pembacaan titik sudut saat ini terjadi pada CPU, yang benar-benar memperlambat ini. Saya pindah ke proses berbasis GPU untuk ini, juga.
sumber
Detektor sudut "Kuat" seperti Shi-Tomasi dan Moravec sangat lambat. periksa di sini - http://en.wikipedia.org/wiki/Corner_detection CEPAT mungkin adalah satu-satunya detektor sudut ringan yang cukup bagus. Anda dapat meningkatkan FAST dengan melakukan penindasan non-maksimal - pilih output FAST dengan skor "cornerness" terbaik (ada beberapa cara intuitif untuk menghitungnya, termasuk Shi-Tomasi dan Moravec sebagai skor cornerness) Anda juga memiliki pilihan dari beberapa detektor FAST - dari FAST-5 ke FAST-12 dan FAST_ER (yang terakhir mungkin terlalu besar untuk seluler) Cara lain adalah dengan mendapatkan FAST - dapatkan pembuat kode FAST dari situs pembuat dan latih di set gambar yang mungkin. http://www.edwardrosten.com/work/fast.html
sumber
Tidak terlalu spesifik GPU, tetapi algoritma SUSAN oleh Steve Smith bagus untuk deteksi sudut.
Algoritma ini cukup sederhana, seperti yang ditunjukkan oleh kode sumber di C.
sumber