Захват 2 последовательных кадров с помощью веб-камеры в OpenCV

Вот шаги, которые я хочу, чтобы этот проект следовал с использованием OpenCV:

1) Захватить один кадр, когда я нажимаю клавишу 1.

2) Переместить веб-камеру

3) Захватить второй кадр, когда я нажимаю клавишу 2.

4) Показать оба изображения.

Вот код, с которым я работаю:

int main(int, char**){
VideoCapture cap(1);
Mat img1, img2;
int input;
namedWindow("Imagen 1",CV_WINDOW_AUTOSIZE);
namedWindow("Imagen 2",CV_WINDOW_AUTOSIZE);

for(;;){
input = cvWaitKey(40);
if((char) input ==27)
break;
if ((char) input == 49){
cap >> img1;
imshow("Imagen 1",img1);
}
if ((char) input == 50){
cap >> img2;
imshow("Imagen 2",img2);
}
}
return 0;
}

Однако, когда я запускаю это, я получаю одно и то же изображение в обоих окнах. Кто-нибудь может объяснить, почему это происходит? Что я могу сделать, чтобы это работало так, как я объяснил?

0

Решение

Если вы работаете на Linux, то вам придется очистить буфер от устройства захвата. Я делаю это, запустив отдельный поток, который читает кадры и запоминает только последний. Когда я хочу взять кадр для дальнейшей обработки, я клонирую тот, который сейчас запоминается. Но в Вашем случае это может быть небольшим перебором.

Кроме того, вы можете сделать что-то вроде этого вместо вашего текущего основного цикла:

cv::Mat temp,img1,img2;
cv::VideoCapture cap(1);
char control=' ';
cv::namedWindow("current",CV_AUTOSIZE);
cv::namedWindow("img1",CV_AUTOSIZE);
cv::namedWindow("img2",CV_AUTOSIZE);
do{
if(49 == control){
img1=temp.clone();
cv::imshow("img1",img1);
}else if(50 == control){
img2=temp.clone();
cv::imshow("img2",img2);
}
cap>>tmp; //emptying buffer all the time
cv::imshow("current",tmp);
control=cv::waitKey(40);//if You are faster than captures fps
}while(27 != control);
1

Другие решения

Вам нужно поставить cap() вызов внутри цикла — иначе вы делаете только один захват

0

Вместо того, чтобы использовать cap >> img1 а также cap >> img2Я добавил переменную Mat под названием «captura» для хранения текущего кадра и использовал img1 = captura.clone() а также img2 = captura.clone() соответственно и сейчас работает.

0
По вопросам рекламы [email protected]