2010-06-05 4 views
1

À partir de mes questions précédentes, j'essaie de créer un simple eye tracker. Décidé de démarrer à partir d'une version Linux (exécutez Ubuntu). Pour compléter cette tâche, il faut organiser le screencasting et la capture de la webcam de manière à ce que les images des deux flux coïncident exactement et qu'il y ait le même nombre d'images dans chacune d'entre elles. Screencasting fps dépend entièrement de la fps de l'appareil photo, de sorte que chaque fois que nous obtenons l'image de la webcam, nous pouvons potentiellement saisir un cadre d'écran et rester heureux. Cependant, tous les outils pour le screencasting rapide, comme ffmpeg, par exemple, renvoient le fichier .avi comme résultat et nécessitent le démarrage des fps déjà connus. De l'autre côté, des outils comme Java + Robot ou ImageMagick semblent nécessiter environ 20ms pour renvoyer la capture d'écran .jpg, ce qui est assez lent pour la tâche. Mais ils peuvent être demandés juste après chaque fois que le cadre de la webcam est saisi et fournir la synchronisation nécessaire.Synchronisation de screencasting (ffmpeg) et capture à partir de la webcam (OpenCV)

Ainsi, les sous-questions sont:

  1. Est-ce que la fréquence d'images de la caméra USD varient au cours d'une seule session?
  2. Existe-t-il des outils permettant de réaliser rapidement des images par image?
  3. Est-il possible de faire en sorte que ffmpeg envoie une nouvelle image au fichier .avi uniquement lorsque le programme lance cette requête?

Pour ma tâche, je peux utiliser C++ ou Java. Je suis, en fait, un concepteur d'interface, pas le programmeur de pilote, et cette tâche semble être de bas niveau. Je serais reconnaissant pour toute suggestion et pourboire!

+0

Vous voulez dire fps (images par seconde), non FSP, correct? – metaliving

+0

Bien sûr, merci! :) – lyuba

+0

Et USB au lieu de USD? –

Répondre

1

Utilisez la fonction cvGetCaptureProperty(CvCapture* capture, int property_id) de HighGUI d'OpenCV avec property_id = CV_CAP_PROP_FPS pour déterminer les images par seconde capturées par votre webcam.

Exemple d'utilisation:

CvCapture *capture = 0; 
double fps = 0.0; 

capture = cvCaptureFromCAM(0); 
fps = cvCaptureProperty(capture, CV_CAP_PROP_FPS); 
+0

Bonne idée, cependant, comment recommanderiez-vous d'organiser simultanément la capture exactement-correspondant dans ce cas? Dois-je utiliser deux threads? Ou juste initialiser ffmpeg capturer juste après la réception de la première image de la webcam et nous connaissons le fps? Toutes les suggestions sont les bienvenues, merci! – lyuba

+0

Vous ne savez pas à propos de ffmpeg, mais vous pouvez utiliser la fonction 'cvCreateVideoWriter()' créer un fichier .avi avec le flux vidéo, extraire en boucle chaque image avec la fonction 'cvGrabFrame()' et l'écrire sur le fichier vidéo ' cvWriteFrame() '. Dans la même boucle, vous pouvez extraire une image de l'écran et l'écrire dans un autre fichier vidéo. Je suis confiant que si vous définissez le FPS de votre screencaster égal à la caméra, vous obtiendrez la synchronisation. – metaliving

+0

Metaliving, j'ai essayé votre méthode, mais, malheureusement, la propriété CV_CAP_PROP_FPS ne fonctionne que sous Windows, à partir de la documentation OpenCV. L'erreur est: HIGHGUI ERROR: V4L2: l'obtention de la propriété 5 n'est pas prise en charge. Je travaille sous Ubuntu et je veux aussi que mon projet soit multi-plateforme, donc je dois chercher un autre moyen de le faire. D'ailleurs, votre code a une erreur: il devrait y avoir cvGetCaptureProperty (pas cvCaptureProperty) dedans. En tout cas, merci pour vos commentaires! – lyuba

Questions connexes