Bagaimana cara menangkap dan memproses aktivitas langsung dari aplikasi lain dengan Python?

Saya seorang mahasiswa ilmu komputer, dan sebagai proyek pribadi, saya tertarik untuk membuat perangkat lunak yang dapat menonton dan menghasilkan informasi berguna tentang game Super Nintendo yang dijalankan di emulator lokal. Ini mungkin hal-hal seperti kesehatan saat ini, skor saat ini, dll., (apa pun yang terbaca di layar). Emulator berjalan dalam bentuk berjendela (saya menggunakan SNES9x) sehingga saya tidak perlu menangkap setiap piksel di layar, dan saya hanya perlu menangkap sekitar 30fps.

Saya telah memeriksa beberapa perpustakaan seperti FFMPEG dan OpenCV, namun sejauh ini apa yang saya lihat membuat saya percaya bahwa saya harus memiliki rekaman rendering game tersebut.

Pada titik tertentu, saya ingin menjajaki kapasitas untuk mengembangkan AI yang agak heuristik yang mungkin dapat memainkan Super Metroid, namun untuk melakukannya, diperlukan interpretasi gameplay langsung. Algoritme dan struktur data yang diperlukan untuk hal seperti ini ada dalam bidang studi saya; pemrosesan video tidak, dan saya termasuk pemula. Petunjuk apa pun akan luar biasa (maafkan permainan kata-kata ilmu komputer yang timpang).

Bagi mereka yang mungkin mengatakan bahwa akan lebih mudah untuk mengikis memori game daripada mengambil data layar -- ya, itu akan terjadi. Ketertarikan saya adalah mengembangkan sesuatu yang hanya berdasarkan informasi yang dimiliki pemain manusia, yaitu visual di layar, jadi ini adalah pendekatan yang saya minati untuk saat ini. Terima kasih!


person growling_egg    schedule 08.05.2015    source sumber
comment
Sebagai catatan tambahan, Anda masih mungkin ingin mengikis memori emulator (atau menambal emulator) untuk mengirimkan frame grafis setiap kali buffer frame dibalik, daripada mencoba menebak frekuensi yang harus ditonton di, atau bahkan mungkin untuk mengambil output video pada level yang lebih rendah. (Kecuali jika Anda benar-benar mencoba memodelkan penglihatan manusia, yang sepertinya tidak demikian.)   -  person abarnert    schedule 09.05.2015
comment
Sementara itu, apa yang membuat Anda berpikir bahwa Anda memerlukan rendering yang direkam sebelumnya? Pada saat Anda memasukkan aliran ke FFMPEG, ia tidak tahu dari mana aliran itu berasal. (Jika Anda juga memintanya untuk mengurai aliran sebagai file, bukan aliran transport atau hanya pipa data bingkai mentah, maka itu jelas membuat perbedaan, tapi jangan lakukan itu. itu.)   -  person abarnert    schedule 09.05.2015
comment
Namun pada akhirnya, menurut saya ini terlalu luas untuk StackOverflow. Kecuali Anda hanya mencari rekomendasi perpustakaan (yang di luar topik karena alasan berbeda), Anda mencari petunjuk tentang cara melakukan sesuatu yang sangat umum. Itu tentu saja pertanyaan yang bagus, tapi itu bukan pertanyaan yang bisa dijawab dengan baik oleh StackOverflow. (Bantuan ini menjelaskan alasannya.) Anda mungkin menginginkan sesuatu yang lebih berorientasi pada diskusi, seperti milis atau forum.   -  person abarnert    schedule 09.05.2015
comment
Semua poin benar-benar valid -- jika ada cara yang lebih sederhana untuk mendapatkan setiap frame grafis, saya mendukungnya. Dan ya, saya tidak mencari secara lengkap bagaimana cara membuat penjelasan ini, tetapi adakah yang memiliki perpustakaan yang mereka sarankan untuk mendapatkan data bingkai? Jika ada sesuatu seperti: import framegetter, maka frame = framegetter.getframe Saya akan sangat senang. EDIT: Saya sudah mencoba memformat bagian terakhir posting ini agar tidak terlihat berantakan, tetapi tidak berhasil.   -  person growling_egg    schedule 09.05.2015
comment
Oke, jika ini benar-benar pertanyaan belanja perpustakaan, saya memilih untuk menutup karena alasan yang salah… tapi itu masih di luar topik untuk StackOverflow. Bahkan ada alasan dekat standar khusus untuk kelas masalah tersebut. Saya pikir pertanyaan ini dapat dengan mudah diubah menjadi pertanyaan yang menggambarkan masalah persis seperti yang disarankan oleh alasan dekat itu… tapi itu akan menjadi terlalu luas untuk StackOverflow, karena alasan yang saya jelaskan di komentar terakhir saya.   -  person abarnert    schedule 09.05.2015
comment
Adil. Baiklah, saya menghargai masukan Anda!   -  person growling_egg    schedule 09.05.2015
comment
PS, jika yang Anda maksud dengan bagian terakhir posting ini adalah komentar… ya, komentar di SO membuang banyak format, termasuk baris baru dan spasi lainnya, dan mereka tidak memiliki pratinjau WYSIWYG, jadi ada a banyak hal yang tidak bisa Anda masukkan ke dalam komentar. Namun satu hal yang dapat Anda lakukan adalah menggunakan backtick untuk fragmen kode pendek seperti `frame = framegetter.getframe()` untuk frame = framegetter.getframe().   -  person abarnert    schedule 09.05.2015
comment
Saya tidak berpikir ini akan menjadi jalur yang sangat sukses untuk membuat agen ai untuk memainkan metroid ... menguraikan gambar layar akan terlalu lambat menurut saya ... Anda perlu menemukan permainan yang menyediakan pengait untuk dapat memeriksa objek (file decoding hex... atau lebih baik lagi sesuatu seperti python-mario di mana Anda dapat berinteraksi secara langsung)   -  person Joran Beasley    schedule 09.05.2015
comment
mungkin duplikat? stackoverflow.com/q/24129253/541038   -  person Joran Beasley    schedule 09.05.2015
comment
Anda mungkin ingin membaca whathaveyoutried.com & menunjukkan rasa hormat kepada Komunitas StackOverflow, yang sangat menganjurkan untuk memposting pertanyaan berkualitas tinggi, bersama dengan MCVE ( Contoh Minimum-Lengkap-Dapat Diverifikasi- kode ) menunjukkan apa yang telah Anda coba sejauh ini. Anda mungkin ingin memperbarui postingan Anda, untuk memenuhi tingkat kualitas minimum yang wajar & untuk menunjukkan keinginan Anda untuk menghormati anggota kontribusi StackOverflow lainnya. Mereka adalah profesional yang senang menjawab pertanyaan bagus tentang isu-isu terkait MCVE. Nikmati menjadi Anggota Kontributor StackOverflow & dukung Netiket Komunitas ini   -  person user3666197    schedule 10.05.2015


