2010-06-24 6 views
1

J'essaie de traiter chaque image dans une paire de fichiers vidéo dans OpenCV, puis d'écrire les images résultantes dans un fichier avi en sortie. Tout fonctionne, sauf que le fichier vidéo de sortie semble étrange: au lieu d'une image solide, l'image est répétée trois fois et compressée horizontalement de sorte que les trois copies correspondent à la fenêtre. Je soupçonne qu'il y a quelque chose qui ne va pas avec le nombre de canaux que l'auteur attend, mais je lui donne des images à un seul canal 8 bits à écrire. Voici le réglage avec lequel je suis mon initialisation Videowriter:OpenCV - VideoWriter produit une vidéo avec une image "répétée"

//Initialize the video writer 
    CvVideoWriter *writer = cvCreateVideoWriter("out.avi",CV_FOURCC('D','I','V','X'), 30, frame_sizeL, 0); 

Quelqu'un at-il rencontré cette sortie étrange de la Videowriter OpenCV avant? J'ai vérifié les images résultantes avec cvSaveImage juste pour voir si mon processus de traitement est en train de créer l'image "triplée", mais ce n'est pas le cas. C'est seulement quand j'écris à la sortie avi avec cvWriteFrame que l'image est "triplée" et compressée. Edit: J'ai découvert que cela n'arrive que lorsque j'essaie d'écrire des images à un seul canal en utilisant une trame d'écriture. Si j'écris des images RVB 8 bits à 3 canaux, la vidéo de sortie est correcte. Pourquoi ça fait ça? Je passe correctement "0" pour l'argument de couleur lors de l'initialisation de CvVideoWriter, donc il devrait s'attendre à des images monocanal.

Répondre

0

Dans la version C++, vous devez indiquer à cv :: VideoWriter que vous envoyez une image monocanal en définissant le dernier paramètre "false", êtes-vous sûr de le faire?

modifier: Vous pouvez également convertir une image en niveaux de gris à la couleur en utilisant cvtColor() et CV_GRAY2RGB

+0

Je crois que oui. Le dernier argument de cvCreateVideoWriter indique s'il faut ou non s'attendre à des images en couleur. Je passe définitivement un 0 au dernier argument comme vu ici: cvCreateVideoWriter ("out.avi", CV_FOURCC ('D', 'I', 'V', 'X'), 30, frame_sizeL, 0); L'en-tête de fonction pour le cvCreatevideoWriter est la suivante: typedef struct CvVideoWriter CvVideoWriter CvVideoWriter * cvCreateVideoWriter (const char * nom de fichier, int fourcc, double ips, CvSize frame_size, int is_color = 1) Dois-je utiliser la syntaxe C++ de style pour la mise en place de l'écrivain vidéo plutôt que les fonctions de style c? – user375357

+0

Shoot Je viens de remarquer que la documentation dit "(le drapeau est actuellement supporté sur Windows uniquement)". J'utilise Linux, donc est-ce que cela signifie qu'il n'y a aucun moyen d'obtenir le videoWriter pour accepter les images en niveaux de gris? – user375357

+2

Solution obsolète est de faire une image en niveaux de gris 3C en mettant simplement la même valeur dans les canaux RVB. La plupart des formats vidéo attendent RGB (ou HSV) plutôt que le canal unique –

Questions connexes