Мне нужен текущий и предыдущий кадр для некоторых вычислений в OpenCV С++.
Вот мой код:
vector <cv::Mat> frames;
// Current frame
Mat M = current_frame;
Mat F; // previous frame
// set Previous Frame
if (frames.empty()) {
F = M;
frames.push_back(M);
cout << "empty" << endl;
}
else {
F = frames.back();
frames.push_back(M);
cout << " NOTempty" << endl;
}
// print frame Mat means to see if things look okay
cout << mean(M) << endl;
cout << mean(F) << endl;
Идея состоит в том, что M — это текущий кадр, а F — предыдущий кадр. Кадры хранятся в frames, векторе матриц. Если frames пусто, пусть F = M, потому что предыдущего кадра нет. Затем добавьте M к frames. Если frames не пусто, то M — текущий кадр, а F — последний мат из вектора frames. После извлечения F текущий кадр M добавляется в конец frames.
Я распечатываю среднее значение M и F, чтобы у меня была легко читаемая ссылка в терминале, если она работает правильно. К сожалению, выглядит не так.
Вот что распечатывается:
empty
[5.09352, 6.60551, 8.54364, 0]
[5.09352, 6.60551, 8.54364, 0]
NOTempty
[5.02325, 6.46646, 8.39534, 0]
[92.0037, 97.9186, 106.677, 0]
NOTempty
[4.94272, 6.38162, 8.32141, 0]
[91.7741, 97.7845, 106.555, 0]
Это должно выглядеть так:
empty
[5.09352, 6.60551, 8.54364, 0]
[5.09352, 6.60551, 8.54364, 0]
NOTempty
[5.02325, 6.46646, 8.39534, 0]
[5.09352, 6.60551, 8.54364, 0]
NOTempty
[4.94272, 6.38162, 8.32141, 0]
[5.02325, 6.46646, 8.39534, 0]
Это должно быть просто, что я делаю неправильно?





Вы уверены, что не пропустили петлю где-то в этом фрагменте? Если я попробую что-то вроде этого:
//create a dummy vector of mats:
std::vector<cv::Mat> sourceMats;
sourceMats.push_back( cv::Mat(1, 4, CV_32F, {1, 1, 1, 1}) );
sourceMats.push_back( cv::Mat(1, 4, CV_32F, {2, 2, 2, 2}) );
sourceMats.push_back( cv::Mat(1, 4, CV_32F, {3, 3, 3, 3}) );
//frames buffer:
std::vector <cv::Mat> frames;
//loop thru all frames:
for( int i = 0; i < (int)sourceMats.size(); i++ ){
// Current frame
cv::Mat M = sourceMats[i];
cv::Mat F; // previous frame
// set Previous Frame
if (frames.empty()) {
F = M;
frames.push_back(M);
std::cout << "empty" << std::endl;
}
else {
F = frames.back();
frames.push_back(M);
std::cout << " NOTempty" << std::endl;
}
// do not compute the mean, I just want to check out the FIFO contents:
std::cout << M << std::endl;
std::cout << F << std::endl;
}
Я получаю этот вывод (обратите внимание, что я удалил среднюю функцию - просто чтобы проверить необработанные данные):
empty
[1, 1, 1, 1]
[1, 1, 1, 1]
NOTempty
[2, 2, 2, 2]
[1, 1, 1, 1]
NOTempty
[3, 3, 3, 3]
[2, 2, 2, 2]
Похоже, ваш FIFO работает, как и ожидалось... Чего вы ожидали от функции означает?
зачем вообще использовать вектор. вам просто нужны две переменные, для предыдущего и текущего кадра. всякий раз, когда появляется новый кадр, назначьте
previous_frame = current_frame; current_frame = new_frame;и отметьтеif (previous_frame.empty() || current_frame.empty()) continue;или что-то в этом роде