Я пытаюсь извлечь матрицу гистограммы для каждых 5 кадров в видео для дальнейшей обработки.Процесс выглядит следующим образом:
- С 1-го по 5-й кадр:
- Преобразование в HSV и создание гистограммы для каждого канала.
- Сохранение гистограммы трех каналов ввектор Mat
- Добавьте вектор Mat каждого кадра в каждую строку нового Mat
- . Повторите шаги с 1 по 4, чтобы сгенерировать матрицу объектов, обработать матрицу объектов Mat, затем удалитьданные 1-го кадра в мате и повторите процесс для следующих 5 кадров, зацикливайтесь до конца видео.
Результатом шага 5 является матрица признаков во времени.
На шаге 4 я хочу сгенерировать новый Мат, который хранит гистограммы каждого кадра в каждой строке.В матрице число строк = число_фреймов, количество столбцов = 16 + 4 + 4 (количество бинов).
Я создал функцию для шага 4 (formatHistogramforSVD), но вывод данных на шагах 3 и 4разные.Только 1-й элемент вектора корректно передается в матрицу Mat.
int main ()
{
string path = "";
Mat image;
VideoCapture capture(path);
if (!capture.isOpened())
{
cout << "could not open the VideoCapture !" << endl;
return -1;
}
for (int i = 0; i < 5; i++)
{
capture >> image;
// generate histogram and save into a vector of Mat
vector<Mat> histogramI = calculate_histogram(image);
// Reshape and stack histogram into a rowMatrix
Mat matrix_histograms = formatHistogramforSVD(histogramI);
cout << matrix_histograms << endl;
}
}
vector<Mat> calculate_histogram(Mat image)
{
cvtColor(image, hsvImage, COLOR_BGR2HSV);
vector<Mat> bgrPlanes;
split(hsvImage, bgrPlanes);
Mat hHist, sHist, vHist;
int hMax = 16, svMax = 4;
calcHist(&bgrPlanes[0], 1, 0, Mat(), hHist, 1, &hMax, &hRange);
calcHist(&bgrPlanes[1], 1, 0, Mat(), sHist, 1, &svMax, &svRange);
calcHist(&bgrPlanes[2], 1, 0, Mat(), vHist, 1, &svMax, &svRange);
vector<Mat> histogramI = { hHist, sHist, vHist };
return histogramI;
}
Mat formatHistogramforSVD(const vector<Mat> &data)
{
Mat dst(static_cast<int>(data.size()), data[0].rows*data[0].cols, CV_32F);
for (unsigned int i = 0; i < data.size(); i++)
{
Mat image_row = data[i].clone().reshape(1, 1);
Mat row_i = dst.row(i);
image_row.convertTo(row_i, CV_32F);
}
return dst;
}
вывод моего кода
ЖелаемыйВЫХОД ДЛЯ КАЖДОГО РЯДА В МАТЕ [1966, 10, 19, 43, 28, 36, 94, 36, 50, 56, 148, 84, 130, 204, 214, 522, 1829, 746, 933, 315]
Как правильно сгенерировать данные для MAT после шага 4?