Вот шаги, которые я хочу, чтобы этот проект следовал с использованием 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;
}
Однако, когда я запускаю это, я получаю одно и то же изображение в обоих окнах. Кто-нибудь может объяснить, почему это происходит? Что я могу сделать, чтобы это работало так, как я объяснил?
Если вы работаете на 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);
Вам нужно поставить cap()
вызов внутри цикла — иначе вы делаете только один захват
Вместо того, чтобы использовать cap >> img1
а также cap >> img2
Я добавил переменную Mat под названием «captura» для хранения текущего кадра и использовал img1 = captura.clone()
а также img2 = captura.clone()
соответственно и сейчас работает.