Comment prendre des captures d'écran rapide en Java?
Je me suis mise en œuvre d'un simple eye tracker, qui nécessite rapide screenshoting de ce qui se passe sur l'écran simultanément avec la capture de la vidéo de la webcam.
Le truc, c'est que la façon de le faire avec un Robot, mentionné ici: https://stackoverflow.com/questions/2475303/java-library-for-capturing-active-window-screenshot
est extrêmement lent.
Par la voie, de la récupération de la vidéo d'une webcam fonctionne beaucoup plus rapidement et retourne le tableau d'octets, ce qui est très rapide pour être traitées.
Quelqu'un connais une solution plus rapide? Bibliothèques C++, ce qui peut être lié à Java pour faire cela peut vous aider.
Merci!
Mise à JOUR:
A décidé de passer à OpenCV, maintenant à la recherche de la façon de faire une capture d'écran avec elle 🙂
Ajouté au post ci-dessous
Découvrez nircmd.Il a obtenu un construit en touche func pour ce faire
nircmd.exe cmdwait 0 savescreenshot "f:\temp\shot.png"
.Mettre ce programme dans votre projet et l'exécuter à l'aide de Runtime()OriginalL'auteur lyuba | 2010-05-26
Vous devez vous connecter pour publier un commentaire.
u devrait certainement donner un coup de OpenCV
Voici la façon de le faire: ubaa.net/shared/processing/opencv Cependant, j'ai décidé de l'essayer C++, merci pour l'inspiration!
oh merci pour l'api java, j'ai été à la recherche pour elle aussi!
Ici est encore une meilleure API: code.google.com/p/javacv
OriginalL'auteur Ilya Saunkin
Voici une version spécifique à l'aide de la " JNA " que j'utilise dans un de mes projets.
J'ai trouvé que c'était un ordre de grandeur plus rapide que
Robot
, même avec l'appel des indigènes de frais généraux.hey est-il un moyen de sauvegarder le contenu d'un HDC? Je comprends comment les enregistrer sous forme de fichiers jpeg, mais je me demandais si il y avait un autre moyen rapide pour enregistrer le contenu d'un HDC afin que je puisse plus tard resue pour créer des fichiers jpeg
ne pouvais pas le faire fonctionner. La version de la JNA avez-vous utilisé @finnw ?
désolé, je ne me souviens pas et n'ont pas accès à cette base de code pour le moment, mais je pense que c'était la version la plus récente lorsque je l'ai installé (vers le mois de juin 2009.)
pour tous ceux qui cherchent à une version plus récente de ce code : stackoverflow.com/questions/6998438/...
OriginalL'auteur finnw
La
robot.createScreenCapture(captureSize);
appel prend environ 20ms pour moi.Je n'ai pas beaucoup d'expérience de travail avec des données provenant de webcams, mais je pensais qu'ils seraient d'approvisionnement beaucoup plus faible résolution, et de pré-flux comprimés.
Vous avez raison: j'ai l'ordinaire Logitek C300 webcam, elle retourne 480*640 images. J'utilise la Vidéo pour Linux lib pour traiter la vidéo, il est écrit en C et fonctionne parfaitement rapide. Ceux que j'ai essayer d'attraper la capture d'écran avec la même vitesse en temps réel - il immédiatement ralentit le processus. J'ai fait une capture comme BufferedImage capture d'écran = robot.createScreenCapture( new Rectangle(boîte à outils.getDefaultToolkit().getScreenSize())); Peut-il se produire en raison de la BurrefedImage? Est-il possible de le tableau de bits de Robot?
Ce que je devrais ajouter, c'est que la chose la plus importante dans l'oeil de l'tracker est de prendre la capture d'écran presque au même moment, comme chaque webcam shot. 20ms peut en fait être trop long. Ce serait également idéal pour capturer l'écran dans la taille normale, et pas seulement 480*640.
En regardant la source de
createScreenCapture
montre qu'une RobotPeer est demandé pour le tableau d'octets, qui est ensuite enveloppé dans un BufferedImage. Il comprend également la synchronisation et restoreLocalAcceleration appels. Cependant RobotPeer n'est pas apte à être utilisé directement.OriginalL'auteur Stephen Denne
Peut-être vous pouvez faire usage de JMF.. la Caisse de la L'écran de Saisie du code @ Oracle du site. Je pense que ça va vous aider à résoudre votre problème.
OriginalL'auteur Abdel Raoof