Lihat artikel sebelumnya: Algoritme pengenalan gerakan sederhana dan algoritme untuk menemukan perpindahan objek dalam gambar . Izinkan saya mengingatkan Anda bahwa saya termotivasi untuk menulis artikel ini oleh fakta bahwa ketika saya mulai mengerjakan tesis master saya tentang "Analisis struktur spasial gambar dinamis", saya mengalami masalah yaitu sangat sulit untuk menemukan beberapa contoh algoritme siap pakai untuk mengenali gambar dan objek bergerak. Di mana-mana, baik dalam literatur maupun di Internet, hanya ada satu teori telanjang. Cukup lama berlalu sejak saat itu, saya berhasil mempertahankan skripsi saya dan mendapat ijazah merah, dan sekarang saya menulis untuk berbagi pengalaman saya.
Jadi, ketika saya mulai mengerjakan disertasi saya, pengetahuan saya di bidang computer vision adalah nol. Darimana saya memulai? Dari eksperimen paling sederhana pada gambar, yang dijelaskan dalam artikel di atas. Saya menulis beberapa algoritme primitif, salah satunya menunjukkan kepada saya dalam bentuk titik di mana objek bergerak berada, dan yang kedua menemukan sepotong gambar dalam gambar yang lebih besar (berfungsi, tentu saja, perlahan).
Apa berikutnya? Memasukkan lebih lanjut. Tugas saya adalah agar kendaraan udara tak berawak menavigasi melalui foto udara atau melacak mobil yang bergerak di sepanjang jalan. Dan saya tidak tahu bagaimana memulai tugas itu. Apa yang mulai saya lakukan? Baca teori. Dan teori mengatakan bahwa visi komputer dipecah menjadi beberapa tahap berikut:
- Pemrosesan awal gambar (penghilangan noise, peningkatan kontras, penskalaan, dan sebagainya).
- Menemukan detail (garis, batas, tempat menarik)
- Deteksi, segmentasi.
- Pemrosesan tingkat tinggi.
Baiklah, saya menggambar diagram program yang seharusnya melakukan semua ini:
Singkatnya, ternyata saya harus membuat sesuatu yang megah di tingkat Kecerdasan Buatan. Baiklah, saya akan mencoba membuatnya. Saya mengambil Visual Studio dan mulai kelas patung di C #. Lebih tepatnya, kelas kosong. Beberapa saat kemudian saya menyadari apa yang saya tuju….
Jadi, saya mulai berlatih langkah pertama. Pemrosesan awal. Saya mulai dengan dia karena
- Ini yang paling sederhana.
- Ini adalah langkah pertama dalam daftar.
Saya mulai menerapkan filter yang berbeda pada gambar, untuk melihat apa yang terjadi. Saya mencoba, misalnya, untuk menerapkan filter Sobel:
Menghilangkan noise dari gambar menggunakan Gaussian blur: Saya
mempelajari pemfilteran median dan pemilihan tepi: Kuliah tentang computer vision dari ruang kuliah sangat
membantu saya . Jadi, ilmunya sudah menjadi lebih banyak, tapi masih belum jelas bagaimana cara mengatasi masalah tersebut. Pada saat itu, topik dan tugas tesis master telah direvisi beberapa kali, dan sebagai hasilnya dirumuskan sebagai berikut: "Melacak lintasan UAV menggunakan bingkai foto udara." Artinya, saya perlu mengambil sejumlah foto dan membangun lintasan di sepanjang foto.
Saya mendapat ide untuk mendeskripsikan kontur dalam bentuk garis putus-putus (dijelaskan oleh banyak segmen), dan kemudian membandingkan seberapa banyak garis-garis ini bergeser. Tetapi ternyata konturnya, bahkan dalam dua bingkai yang berdekatan, ternyata sangat berbeda sehingga tidak ada cara untuk membandingkan secara memadai kumpulan garis putus-putus yang dihasilkan. Saya mencoba meningkatkan kontur itu sendiri menggunakan berbagai metode dan kombinasinya:
- Pilihan tepi Canny klasik dari perpustakaan OpenCV
- Algoritme deteksi tepi yang ditingkatkan dikembangkan oleh supervisor saya.
- Pemilihan kontur dengan binarisasi.
- Pemilihan kontur berdasarkan segmentasi. Segmentasi dilakukan dengan berbagai cara, khususnya menggunakan fitur tekstur.
Akibatnya, kami mendapatkan banyak algoritme yang bekerja sangat lambat tetapi tidak membawa sedikit pun mendekati hasilnya. Beberapa karya saya digunakan sebagai bahan untuk artikel ini .
Nah, kemudian supervisor menyarankan sebuah ide: perlu menggunakan poin khusus. Dan dia bahkan memberikan algoritme tentang cara menghitung poin-poin penting ini. Saya harus mengatakan bahwa ini adalah metode yang sangat tidak standar. Ini bukan detektor Harris, atau BRISK, atau MSER, atau AKAZE. Meskipun saya mencoba menggunakannya juga. Tapi ternyata, detektor yang diusulkan supervisor bekerja lebih baik. Dan inilah cara kerjanya. Pertama, kami menghitung persiapan kontur menggunakan rumus ini:
Kemudian kami menemukan ekstrema dari fungsi ini. Inilah poin spesialnya. Jelasnya, poin bisa dari dua jenis "Peaks" dan "Pits". Berikut adalah contoh titik-titik pada gambar:
Selanjutnya, 50 titik dengan respons maksimum dipilih dari titik yang diperoleh. Untuk semua titik ini, segitiga dibangun, jumlah segitiga yang dibentuk oleh titik-titik ini adalah:
di mana k adalah jumlah titik singular yang terlibat dalam penghitungan. Untuk setiap segitiga, indeks khusus dihitung dari 0 hingga 16383. Langkah selanjutnya adalah mendistribusikan segitiga di atas larik khusus di mana nomor selnya sesuai dengan indeks segitiga. Setiap sel dalam larik seperti itu adalah daftar segitiga. Array seperti itu dikompilasi oleh dua frame yang dibandingkan. Perbandingan dilakukan dengan mencocokkan setiap sel dalam larik dengan sel yang sesuai dalam larik bingkai lain. Secara total, 16384 kelompok perlu dicocokkan, yang merupakan tugas yang cukup layak untuk komputer dalam waktu yang cukup singkat.
Saat mencocokkan array, kami mengisi matriks yang cocok. Matriks horizontal adalah sudut antara segitiga yang cocok, dan skala vertikal adalah skala, yang dihitung sebagai rasio panjang sisi terpanjang. Skala dan sudut yang ditemukan adalah sel dalam matriks yang paling cocok. Perbandingan serupa dibuat untuk menghitung perpindahan horizontal dan vertikal gambar.
Baca lebih lanjut tentang metode ini di artikel.
Jadi, kami menemukan perpindahan horizontal dan vertikal, perubahan sudut dan skala (yaitu, UAV naik atau turun). Sekarang tinggal menulis program yang mensimulasikan penelusuran lintasan pada serangkaian bingkai dan menggambar lintasan ini, dan kita dapat mengatakan bahwa disertasi sudah siap:
