จะบันทึกและประมวลผลกิจกรรมสดจากแอปพลิเคชันอื่นใน Python ได้อย่างไร

ฉันเป็นนักเรียนวิทยาการคอมพิวเตอร์ และในฐานะโปรเจ็กต์ส่วนตัว ฉันสนใจที่จะสร้างซอฟต์แวร์ที่สามารถดูและสร้างข้อมูลที่เป็นประโยชน์เกี่ยวกับเกม Super Nintendo ที่ทำงานบนเครื่องจำลองในเครื่องได้ นี่อาจเป็นสิ่งต่างๆ เช่น สุขภาพปัจจุบัน คะแนนปัจจุบัน ฯลฯ (อะไรก็ตามที่อ่านได้บนหน้าจอ) โปรแกรมจำลองทำงานในรูปแบบหน้าต่าง (ฉันใช้ SNES9x) ดังนั้นฉันจึงไม่จำเป็นต้องจับภาพทุกพิกเซลบนหน้าจอ และฉันต้องจับภาพเพียงประมาณ 30fps เท่านั้น

ฉันได้ดูไลบรารีบางแห่งเช่น FFMPEG และ OpenCV แล้ว แต่จนถึงตอนนี้สิ่งที่ฉันได้เห็นทำให้ฉันเชื่อว่าฉันต้องมีการเรนเดอร์เกมที่บันทึกไว้ล่วงหน้า

เมื่อถึงจุดหนึ่ง ฉันต้องการสำรวจความสามารถในการพัฒนา AI ที่สามารถเล่น Super Metroid ได้ แต่การจะทำเช่นนั้นได้ จะต้องตีความการเล่นเกมสดด้วย อัลกอริธึมและโครงสร้างข้อมูลที่จำเป็นสำหรับสิ่งนี้อยู่ในขอบเขตการศึกษาของฉัน การประมวลผลวิดีโอไม่ใช่แบบนั้น และฉันก็เป็นแค่มือใหม่ พอยน์เตอร์ใด ๆ ก็ยอดเยี่ยมมาก (ขออภัยที่เล่นสำนวนวิทยาการคอมพิวเตอร์ง่อย)

สำหรับผู้ที่อาจชี้ให้เห็นว่าการขูดหน่วยความจำเกมจะง่ายกว่าการดึงข้อมูลหน้าจอ - ใช่แล้ว ความสนใจของฉันคือการพัฒนาบางสิ่งที่ได้รับเฉพาะข้อมูลที่ผู้เล่นมนุษย์จะมี เช่น ภาพบนหน้าจอ ดังนั้นนี่คือแนวทางที่ฉันสนใจในขณะนี้ ขอบคุณ!


