Perkiraan aliran optik / pergeseran gambar yang cepat

9

Saya perlu mendeteksi seberapa cepat panning kamera (baik horisontal / vertikal) untuk memberikan peringatan kepada operator untuk memperlambat.

Seluruh gambar bergerak sebagai blok, saya tidak perlu arah yang sebenarnya (meskipun H atau V akan menjadi bonus) dan saya hanya perlu perkiraan besarnya - yaitu. memicu jika lebih dari 'N' piksel bergeser di antara frame.

Gambar besar dan umumnya adegan kontras rendah seragam, saya tidak memiliki highlight yang jelas untuk dilacak. Saya perlu melakukannya secara realtime (60fps) dan tanpa menggunakan semua CPU.

Solusi Niave adalah memilih RoI di tengah, menemukan tepi, menghitung kesamaan antara pasangan frame, menggeser salah satu frame ke kiri / kanan / atas / bawah dengan piksel, ulangi - temukan minima.

Saya bertanya-tanya apakah ada solusi yang lebih cerdas?

Martin Beckett
sumber

Jawaban:

3

Mungkin jika Anda mencari metode sederhana , itu adalah untuk menerapkan algoritma Estimasi Gerak standar yang sangat matang di kelas MPEG codec kompresi. Mereka mudah dimengerti dan saya kira Anda akan mendapatkan banyak kode yang siap digunakan. Algoritma ini menghasilkan vektor gerak pada basis per blok - dan kemudian Anda dapat menemukan kluster yang paling menonjol dan mengambil rata-rata arah dan besaran vektor gerakan.

MPEG4 - memiliki konsep kunci lain yang disebut " Global Motion compensation ", sebuah teknik yang berupaya untuk pertama-tama memperkirakan dan mengimbangi gerak dan panning kamera. Keindahannya adalah metode seperti itu bisa lebih sederhana atau lengkap tergantung pada kerumitannya. Berikut adalah satu contoh kertas dan kertas lain untuk hal yang sama.

Secara umum, panning kamera dan estimasi gerakan adalah domain penelitian yang cukup mapan. di sini adalah referensi: kertas dan kertas lain .

Pada subjek ini. Anda akan menemukan algoritma yang ketat dan akurat serta yang sederhana dan cepat.

Dipan Mehta
sumber
Jika saya dapat dengan mudah menghubungkan ke MPEG lib yang akan baik, saya ingat bahwa GMC di Mpeg memiliki kritik. Saya pikir ini akan menjadi area umum karena algoritma stabilisasi kamera
Martin Beckett
Anda pasti dapat mengaitkan (atau lebih tepatnya mengekstrak) algoritma MPEG. Anda dapat menggunakan FFMPEG sebagai pustaka dan mengekstraknya - tetapi mungkin rumit. Atau, Anda dapat membaca kode rapi MSSG untuk diekstrak.
Dipan Mehta
Mengenai kritik pada GMC - itu lebih dari janji untuk secara dramatis mengurangi bit rate dan membuat pengkodean berbasis objek . Namun, tidak terlalu sulit untuk memperkirakan parameter gerakan kamera.
Dipan Mehta
terima kasih, saya akan melihat MSSG. Saya menggunakan ffmpeg tetapi ini bukan perpustakaan yang mudah untuk menarik begitu saja!
Martin Beckett
3

Ini mungkin merupakan solusi mengerikan yang lambat, tetapi Anda bisa melakukan korelasi silang berbasis FFT dari frame-frame berikutnya dan kemudian menemukan puncaknya untuk mengidentifikasi offset antar frame. Mungkin hanya melakukannya pada bagian kecil dari gambar untuk menghemat siklus prosesor.

Itu tidak akan bekerja dengan rotasi atau perubahan adegan drastis dari satu frame ke yang berikutnya, dan mungkin ada metode yang lebih baik. Ini semacam "Saya punya palu sehingga semuanya tampak seperti paku" solusi. Saya kira ini sama seperti solusi naif Anda, kecuali tidak perlu deteksi tepi dan FFT membuatnya jauh lebih cepat daripada secara eksplisit menggeser satu piksel pada satu waktu.

Pertanyaan ini serupa, dan tidak ada yang menyarankan selain korelasi silang, jadi mungkin tidak terlalu buruk: Menggunakan MATLAB untuk menghitung offset antara gambar yang berurutan

endolit
sumber
Terima kasih, mudah untuk menganggap FFT lambat, tapi saya bisa melakukan 2 ^ n jendela kecil. ps. Hanya untuk pencarian stackoverflow.com/questions/1100100/...
Martin Beckett
3

Salah satu cara Anda dapat memperkirakan kecepatan dan arahnya adalah dengan membuat estimasi aliran "lokal" dari misalnya empat jendela di tengah gambar. Metode diferensial Lucas-Kanade mengasumsikan perpindahan kira-kira konstan dan oleh karena itu dimungkinkan untuk diselesaikan sebagai persamaan.

Jadi panduan langkah demi langkah saya adalah:

  1. Dapatkan jendela piksel di bagian tengah gambar, mis. 20x20
  2. Hitung gradien Ix dan Iy.
  3. Membagi jendela gradien menjadi empat bagian, misalnya 4x10x10.
  4. Selesaikan empat persamaan kuadrat linear terkecil dengan bingkai berikutnya.
  5. Rata-rata empat vektor kecepatan.

Ini menentukan arah dan kecepatan, namun Anda bisa menggunakan jendela tertimbang untuk membuatnya lebih kuat. Lihatlah metode Lucas-Kanade untuk ekstensinya.

Aagaard
sumber
0

Saya pikir korelasi silang adalah pendekatan yang baik untuk menemukan offset, tetapi jika Anda ingin melakukannya dengan sangat cepat maka Anda dapat mencoba untuk membatasi hanya pada scanline vertikal tunggal dan horizontal tunggal (yaitu melalui pusat gambar). Menghitung korelasi silang antara garis pemindaian di kedua frame akan memberi Anda perkiraan offset horizontal dan vertikal.

meanderix
sumber
Ini mungkin berhasil, tetapi jika itu panning secara diagonal, itu tidak akan bekerja dengan baik, bahkan jika itu hanya sedikit jitter atas dan ke bawah saat panning menyamping. Saya pikir subregion persegi panjang di tengah gambar akan lebih baik.
endolith