Capture d'écran avec OpenCV et Python 2.7
Je suis en utilisant Python 2.7 et OpenCV 2.4.9.
J'ai besoin de capturer l'image actuelle qui est montré à l'utilisateur et de charger comme un cv::Mat objet en Python.
Savez-vous un moyen rapide de le faire de manière récursive?
J'ai besoin de quelque chose comme ce qui est fait dans l'exemple ci-dessous, qui capture Mat des images d'une webcam de manière récursive:
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 est utilisé le VideoCapture classe de travailler avec l'image capturée à partir de la webcam.
Avec VideoCapture.lire (), un nouveau cadre est toujours lues et stockées dans un Mat de l'objet.
Pourrais-je charger un "printscreens stream" dans un VideoCapture objet? Pourrais-je créer un flux de mon écran de l'ordinateur avec OpenCV en Python, sans avoir à les enregistrer et de supprimer beaucoup de .bmp fichiers par seconde?
J'ai besoin de ce châssis de Mat objets ou tableaux NumPy, afin que je puisse effectuer une certaine Vision par Ordinateur routines avec cette images en temps réel.
frame
contient déjà l'image. Pourquoi ne pas simplement utiliser directement?Ce que je comprends, il est juste à la recherche d'un moyen pour injecter des printscreens comme des images plutôt que des images de la webcam. Depuis le moniteur n'est pas inclus dans la liste des périphériques pris en
cv2.VideoCapture
, il Vous suffit de saisir le printscreen d'ailleurs, tel que PIL Image.Imagegrab.grab()
, de les convertir en un tableau numpy, et de l'injecter dans le code indiqué ci-dessus comme une image...OriginalL'auteur Renan V. Novas | 2014-06-09
Vous devez vous connecter pour publier un commentaire.
C'est une solution de code que j'ai écrit à l'aide de @Raoul conseils.
J'ai utilisé PIL ImageGrab module de saisir la printscreen images.
Pourquoi avez-vous fait .reshape() et comment ça fonctionne? La documentation est un peu difficile à comprendre. J'ai "ValueError: taille totale du tableau doit être inchangée"
Désolé, mon erreur, vous pouvez utiliser dtype = numpy.uint8
Remodeler est une méthode d'objets numpy.ndarray. J'ai remodelé le tableau parce qu'une image est une matrice (n,m), avec n lignes et m colonnes. Je suis de transformer une stagnation de la matrice en une matrice (n,m) avec la méthode de les remodeler.
J'obtiens une vitesse (cadence) augmentation de près de 100 fois si je change
np.array(printscreen_pil.getdata(), dtype=uint8)
ànp.array(printscreen_pil, dtype=uint8)
.OriginalL'auteur Renan V. Novas
J'avais cadence des problèmes avec d'autres solutions, mss les résoudre.
ImageGrab
à 0,06 s à l'aide demss
, merci monsieur!OriginalL'auteur Neabfi