Генерировать матрицу объектов с течением времени: как добавить вектор Mat в каждую строку Mat? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь извлечь матрицу гистограммы для каждых 5 кадров в видео для дальнейшей обработки.Процесс выглядит следующим образом:

  1. С 1-го по 5-й кадр:
  2. Преобразование в HSV и создание гистограммы для каждого канала.
  3. Сохранение гистограммы трех каналов ввектор Mat
  4. Добавьте вектор Mat каждого кадра в каждую строку нового Mat
  5. . Повторите шаги с 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;
}

вывод моего кода

enter image description here

ЖелаемыйВЫХОД ДЛЯ КАЖДОГО РЯДА В МАТЕ [1966, 10, 19, 43, 28, 36, 94, 36, 50, 56, 148, 84, 130, 204, 214, 522, 1829, 746, 933, 315]

Как правильно сгенерировать данные для MAT после шага 4?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...