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:
(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
fmt
18 ) tetapi mereka mungkin datang dalam ukuran yang berbeda (saya mendapatkan video YouTube denganfmt
18 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:
(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.
sumber
Jawaban:
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.
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:
yang memberi Anda yang berikut ini. Titik putih menandai wilayah dengan jarak minimum di masing-masing dari dua gambar
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).N M N+M−1
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:
Anda dapat membuat yang di atas dengan fungsi gabungan:
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:
sumber