Capture de 1080p à 30fps à partir de logitech c920 avec openCV 2.4.3
j'essaie de capturer le flux vidéo de mon Logitech C920 dans OpenCV. Avec Labview, je peux accéder à un flux MJPG à 30fps 1080p. Dans opencv je suis limité à 5fps ou 640x480.
voici le code correspondant aux paramètres de la caméra:
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
ceux-ci renvoient tous 1, mais j'obtiens un flux 5fps de 1080p qui correspond au flux YUY2.
Si j'ajoute la ligne suivante:
this->camRef.set(CV_CAP_PROP_FPS, 30);
Cette commande retourne 0. J'ai un flux de 30 fps à 640 x 480. Pour moi, il semble que le réglage MJPG ne soit pas accepté mais je ne sais pas quoi faire ou comment corriger cela.
EDIT: La suite bloque le programme.
this->camRef.read(this->image);
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height) << std::endl;
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl;
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC) << std::endl;
Ensuite dans mon code j'ai le code suivant:
void camera::run()
{
while(true)
{
if(this->camRef.read(this->image) == 0)
{
if(this->capture)
{
cv::imwrite(fileName,this->image);
this->count++;
}
}
msleep(15);
}
}
EDIT2: la Solution est de régler le codec fourCC avant de régler la hauteur et la largeur de la caméra.
3 réponses
Comme l'auteur du post déjà trouvé la solution, mais n'a pas l'ajouter comme une réponse, je vais mettre ici la solution.
Vous devez définir le codec avant de définir le voulait résolution:
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
Essayez d'obtenir la première image de la capture avant de régler quoi que ce soit:
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
Mat frame;
cap >> frame;
double fps;
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0);
//add the loop here
et vérifiez si cela fonctionne sans configurer MJPG. Si cela fonctionne, essayez avec MJPG.
pour moi, c'est un peu bizarre que vous deviez obtenir le premier cadre avant de fixer quoi que ce soit, mais c'est la seule façon que cela fonctionne pour moi (windows 7 32bit).
/ / edit:
Vous pouvez essayer d'utiliser une API différente - voir deuxième une partie de ma réponse ici:https://stackoverflow.com/a/14188280/1598485 OpenCV essaie d'utiliser la meilleure API par défaut, mais peut-être que dans votre cas, une autre API fonctionnera mieux.
travailler avec logitech c922, nécessaire:
capture.open(CV_CAP_DSHOW);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);