7
votes

Dessinez sur la webcam à l'aide de OpenCV

Je veux dessiner / peindre sur un écran webcam à l'aide de OPENCV. Depuis que je lis à partir d'une caméra, les cadres changent constamment, alors j'essaie de comprendre un moyen de conserver ou d'enregistrer le dessin sur le cadre actuel et de l'utiliser pour la trame suivante. Le code ci-dessous vous permet de dessiner sur l'écran mais lorsqu'il obtient le cadre suivant, le dessin est parti et il recommence.

Quelqu'un pourrait-il m'aider s'il vous plaît ... merci. P>

          CvCapture *input;
          input = cvCaptureFromCAM( 0 );

          cvSetMouseCallback("Demo",&on_mouse, 0);

                 for(;;)
                    {
                        frame = cvQueryFrame(input);

                        if(!image)
                        {
                            image = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
                            screenBuffer = cvCreateImage( cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
                        }

                        cvCopy(frame, image, 0);

                        if(drawing) //drawing is a global variable
                        { 
                           cvCircle(image, cvPoint(last_x,last_y), 10,CV_RGB(red,green,blue), -1, CV_AA, 0);
                           cvCopy(image, screenBuffer, 0);
                        }

                        cvShowImage( "Demo", screenBuffer );
                }


        void on_mouse( int event, int x, int y, int flags, void* param )
        {
            last_x = x;
            last_y = y;

            if(event==CV_EVENT_LBUTTONDOWN)
                {
                    drawing = 1;
                }
        }


2 commentaires

liée à mes intérêts. Pouvez-vous s'il vous plaît poster dans un commentaire ici quelle documentation / tutoriels que vous utilisiez? J'aimerais avoir un début pour moi-même dans OpenCV. Merci


Il est important pour nous que vous examiniez les questions et acceptez la réponse qui résout votre problème.


3 Réponses :


2
votes

dessiner dans une image séparée puis CVADD () que vers l'image vidéo immédiatement avant de le renvoyer


0 commentaires

0
votes

Vous aurez généralement des problèmes d'ajout d'images (ils seront éventuellement saturer), alors je suppose que c'est pourquoi vous recommencez. Je vois que vous avez des images couleur ... Si vous utilisez des trucs plus puissants comme OpenGL pour votre dessin, vous pouvez utiliser la superposition pour vos dessins. Sinon vérifier cela:

http://aishack.in/Tutorials/transparent-image-overlays -In-OpenCV /


0 commentaires

1
votes

Je ne vais pas entrer dans tous les détails pourquoi votre approche est mauvaise, mais gardez à l'esprit que la création de 2 images supplémentaires pour le dessin est un peu trop trop importante.

Il est important que vous réalisiez que tout cela kinky Stuff est fait sur le même fil utilisé pour capturer de nouveaux cadres. Cela signifie quoi exactement? Cela signifie que le code supplémentaire que vous ajoutez à l'intérieur de la boucle ralentira le processus de capture et d'affichage de nouveaux cadres . En d'autres termes, vous vous sabotionnez en abaissant le framerate de votre application. Si vous ne vous souciez pas, ça va. Si vous le faites, mon conseil pour vous est que vous empilez les cadres capturés dans un tampon et que vous avez un autre fil de lecture, traitez et affichez-les.

OK, alors vous vraiment veux dessiner sur la fenêtre qui affiche les cadres capturés. Eh bien, la chose évidente vous ne pouvez pas faire (et vous avez découvert cela vous-même) est que le dessin ne peut pas être effectué sur le cadre capturé car le cadre qu'il est remplacé par de nouvelles données sur chaque boucle. Donc que fais-tu? Vous créez une 2ème image pour faire le dessin. Appelons-le le dessin_frame .

la seule chose qui sera sur le dessin_frame sont les cercles qui apparaîtront lorsque la souris se déplace sur la fenêtre, Lorsque le LBUTTON de la souris est cliqué (un 2e cliquez sur commutateurs entre ON / OFF).

Après le dessin du cercle, Le dessin_frame est superposé sur le dessus sur le cadre capturé par la caméra . Ce processus est un peu cher sur la CPU et que nous le faisons dans le fil principal de l'application, cela diminuera également le framerate.

Je suggère fortement que tout le monde intéressé par ajout / Fusion / superposition Cadres transparents avec OpenCV Jetez un coup d'œil à superpositions d'images transparentes Dans OpenCV .

à la manière , j'utilise cvcapturefromcam (-1) car je suis sur Linux. Vous devriez probablement changer cela à tout ce qui fonctionne pour vous. Selon votre message, c'est cvcapturefromcam (0) . xxx


1 commentaires

@Aziz Veuillez consulter les réponses et acceptez celui qui a résolu votre problème.