IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Une rotation inattendue


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 123
    Par défaut Une rotation inattendue
    Bonjours à tous,
    j'ai cree un programme en openCV sous visual studio 6 pour capture la video de la webcam puis l'afficher et tracer les contours dessus ( voir code dessus )
    au moment de l'affichage, l'image de la cam est bien affiche Mais le contour est tracé Avec un effet Mirroir.
    d'ou vient ce bug SVP ?

    Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include <cv.h>
    #include <cvaux.h>
    #include <highgui.h>
    #include <stdio.h>
     
     
    int main()
    {
    	IplImage* test=0;
    	CvCapture* capture = 0;
    	//capture   = cvCaptureFromAVI("ab.avi");
    	capture   = cvCaptureFromCAM(0);
     
    	CvMemStorage* storage = cvCreateMemStorage(0);
    	IplImage* frame;
    	IplImage* Image_Contour_1channel;
    	IplImage* Image_Contour_3channel;
     
    	CvSeq * contour = 0;
     
    	int press_key;
    	int slider_pos=70;
     
    	if(capture)
    	{
    		test = cvQueryFrame(capture);
    		int width = (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH );
    		int height= (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT);
    		printf("width %d height %d\n",width,height);
     
    		frame    = cvCreateImage(cvSize(width,height), 8  ,3);
    		Image_Contour_3channel     = cvCreateImage(cvSize(width,height), 8  ,3);
    		Image_Contour_1channel= cvCreateImage(cvSize(width,height), 8  ,1);
     
     
    		//cvNamedWindow( "Imerir_Seuil", 0 );
    		cvNamedWindow( "Imerir_Tracker", 0 );
    		while(cvGrabFrame(capture)) 
    		{
    			frame = cvRetrieveFrame(capture);
    			cvConvertImage(frame,Image_Contour_1channel,1);
     
    			Image_Contour_3channel=cvCloneImage(frame);
     
     
     
     
    			cvCreateTrackbar( "Bar", "Imerir_Tracker", &slider_pos, 255,NULL);
    			cvThreshold( Image_Contour_1channel,Image_Contour_1channel,  slider_pos, 255, CV_THRESH_TOZERO );
    			cvFindContours( Image_Contour_1channel, storage, &contour, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);//CV_CHAIN_APPROX_NONE //CV_CHAIN_APPROX_SIMPLE
     
    			for( ; contour != 0; contour = contour->h_next )
    			{
    				//CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
    				// replace CV_FILLED with 1 to see the outlines 
    				//cvDrawContours( FrameContour, contour, color, color, -1, 1, 8 );
    				cvDrawContours(Image_Contour_3channel, contour,CV_RGB(0,0,255), CV_RGB(255, 0, 0),2, 2, 8);
    			}
    			cvShowImage( "Imerir_Tracker", Image_Contour_3channel );
    			//cvShowImage( "Imerir_Seuil", Image_Contour_1channel );
    			press_key = cvWaitKey(5);
    			if( (char)press_key == 27 )
    				break;
    		}
    	}
    	else printf("Video stream not found\n\n");
     
     
    	cvReleaseImage( &Image_Contour_3channel );
    	cvReleaseImage( &Image_Contour_1channel );
    	cvDestroyWindow("Imerir_Tracker");
     
    	return 0;
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Par défaut
    Essaie de rajouter dans ce bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    test = cvQueryFrame(capture);
    int width = (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH );
    int height= (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT);
    printf("width %d height %d\n",width,height);
    		
    frame    = cvCreateImage(cvSize(width,height), 8  ,3);
    Image_Contour_3channel     = cvCreateImage(cvSize(width,height), 8  ,3);
    Image_Contour_3channel->origin = test->origin
    Image_Contour_1channel= cvCreateImage(cvSize(width,height), 8, 1);
    Image_Contour_1channel->origin = test->origin
    Je ne sais pas si ca va marcher mais ya souvent des problèmes d'images qui ont pas la même origine dans OpenCV (origine en haut a gauche ou en bas a gauche).
    Sinon tu n'est pas obligé de créer l'image frame
    frame = cvCreateImage(cvSize(width,height), 8 ,3); tu peux donc supprimer cette ligne je pense
    quand tu fais cvRetrieveFrame ca le fait pour toi.
    Sinon une petite question que fais la fonction cvConvertImage ?
    Pour finir, si jamais ton but est juste de tracer les contours, tu as une méthode plus simple. La méthode que tu appliques permet de séparer les différents contours de l'image. Si jamais tu n'as pas besoin de les séparer tu peux tout simplement faire l'algorithme de Canny (règles les deux seuils 50 et 50 dans la fonction cvCanny pour adapter la détection)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
    IplImage* frame = cvQueryFrame(capture);
    IplImage* gray = cvCreateImage(cvGetSize(frame), 8, 1);
    IplImage* contours = cvCreateImage(cvGetSize(frame), 8, 1);
    contours->origin = frame->origin;
     
    cvNamedWindow("Contours", 1);
     
    while(cvWaitKey(10)==-1){
    	frame = cvQueryFrame(capture);
    	cvCvtColor(frame, gray, CV_BGR2GRAY);
    	cvCanny(gray, contours, 50, 50, 3);
    	cvShowImage("Contours", contours);
    }
    cvReleaseImage(&contours);
    cvReleaseImage(&gray);
    cvReleaseImage(&frame);
    cvReleaseCapture(&capture);

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 123
    Par défaut
    merci bcp, ca marche nikel !!
    enfait pour mon projet, j'ai un camera monter sur une tourrelle ( PTU 46 ),
    et il doit suivre des objets en mouvement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire une rotation d'image
    Par sozie9372 dans le forum 2D
    Réponses: 6
    Dernier message: 30/11/2005, 22h40
  2. [SVG] Effectuer une rotation d'un texte type 'tspan'
    Par M4v3rick dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 21/06/2005, 18h33
  3. Comment faire une rotation de metafile (l'angle de 90° me suffit) ?
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 4
    Dernier message: 28/01/2005, 08h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo