Mendeteksi gambar templat tetap dari bingkai video semi-konstan

8

Ada sejumlah video yang saya cari untuk memproses berbagai permainan video untuk mendeteksi berbagai "status" di dalamnya.

Game pertama yang saya tangani adalah edisi Super Street Fighter 4 .

Di dalamnya, saya ingin mendeteksi kapan layar karakter "vs" muncul. Berikut ini contoh dari satu bingkai video:

Akuma vs. Ryu - SSF4
(diambil dari tanda ~ 10s dari video ini )

Jika saya dapat mendeteksi "vs", maka saya akan dapat mendeteksi bahwa bingkai video memang merupakan layar "vs", yang akan memungkinkan saya untuk mencari informasi lain (untuk saat ini, katakanlah saya akan menggunakannya untuk mendeteksi cap waktu di video tempat pertandingan akan dimulai).

Yang mengatakan, di sini adalah apa yang dapat diasumsikan tentang frame dari video yang akan saya proses (ini bukan satu-satunya video, ada ribuan, jika tidak puluhan atau ratusan ribu video, tetapi masalah skala dalam pemrosesan yang banyak video adalah domain yang sama sekali berbeda):

  • Saya lebih suka (tapi tidak perlu) untuk memproses gambar dengan resolusi serendah mungkin dengan hasil yang dapat diandalkan (resolusi lebih rendah = waktu pemrosesan lebih cepat). Gambar di atas adalah 480 x 270 piksel (diambil dari video YouTube dengan fmt18 ) tetapi mereka mungkin datang dalam ukuran yang berbeda (saya mendapatkan video YouTube dengan fmt18 tetapi dengan dimensi 640 x 360 piksel).
  • Sebagian besar video akan diumpankan langsung
  • Sebagian besar video akan memiliki rasio aspek 16: 9
  • Latar belakang kemerahan akan dianimasikan, tetapi umumnya berada di dalam warna oranye-merah (itu api)
  • Terkadang akan ada lencana yang keluar dan masuk di bagian bawah "vs" untuk menunjukkan versi (yang akan penting, tetapi tidak sekarang), yang mungkin mengaburkan "vs", seperti:

Sagat vs. Adon - SSF4: AE 2012
(diambil dari tanda ~ 3s dari video ini ; perhatikan juga bahwa di atas adalah resolusi 640 x 360 piksel)

  • Ukuran dan posisi "vs" akan kira - kira sama (saya belum memverifikasi ini tetapi saya tahu itu tidak bergerak) secara proporsional dengan video umpan langsung lainnya
  • Karakter akan dipilih dari kumpulan lebih dari 30 di setiap sisi (dengan kata lain, area bingkai akan bervariasi)
  • Video-video tersebut biasanya akan berdurasi dua hingga empat menit, dengan kisaran antara 4.000 dan 6.00 frame. Namun, mungkin ada video yang lebih panjang (mungkin dua jam) yang memiliki berbagai gim lain dan live action. Video ini tidak sepenting itu, tetapi jika sebuah solusi memberi tahu saya di mana permainan tertentu muncul di keseluruhan video yang lebih besar, hebat
  • Resolusi asli dari tangkapan adalah 720p, sehingga gambar dasar dari "vs" dapat diambil pada apa yang akan dianggap sebagai ukuran "asli".

Pada akhirnya, saya mencari kode untuk pipeline ini dalam. NET, tapi itu tidak super penting, pembuktian konsep lebih penting di sini dan juga pemahaman tentang teknik yang terlibat sehingga saya bisa menerjemahkan dan mengoptimalkannya untuk .NET serta untuk video lain dari game lain dalam genre yang sama (jika saya dapat memilih pembeda yang signifikan, dan video katakanlah, Ultimate Marvel vs Capcom 3 , Street Fighter x Tekken , BlazBlue: Continuum Shift , dll.).

Saya juga mencelupkan jari kaki saya di Mathematica dan memiliki versi rumah 8.0, jadi pembuktian konsep di lingkungan itu lebih dari diterima juga.

casperOne
sumber
Saya ingin tahu mengapa Anda meminta pendekatan lain. Sudahkah Anda mencoba pendekatan korelasi silang yang disarankan yoda? Ini adalah teknik alami yang sangat mudah untuk menyelesaikan masalah semacam ini, dan saya pikir itu harus bekerja dengan baik untuk Anda.
Jason R
@JasonR Maaf atas keterlambatan respons. Yoda dan saya benar-benar membahas pendekatan panjangnya dan itu bekerja dengan baik untuk situasi karena dibatasi sempit di atas (teknik ini tidak memperhitungkan geser atau terjemahan akun). Yang mengatakan, kami berdua tertarik melihat apakah ada orang lain yang memiliki pendekatan berbeda dan karunia adalah cara alami untuk mendorong itu.
casperOne

Jawaban:

9

Jika "VS" hampir sama (simpan untuk beberapa lencana, seperti pada contoh kedua), Anda dapat menggunakan korelasi silang langsung untuk mendeteksi keberadaan template dalam bingkai video Anda. Saya menjawab pertanyaan serupa tentang melakukan ini di MATLAB pada Stack Overflow. Anda dapat menggunakan sesuatu seperti alat "tongkat ajaib" di Photoshop untuk memilih "VS" dari bingkai untuk membuat templat. Saya telah melakukannya dan mem - binari gambar untuk mendapatkan templat ini .

Melihat berbagai saluran warna (RGB) di dua gambar Anda, saluran merah tampaknya menjadi yang terbaik untuk mendeteksi templat Anda.

masukkan deskripsi gambar di sini

