web-dev-qa-db-fra.com

Capture d'écran avec OpenCV et Python-2.7

J'utilise Python 2.7 et OpenCV 2.4.9.

J'ai besoin de capturer l'image actuelle qui est montrée à l'utilisateur et de la charger en tant que cv ::Tapis objet en Python.

Connaissez-vous un moyen rapide de le faire récursivement?

J'ai besoin de quelque chose comme ce qui est fait dans l'exemple ci-dessous, qui capture Tapis images d'une webcam récursivement:

import cv2

cap = cv2.VideoCapture(0)
while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('WindowName', frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cap.release()
        cv2.destroyAllWindows()
        break

Dans l'exemple, il a utilisé la classe VideoCapture pour travailler avec l'image capturée de la webcam.

Avec VideoCapture.read (), une nouvelle image est toujours lue et stockée dans un Mat objet.

Puis-je charger un "flux d'écrans d'impression" dans un objet VideoCapture? Puis-je créer une diffusion en continu de l'écran de mon ordinateur avec OpenCV en Python, sans avoir à enregistrer et supprimer beaucoup de . Bmp fichiers par seconde?

J'ai besoin que ces cadres soient Mat objets ou tableaux NumPy, donc je peux effectuer certaines routines de vision par ordinateur avec ces trames en temps réel.

15
Renan V. Novas

C'est un code de solution que j'ai écrit en utilisant les astuces @Raoul.

J'ai utilisé le module PIL ImageGrab pour saisir les cadres de l'écran d'impression.

import numpy as np
from PIL import ImageGrab
import cv2

while(True):
    printscreen_pil =  ImageGrab.grab()
    printscreen_numpy =   np.array(printscreen_pil.getdata(),dtype='uint8')\
    .reshape((printscreen_pil.size[1],printscreen_pil.size[0],3)) 
    cv2.imshow('window',printscreen_numpy)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
29
Renan V. Novas

J'ai eu des problèmes de fréquence d'images avec d'autres solutions, mss les résoudre.

import numpy as np
import cv2
from mss import mss
from PIL import Image

mon = {'top': 160, 'left': 160, 'width': 200, 'height': 200}

sct = mss()

while 1:
    sct.get_pixels(mon)
    img = Image.frombytes('RGB', (sct.width, sct.height), sct.image)
    cv2.imshow('test', np.array(img))
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
20
Neabfi