2017-05-19 1 views
0

J'obtiens actuellement le flux de la webcam de mon ordinateur portable en utilisant la fonction VideoCapture cap (0), puis je l'affiche dans un cadre Mat. Ce que je veux faire ensuite est chaque fois que j'appuie sur une touche 'c' par exemple, il prend la capture d'écran du cadre et l'enregistre dans un dossier sous forme d'image JPEG. Cependant, je n'ai aucune idée sur la façon de le faire. L'aide est très nécessaire, merci.Prendre une capture d'écran du flux de la webcam sur Keypress en utilisant OpenCV et C++

+0

Ce fil peut être en mesure de vous aider; le code de l'OP devrait fonctionner (il a simplement eu quelques problèmes avec Visual Studio): http://stackoverflow.com/questions/26940378/how-do-i-grab-a-still-image-from-a-cam-using- imwrite-in-opencv-c –

Répondre

1

J'ai passé plusieurs jours à chercher sur Internet la bonne solution avec une simple saisie au clavier. Il y avait toujours des leg/delay en utilisant cv :: waitKey.

La solution que j'ai trouvée est avec l'ajout de sommeil (5) juste après la capture de la trame de la webcam.

L'exemple ci-dessous est une combinaison de différents threads de forum.

Fonctionne sans aucune jambe/retard. Windows OS.

Appuyez sur "q" pour capturer et enregistrer le cadre.

Un flux webcam est toujours présent. Vous pouvez changer la séquence pour montrer l'image/le cadre capturé. PS "tipka" - signifie "clé" sur le clavier.

Cordialement, Andrej

#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <windows.h> // For Sleep 


using namespace cv; 
using namespace std; 


int ct = 0; 
char tipka; 
char filename[100]; // For filename 
int c = 1; // For filename 

int main(int, char**) 
{ 


    Mat frame; 
    //--- INITIALIZE VIDEOCAPTURE 
    VideoCapture cap; 
    // open the default camera using default API 
    cap.open(0); 
    // OR advance usage: select any API backend 
    int deviceID = 0;    // 0 = open default camera 
    int apiID = cv::CAP_ANY;  // 0 = autodetect default API 
            // open selected camera using selected API 
    cap.open(deviceID + apiID); 
    // check if we succeeded 
    if (!cap.isOpened()) { 
     cerr << "ERROR! Unable to open camera\n"; 
     return -1; 
    } 
    //--- GRAB AND WRITE LOOP 
    cout << "Start grabbing" << endl 
     << "Press a to terminate" << endl; 
    for (;;) 
    { 
     // wait for a new frame from camera and store it into 'frame' 
     cap.read(frame); 

     if (frame.empty()) { 
      cerr << "ERROR! blank frame grabbed\n"; 
      break; 
     } 


     Sleep(5); // Sleep is mandatory - for no leg! 



     // show live and wait for a key with timeout long enough to show images 
     imshow("CAMERA 1", frame); // Window name 


     tipka = cv::waitKey(30); 


     if (tipka == 'q') { 

      sprintf_s(filename, "C:/Images/Frame_%d.jpg", c); // select your folder - filename is "Frame_n" 
      cv::waitKey(10); 

      imshow("CAMERA 1", frame); 
      imwrite(filename, frame); 
      cout << "Frame_" << c << endl; 
      c++; 
     } 


     if (tipka == 'a') { 
      cout << "Terminating..." << endl; 
      Sleep(2000); 
      break; 
     } 


    } 
    // the camera will be deinitialized automatically in VideoCapture destructor 
    return 0; 
}