person growling_egg    schedule 08.05.2015    source แหล่งที่มา
comment
ตามหมายเหตุด้านข้าง คุณ ยัง อาจต้องการขูดหน่วยความจำของโปรแกรมจำลอง (หรือแพตช์โปรแกรมจำลอง) เพื่อส่งเฟรมกราฟิกให้คุณทุกครั้งที่บัฟเฟอร์เฟรมพลิก แทนที่จะพยายามเดาความถี่ที่จะรับชม หรือบางทีอาจถึงขั้นคว้าเอาต์พุตวิดีโอในระดับที่ต่ำกว่า (เว้นแต่ว่าคุณกำลังพยายามสร้างแบบจำลองการมองเห็นของมนุษย์จริงๆ ซึ่งฟังดูไม่เหมือนคุณเลย)   -  person abarnert    schedule 09.05.2015
comment
ในขณะเดียวกัน อะไรทำให้คุณคิดว่าคุณต้องการการเรนเดอร์ที่บันทึกไว้ล่วงหน้า เมื่อคุณป้อนสตรีมลงใน FFMPEG คุณจะไม่รู้ว่าสตรีมนั้นมาจากไหน (หากคุณขอให้แยกวิเคราะห์สตรีมเป็น ไฟล์ แทนที่จะเป็นสตรีมการขนส่งหรือเพียงไพพ์ของข้อมูลเฟรมดิบ เห็นได้ชัดว่ามันสร้างความแตกต่าง แต่ก็อย่าทำ ที่.)   -  person abarnert    schedule 09.05.2015
comment
แต่สุดท้าย ฉันคิดว่านี่กว้างเกินไปสำหรับ StackOverflow เว้นแต่ว่าคุณเพียงแค่มองหาคำแนะนำสำหรับห้องสมุด (ซึ่งอยู่นอกหัวข้อด้วยเหตุผลอื่น) คุณกำลังมองหาคำแนะนำเกี่ยวกับวิธีการทำสิ่งที่เป็นทั่วไปมาก นั่นเป็นคำถามที่ดีอย่างแน่นอน แต่ไม่ใช่คำถามที่ StackOverflow สามารถให้คำตอบได้ดี (ความช่วยเหลือจะอธิบายว่าทำไม) คุณอาจต้องการสิ่งที่เน้นการสนทนามากขึ้น เช่น รายชื่ออีเมลหรือฟอรัม   -  person abarnert    schedule 09.05.2015
comment
คะแนนที่ถูกต้องทุกประการ หากมีวิธีที่ง่ายกว่าในการรับกราฟิกแต่ละเฟรม ฉันก็พร้อมทำ ใช่ ฉันไม่ได้มองหาความสมบูรณ์ ฉันจะอธิบายนี้ให้มากที่สุดเท่าที่จะเป็นไปได้ได้อย่างไร เนื่องจากไม่มีใครมีไลบรารีที่พวกเขาแนะนำให้รับข้อมูลเฟรม หากมีบางอย่างเช่น: import framegetter แล้ว frame = framegetter.getframe ฉันจะดีใจมาก แก้ไข: ฉันได้ลองจัดรูปแบบส่วนสุดท้ายของโพสต์นี้เพื่อไม่ให้ดูเหมือนยุ่งวุ่นวาย แต่ก็ไม่มีประโยชน์   -  person growling_egg    schedule 09.05.2015
comment
ตกลง หากเป็นคำถามเกี่ยวกับการช็อปปิ้งในห้องสมุดจริงๆ ฉันโหวตให้ปิดด้วยเหตุผลที่ไม่ถูกต้อง... แต่ก็ยังไม่เกี่ยวกับ StackOverflow มีเหตุผลปิดมาตรฐานโดยเฉพาะสำหรับปัญหาประเภทนั้น ฉันคิดว่าคำถามนี้สามารถเปลี่ยนเป็นคำถามที่อธิบายปัญหาได้อย่างง่ายดายตามที่เหตุผลที่ปิดไว้แนะนำว่าควร... แต่แล้วมันจะกว้างเกินไปสำหรับ StackOverflow ด้วยเหตุผลที่ฉันอธิบายไว้ในความคิดเห็นล่าสุดของฉัน   -  person abarnert    schedule 09.05.2015
comment
ยุติธรรม. ฉันขอขอบคุณข้อมูลของคุณ!   -  person growling_egg    schedule 09.05.2015
comment
ป.ล. หากในส่วนสุดท้ายของโพสต์นี้ คุณหมายถึงความคิดเห็น… ใช่แล้ว ความคิดเห็นที่ SO ทิ้งการจัดรูปแบบไปมาก รวมถึงการขึ้นบรรทัดใหม่และช่องว่างอื่น ๆ และไม่มีการแสดงตัวอย่างแบบ WYSIWYG ดังนั้นจึงมี มีหลายสิ่งที่คุณไม่สามารถใส่ความคิดเห็นได้ แต่สิ่งหนึ่งที่คุณ ทำได้ ทำได้คือใช้ backticks สำหรับส่วนของโค้ดแบบสั้น เช่น `frame = framegetter.getframe()` สำหรับ frame = framegetter.getframe()   -  person abarnert    schedule 09.05.2015
comment
ฉันไม่คิดว่านี่จะเป็นเส้นทางที่ประสบความสำเร็จในการสร้างเอเจนต์ ai เพื่อเล่นทรอยด์ ... การแยกวิเคราะห์ภาพบนหน้าจอจะช้าเกินไป ฉันคิดว่า ... คุณต้องค้นหาเกมที่มี hooks เพื่อให้สามารถตรวจสอบวัตถุได้ (ไฟล์ถอดรหัส hex... หรือดีกว่านั้นเช่น python-mario ที่คุณสามารถโต้ตอบได้โดยตรง)   -  person Joran Beasley    schedule 09.05.2015
comment
ซ้ำซ้อนได้ไหม? stackoverflow.com/q/24129253/541038   -  person Joran Beasley    schedule 09.05.2015
comment
คุณอาจต้องการ อ่าน whathaveyoutried.com และแสดงความเคารพ ต่อชุมชน StackOverflow ซึ่งสนับสนุนอย่างยิ่งให้โพสต์คำถามคุณภาพสูง พร้อมด้วย MCVE ( ตัวอย่างขั้นต่ำที่สมบูรณ์-ตรวจสอบได้ของ code ) แสดงสิ่งที่คุณได้ลองมาแล้ว คุณอาจต้องการอัปเดตโพสต์ของคุณเพื่อให้เป็นไปตามระดับคุณภาพขั้นต่ำที่เหมาะสม และเพื่อแสดงเจตจำนงของคุณที่จะเคารพสมาชิกที่มีส่วนร่วมของ StackOverflow คนอื่นๆ พวกเขาเป็นมืออาชีพที่ชอบตอบคำถามดีๆ เกี่ยวกับประเด็นที่เกี่ยวข้องกับ MCVE สนุกกับการเป็นสมาชิก StackOverflow Contributing และสนับสนุนมารยาทของชุมชนนี้   -  person user3666197    schedule 10.05.2015


คำตอบ (1)


ตอบ: ได้ python สามารถดึงและประมวลผลฉาก ใดๆ ผ่านอุปกรณ์อินพุต USB

ปัญหาการออกแบบการประมวลผลภาพแบบเรียลไทม์ (ไม่ใช่สตรีม ... ) นั้นเกี่ยวกับประสิทธิภาพ RT-loop โดยรวม ซึ่งส่วนใหญ่เป็นการแปลงและการประมวลผลภาพ ไม่ใช่แค่ขนาดภาพคงที่และวิธีการรับข้อมูลต่อ

อย่างไรก็ตาม โค้ดของคุณจะต้องได้รับการออกแบบอย่างระมัดระวังและวัดล่วงหน้าใน [usec, nsec] (ใช่ มีเครื่องมือหลามเพื่อให้คุณสามารถเปรียบเทียบปัญหาด้านเวลาของโค้ดของคุณลงไปที่ความละเอียด 25 nsec บางส่วน) เพื่อคงไว้ซึ่งทั้งหมด RT-loop เป็นไปได้ภายในสถาปัตยกรรมการประมวลผลภาพทั่วไปของคุณ นอกจากนี้ คุณจะต้องดิ้นรนกับทั้งการจัดการทรัพยากรและการจัดการข้อผิดพลาด ซึ่งทั้งสองอย่างนี้ทำให้เกิดปัญหามากมายในการกำหนดเวลา RT

ยังไง? ใช้สิ่งนี้เป็นแรงบันดาลใจในการเริ่มต้น

ตัวอย่างที่นำมาเป็นเพียงแนวคิดเบื้องต้นในการจับภาพจากต้นแบบงูหลาม PoC สำหรับการถ่ายภาพทางการแพทย์:

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>

ซีเควนซ์ที่บันทึกไว้ล่วงหน้าเป็นสิ่งที่ต้องมีหรือเป็นสิ่งที่ควรมี?

เท่าที่มีการแสดงแรงจูงใจของคุณ ต้นแบบของคุณจะใช้เวลามากในการพัฒนา ลำดับที่บันทึกไว้ล่วงหน้าอาจช่วยให้คุณมุ่งความสนใจไปที่ด้านการพัฒนา/การทดสอบ ในขณะที่สมาธิของคุณจะไม่ถูกแบ่งครึ่งระหว่างเกมและโค้ด Python อย่างไรก็ตาม สิ่งเหล่านี้ไม่ใช่สิ่งที่ต้องมี

ข้อสังเกตเกี่ยวกับ FPS คุณสร้าง AI เพื่อต่อต้านผู้เล่นที่เป็นมนุษย์

อย่างที่กล่าวไปแล้ว เครื่องยนต์ AI เริ่มต้นของคุณอาจเริ่มต้นที่ต่ำเพียง 10-15 FPS ไม่จำเป็นต้องพาตัวเองเข้าสู่ปริศนา RT-loop ที่แก้ไม่ได้เพียงเพราะอัตรา FPS สูงเกินจริง

ตา / สมองของมนุษย์ของเราได้รับภาพลวงตาของการเคลื่อนไหวที่ไหนสักแห่งใกล้กับอัตราการรีเฟรชของทีวี (หมายถึงทีวีแอนะล็อกดั้งเดิมซึ่งมีประมาณ 21 ครึ่งจอเพียงพอสำหรับคนมานานหลายทศวรรษ (ไม่เหมือนกันสำหรับสุนัข ... ดังนั้น บริษัทการตลาดมุ่งเน้นไปที่การมีอิทธิพลต่อมนุษย์ โดยวัดผลกระทบของแคมเปญโฆษณาโดยใช้มาตรวัดผู้คน ไม่ใช่มาตรวัดสุนัข เนื่องจากเพื่อนที่ดีที่สุดของเราไม่ชอบดูสถิติที่กะพริบแปลกๆ เหล่านั้นบนหน้าจอทีวีเลย ))

ดังนั้นอย่าออกแบบเครื่องยนต์ AI ที่จะพัฒนามากเกินไป มันจะมุ่งเป้าไปที่การเอาชนะผู้เล่นที่เป็นมนุษย์ ไม่ใช่พวกสุนัขใช่ไหม?

person user3666197    schedule 10.05.2015