2010-10-20 8 views
3

Cela devrait être facile. J'ai un flux vidéo venant de ma webcam. Je suis en train de jouer avec la transformation d'image, etc. J'aimerais pouvoir voir les images originales (entrée vidéo) dans une fenêtre et la vidéo transformée dans une autre. Le problème est que, dès que je commence à capturer de la vidéo au lieu d'une seule image, la fenêtre vidéo d'origine affiche la vidéo transformée. Je ne comprends pas pourquoi.OpenCV affiche à la fois la vidéo entrante et la vidéo modifiée dans des fenêtres séparées

cvNamedWindow("in", CV_WINDOW_AUTOSIZE); 
cvNamedWindow("out", CV_WINDOW_AUTOSIZE); 

CvCapture *fc = cvCaptureFromCAM(0); 

IplImage* frame = cvQueryFrame(fc); 

if (!frame) { 
    return 0; 
} 

IplImage* greyscale = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
IplImage* output = cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F , 1); 

while(1){ 

    frame= cvQueryFrame(fc); 
    cvShowImage("in", frame); 

    // manually convert to greyscale 
    for (int y = 0; y < frame->height; y++) { 
     uchar* p = (uchar*) frame->imageData + y* frame->widthStep; // pointer to row 
     uchar* gp = (uchar*) greyscale->imageData + y*greyscale->widthStep; 
     for(int x = 0; x < frame->width; x++){ 
      gp[x] = (p[3*x] + p[3*x+1] + p[3*x+2])/3; // average RGB values 
     } 
    } 

    cvShowImage("out", greyscale); 

    char c = cvWaitKey(33); 
    if (c == 27) { 
     return 0; 
    } 
} 

Dans cet exemple simple, les deux flux vidéo finissent par apparaître ... Les valeurs de gris de pointeur et imageData pour cadre et sont totalement différentes nuances de gris. Si j'arrête d'afficher les niveaux de gris dans la fenêtre "out", alors l'image apparaîtra en couleur. En outre, si je continue et applique une opération Sobel sur l'image en niveaux de gris et affiche le résultat dans "out", les fenêtres "in" et "out" afficheront l'image Sobel!

Des idées?

Répondre

1

Hmm C'était bizarre, mais il semble que l'utilisation de CV_WINDOW_AUTOSIZE était le problème? Peut-être que ce n'est pas supporté dans OpenCV 2.1 (dont je suis sûr que c'est ce que je suis en train de faire). Quoi qu'il en soit, en utilisant 0 au lieu de CV_WINDOW_AUTOSIZE lors de la création de la fenêtre fonctionne très bien.

+0

Ok, n'oubliez pas d'accepter votre propre réponse lorsque vous le pouvez. – karlphillip

0

J'ai essayé votre code avec OpenCV 2.0 sous mandriva 2010 et il fonctionne très bien soit avec CV_WINDOW_AUTOSIZE ou 0.

Vous pouvez essayer de convertir en niveaux de gris avec cvCvtColor(frame,grayscale,CV_RGB2GRAY) et voir si le problème persiste.

+0

hmm Je cours openCV 2.1. Il y avait plus d'erreurs que cela causé par la fenêtre autosize ... Dans certains cas, la deuxième fenêtre afficherait la moitié correcte, et la moitié d'une vue brouillée de la première fenêtre. De toute façon, en utilisant 0 fait tout disparaître. Très étrange. – wallacer

Questions connexes