Jawaban (1)


A: Ya, python dapat mengambil & memproses adegan apa pun melalui perangkat input USB

Masalah desain pemrosesan gambar real-time (bukan streaming ...) adalah tentang kinerja RT-loop secara keseluruhan, terutama transformasi & pemrosesan gambar, bukan hanya tentang ukuran gambar statis dan metode akuisisi itu sendiri.

Bagaimanapun, kode Anda harus dirancang dengan hati-hati dan diukur sebelumnya di [usec, nsec] (ya, ada alat python yang tersedia untuk memungkinkan Anda membandingkan masalah pengaturan waktu kode Anda hingga resolusi 25-nsec) untuk menjaga keseluruhan RT-loop layak dilakukan dalam arsitektur pemrosesan gambar umum Anda. Ditambah lagi, Anda akan kesulitan dengan manajemen sumber daya & penanganan kesalahan, yang keduanya menyebabkan banyak masalah dalam penjadwalan RT.

Bagaimana? Anggap ini sebagai inspirasi untuk memulai

Sampel yang dibawa hanya untuk ide pengambilan gambar awal dari prototipe python PoC pencitraan medis:

def demoCLUT( ):
    cameraCapture = cv2.VideoCapture(0)

    cv2.namedWindow(        'msLIB:ComputerVision.IN' )
    cv2.setMouseCallback(   'msLIB:ComputerVision.IN', onMouse )

    cv2.namedWindow(        'msLIB:ComputerVision.OUT-0' )
    cv2.namedWindow(        'msLIB:ComputerVision.OUT-1' )
    cv2.namedWindow(        'msLIB:ComputerVision.OUT-2' )

    success, frame = cameraCapture.read()

    if success:

        while success and cv2.waitKey( 10 ) == -1 and not clicked:          # [msec]

            aGrayFRAME  =                               cv2.cvtColor(   frame, cv2.COLOR_BGR2GRAY )

            cv2.imshow( 'msLIB:ComputerVision.IN',                                     frame )
            cv2.imshow( 'msLIB:ComputerVision.OUT-0',                             aGrayFRAME )
            cv2.imshow( 'msLIB:ComputerVision.OUT-1',   reprocessIntoFalseCOLORs( aGrayFRAME, frame, aFalseCLUT   ) )    # <frame>-destructive
            cv2.imshow( 'msLIB:ComputerVision.OUT-2',   reprocessIntoFalseCOLORs( aGrayFRAME, frame, aFalseCLUT_T ) )    # <frame>-destructive

            success, frame = cameraCapture.read()
        pass
    else:
        print "OpenCV.CLUT.DEMO: cameraCapture.read() failed to serve a success/frame ... "
    pass
    # ------------------------------------------------------------------<RELEASE-a-Resource>
    cameraCapture = False                                               #RELEASE-a-Resource setting it asFalse
    print 30 * ">", "call clearWIN() to release & tidy up resources..."
    # ------------------------------------------------------------------<RELEASE-a-Resource>

Apakah rangkaian rekaman merupakan suatu keharusan atau sebaiknya dimiliki?

Sejauh motivasi Anda diungkapkan, prototipe Anda akan menghabiskan banyak waktu untuk pengembangan. Di sana, urutan yang direkam sebelumnya dapat membantu Anda fokus pada sisi pengembangan/pengujian, sementara konsentrasi Anda tidak terbagi dua antara game dan kode python, namun ini tidak harus dimiliki.

Sebuah komentar tentang FPS. Anda membangun AI melawan Pemain Manusia

Karena itu, mesin AI awal Anda mungkin mulai pada kecepatan terendah 10-15 FPS, tidak perlu terjebak dalam teka-teki RT-loop yang tidak dapat dipecahkan hanya karena tingkat FPS yang terlalu tinggi.

Tandem mata / otak manusia kita mendapatkan ilusi gerakan di suatu tempat dekat kecepatan refresh TV (artinya TV analog asli, di mana sekitar 21 setengah layar selama beberapa dekade sudah cukup untuk manusia (tidak sama untuk anjing ... jadi perusahaan pemasaran berfokus pada mempengaruhi manusia, mengukur dampak kampanye periklanan mereka dengan pengukur orang dan bukan pengukur anjing karena sahabat kita sama sekali tidak suka menonton statistik aneh yang berkedip di layar TV)).

Jadi jangan terlalu mendesain mesin AI yang akan dikembangkan, itu bertujuan untuk mengalahkan Pemain Manusia, bukan pemain anjing, bukan?

person user3666197    schedule 10.05.2015