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
A
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;
}
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 –