Anda sekarang dapat mengkorelasikan silang saluran merah dengan templat binarized Anda dan Anda harus mendapatkan puncaknya di lokasi templat. Saya memilih untuk threshold dan binarize template merah juga, meskipun Anda dapat mendeteksi tanpa melakukannya. Saya lebih suka menggunakan fungsi jarak daripada nilai korelasi silang mentah, karena cenderung sedikit lebih kuat terhadap positif palsu. Saya tidak tahu C # /. NET, tapi di sini adalah garis besar pendekatan di Mathematica:

image = Import["http://i.stack.imgur.com/7RwAh.png"];
ImageCorrelate[ Binarize[ColorSeparate[image][[1]], 0.1], vsTemplate, 
   NormalizedSquaredEuclideanDistance] // Binarize[#, 0.2] & // ColorNegate

yang memberi Anda yang berikut ini. Titik putih menandai wilayah dengan jarak minimum di masing-masing dari dua gambar

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Anda kemudian dapat menggunakan hal di atas pada langkah berikutnya seperti yang diinginkan. Perhatikan bahwa biasanya, korelasi silang akan menghasilkan overhang. Dengan kata lain (menggunakan contoh 1D) jika Anda berkorelasi silang sinyal titik dengan titik satu, Anda akan mendapatkan hasil yang panjangnya poin. Implementasi Mathematica menangani overhang untuk Anda. Namun, saya tidak tahu apa yang C # lakukan, dan Anda mungkin ingin mengingat ini (MATLAB tidak melakukannya, dan saya harus menjelaskannya dalam jawaban yang ditautkan di atas).NMN+M1

Anda juga dapat membangun ini dan menerapkan kriteria thresholding yang lebih kuat dari Anda sendiri. Untuk saat ini, saya hanya akan menyoroti deteksi untuk kepentingan orang lain:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Anda dapat membuat yang di atas dengan fungsi gabungan:

detectVS[i_Image] := 
 Module[{mask = 
    ImageCorrelate[ Binarize[ColorSeparate[i][[1]], 0.1], vsTemplate, 
       NormalizedSquaredEuclideanDistance] ~Binarize~ 0.2 // 
     ColorNegate},

  ColorConvert[i, "Grayscale"]~ImageAdd~ 
   ImageMultiply[i, Image[mask]~Dilation~ DiskMatrix@100]
  ]

Ada banyak potensi untuk perbaikan di sini. Saya penggemar kursi malas dalam pemrosesan gambar, jadi saya tidak tahu apa algoritma tercepatnya. Namun, ada beberapa hal yang bisa Anda perhatikan:

  1. Jika VS kira-kira lokasi yang sama di setiap video, Anda tidak perlu berkorelasi silang menggunakan seluruh gambar - Anda bisa memilih kotak di tengah dan bekerja dengan itu.
  2. Ini mungkin operasi yang mahal untuk dilakukan untuk setiap frame. Namun, melihat video Anda, Anda memiliki sekitar lebih dari 4 detik bingkai di mana Anda memiliki VS ditampilkan dan nama karakter. Jadi saya menyarankan agar Anda menganalisis bingkai setiap detik atau paling banyak setiap 2 detik, dengan demikian menjamin bahwa Anda akan mendarat di satu dengan VS di atasnya. Setelah Anda mendeteksi VS, Anda kemudian dapat mulai memproses setiap frame berturut-turut untuk melakukan bagian selanjutnya dari pemrosesan Anda.
  3. Proses ini harus, sampai batas tertentu, kuat terhadap perubahan ukuran yaitu, Anda bisa melakukan korelasi silang pada gambar kecil, tetapi Anda akan membutuhkan template yang cocok untuk dicocokkan. Jika Anda tahu bahwa gambar Anda akan berada dalam ukuran standar / set tertentu, maka Anda dapat membuat template untuk masing-masing dan memilih template yang sesuai tergantung pada ukuran gambar.
  4. Ambang yang saya pilih adalah dengan coba-coba, tetapi mereka tampaknya bekerja untuk dua gambar di atas dan dari video youtube terkait lainnya, mereka mungkin akan bekerja untuk sebagian besar dari mereka. Pendekatan yang lebih khusus akan melibatkan membaginya menjadi blok dan melihat histogram untuk disimpulkan apakah itu milik VS atau tidak - mungkin classifier Bayesian. Namun, pastikan Anda harus melakukan ini sebelum memulai. Menurut saya itu cukup sederhana sehingga Anda tidak akan membutuhkannya.
Lorem Ipsum
sumber
Mengingat bahwa ada ukuran "asli" untuk "vs" pada 720p (lihat poin terakhir pada pertanyaan yang diperbarui), dapatkah itu diskalakan secara otomatis (turun, saya asumsikan) mengingat dimensi video yang diamati atau apakah akan condong hasil korelasi silang terlalu banyak?
casperOne
@casperOne Anda harus dapat memperkecil dan tetap membuatnya berfungsi selama Anda yakin gambar uji Anda hanya diperkecil (yaitu, tidak dipangkas). Kekhawatiran saya adalah dalam kasus di mana ukuran gambar tidak seperti yang seharusnya. Misalnya, jika Anda memiliki gambar 450x250 yang semula seharusnya 480x270, tetapi dipotong, menurunkan VS yang diperoleh dari 640x480 tidak akan memberikan kecocokan yang baik (mungkin cukup dekat). Di sisi lain, jika Anda tahu bahwa semua gambar itu akan menjadi 450x250, maka Anda cukup menggunakan templat dari salah satu bingkai itu.
Lorem Ipsum