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; }
6 Réponses :
Vous incrémentez deux fois g_slider_position deux fois dans le code, il augmentera donc au-delà de sa limite (définie dans à corriger, changez ce p> à p> 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> CVCreatRackBarbar code> comme
images code>). Cela provoque probablement de votre image de geler.
if (frames != 0)
{
cvCreateTrackbar(
"Position",
"The Tom 'n Jerry Show",
&g_slider_position,
frames,
onTrackbarSlide
);
}
else
{
exit(1);
}
Désolé, j'avais vraiment mal cité mon code. Le code que je veux corrigé n'a pas le ++ g_slider_position; code> 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'
Vous pouvez essayer la solution ci-dessous.
modifier ce p> à p> et modifier également ceci p> à p>
Bonjour, j'ai un code similaire et j'ai procédé aux éléments suivants: ............... p> Vous pouvez donc attraper la barre de diapositives à n'importe quelle direction, j'espère que cela peut aider P> P>
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 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 p> 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 p> p>
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); }
Cela me semble un peu compliqué pour moi. J'ai utilisé le La fonction de rappel est ensuite utilisée pour changer la position dans g_capture. P > donc le rappel est: p> et la boucle est: p> où le cvgetcaptureProperty (g_capture, cv_cap_prop_pos_frames) code> Appelez pour extraire le cadre actuel et utilisé pour mettre à jour le curseur.
g _ code> variables sont globales. P> p>
Est-ce que la photo gèle ou toute l'application?