11
votes

OPENCV - Obtenir le curseur pour mettre à jour sa position pendant la lecture vidéo

J'ai ramassé "l'apprentissage OpenCV" et j'essaye certains des exemples / exercices de code. Dans cet extrait de code, je veux obtenir le curseur de mettre à jour sa position avec chaque changement de cadre vidéo, mais pour une raison quelconque, cela ne fonctionnera pas (la photo gèle avec le code suivant):

#include "cv.h"
#include "highgui.h"

int g_slider_position = 0;
CvCapture* g_capture = NULL;

void onTrackbarSlide(int pos)
{
    cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);
}

int main(int argc, char** argv)
{
    cvNamedWindow("The Tom 'n Jerry Show", CV_WINDOW_AUTOSIZE);
    g_capture = cvCreateFileCapture(argv[1]);
    int frames = (int) cvGetCaptureProperty(
        g_capture, 
        CV_CAP_PROP_FRAME_COUNT
        );

    if (frames != 0)
    {
        cvCreateTrackbar(
            "Position",
            "The Tom 'n Jerry Show",
            &g_slider_position,
            frames,
            onTrackbarSlide
            );
    }

    IplImage* frame;

    while (1)
    {
        frame = cvQueryFrame(g_capture);
        if (!frame) 
            break;

        cvSetTrackbarPos(
            "Position", 
            "The Tom 'n Jerry Show",
            ++g_slider_position
            );

        cvShowImage("The Tom 'n Jerry Show", frame);
        char c = cvWaitKey(33);
        if (c == 27)
            break;
    }

    cvReleaseCapture(&g_capture);
    cvDestroyWindow("The Tom 'n Jerry Show");

    return 0;
}


1 commentaires

Est-ce que la photo gèle ou toute l'application?


6 Réponses :


5
votes

Vous incrémentez deux fois g_slider_position deux fois dans le code, il augmentera donc au-delà de sa limite (définie dans CVCreatRackBarbar code> comme images code>). Cela provoque probablement de votre image de geler.

à corriger, changez ce p> xxx pré>

à p> xxx pré>


Comptabilisation du code modifié, je vérifierais que OpenCV lisait correctement le nombre de cadres de votre dossier. Regardez l'exemple 2.3 de l'apprentissage OpenCV pour une méthode de récupération générique du nombre de cadres de votre AVI (si c'est ce que vous utilisez). P>

Dans votre code ci-dessus, si le nombre de cadres est 0, la barre de capture n'est pas créée, mais le code entre toujours une boucle qui tente de mettre à jour la position de la barre de course (s'il trouve un cadre). Je l'utiliserais à la place: P>

if (frames != 0)
{
    cvCreateTrackbar(
        "Position",
        "The Tom 'n Jerry Show",
        &g_slider_position,
        frames,
        onTrackbarSlide
        );
} 
else
{
    exit(1);
}


4 commentaires

Désolé, j'avais vraiment mal cité mon code. Le code que je veux corrigé n'a pas le ++ g_slider_position; instruction. J'ai édité la question ci-dessus; Cela donne le même problème que décrit initialement.


@Kristian - j'ai édité la réponse. Espérons que cela vous aide maintenant.


Merci Seth. Il trouve apparemment le nombre total de cadres correctement, bien que votre édition a évidemment rendu le code beaucoup plus robuste. Malheureusement, le problème survient toujours (la vidéo gèle, mais la barre de troisime se met à jour correctement). BTW, oui, c'est un AVI.


@Kristian - je vois. J'ai mal interprété ce qui gelait ici. Le fait que la barre de capture continue de se mettre à jour suggère qu'il existe un problème avec votre décodeur. Pouvez-vous convertir le fichier AVI en brut et réessayer? La conversion peut être accomplie en exécutant 'Mencoder in.avi -Ovc brut -vf format = i420 -o out.avi'



1
votes

Vous pouvez essayer la solution ci-dessous.

modifier ce xxx

à xxx

et modifier également ceci xxx

à xxx


0 commentaires

1
votes

Bonjour, j'ai un code similaire et j'ai procédé aux éléments suivants: xxx

............... xxx

Vous pouvez donc attraper la barre de diapositives à n'importe quelle direction, j'espère que cela peut aider


0 commentaires

1
votes

OK j'ai finalement résolu ce problème de mise à jour du curseur et aussi si vous souhaitez déplacer le curseur, la vidéo sera mise à jour Il n'y a pas de problème de congélation de la photo maintenant xxx

ok maintenant ce que j'ai fait, c'est que j'ai créé un compteur global qui sera mis à jour à côté de l'encadrement

maintenant quand Nous utilisons le curseur avec la souris à une position différente, puis dans la routine ONTRACKBARSLIDER La boucle si elle sera initiée et il définira la vidéo sur la nouvelle position


0 commentaires

7
votes
This is the actual working code



// PROGRAM TO ADD A UPDATING TRACKBAR TO A VIDEO

#include <cv.h>
#include <highgui.h>


int g_slider_position = 0;
CvCapture* video_capture = NULL;

void onTrackbarSlide(int current_frame)
{
    current_frame = g_slider_position;
    cvSetCaptureProperty(video_capture,CV_CAP_PROP_POS_FRAMES,current_frame);
}

int main( int argc, char** argv )
{
    cvNamedWindow( "Video", CV_WINDOW_AUTOSIZE );
    video_capture = cvCreateFileCapture( "Crowdy.avi");
    int no_of_frames = (int) cvGetCaptureProperty(video_capture,CV_CAP_PROP_FRAME_COUNT);
    if( no_of_frames!= 0 ) 
    {
        cvCreateTrackbar("Slider","Video",&g_slider_position,no_of_frames,onTrackbarSlide);
    }

    IplImage* frame;

    while(1) 
    {
        frame = cvQueryFrame( video_capture );
        if( !frame ) break;
        cvShowImage( "Video", frame );
        cvSetTrackbarPos("Slider","Video",++g_slider_position);
        char c = cvWaitKey(33);
        if( c == 27 ) break;
    }
    cvReleaseCapture( &video_capture );
    cvDestroyWindow( "Video" );

    return(0);
}

0 commentaires

3
votes

Cela me semble un peu compliqué pour moi. J'ai utilisé le cvgetcaptureProperty (g_capture, cv_cap_prop_pos_frames) Appelez pour extraire le cadre actuel et utilisé pour mettre à jour le curseur.

La fonction de rappel est ensuite utilisée pour changer la position dans g_capture.

donc le rappel est: xxx

et la boucle est: xxx

où le g _ variables sont globales.


0 commentaires