Выполнение OpenCV k-средних на данных из csv-файла

Я пытаюсь прочитать временной ряд из CSV-файла.

Каждая строка содержит 256 (может изменяться в будущем) элементов, которые я хочу обработать как точку в 256-мерном пространстве.

Затем я хочу выполнить кластеризацию k-средних, чтобы найти наиболее k значимых временных рядов, описывающих данные.

В настоящее время я читаю CSV-файл, сохраняя каждую строку в

std::vector<double> temprow

а затем в конечном итоге

std::vector<std::vector<double>> data_vect

Я тогда преобразовываю в

cv::Mat data_mat = cv::Mat::zeros((int)all_data.size(), (int)all_data[0].size(), CV_32F)

перебирая векторы с помощью

for (int rows = 0; rows < (int)all_data.size(); rows++) {
for (int cols = 0; cols < (int)all_data[0].size(); cols++) {
data_mat.at<double>(rows, cols) = all_data[rows][cols];
}
}
return data_mat;

Это оставляет меня с cv :: Mat со следующими свойствами:

std::cout << "Rows: " << data.rows << std::endl;    //Rows: 52178
std::cout << "Cols: " << data.cols << std::endl;    //Cols: 256
std::cout << "Dims: " << data.dims << std::endl;    //Dims: 2

Затем я выполняю кластеризацию k-средних следующим образом:

cv::Mat labels,centers;
int k = 256;
int attempts = 10;
cv::TermCriteria criteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 10, 1.0);
cv::kmeans(data_mat, k, labels, criteria, attempts, cv::KMEANS_PP_CENTERS, centers);

который в моем понимании должен заполнить центры со значениями центра каждого кластера, оставляя меня с матрицей k * n (в данном случае 256 * 256).

Тем не менее, когда я звоню

std::cout << "Rows: " << centers.rows << std::endl; //Hopefully 256
std::cout << "Cols: " << centers.cols << std::endl; //Hopefully 256

Я получаю это общее сообщение об ошибке:

Исключительная ситуация: 0x00007FF806C86020 (opencv_world341.dll) в Project1.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000024B9ECAFC80.

Свойства центры на данный момент программы являются:

    flags   1124007936  int
dims    0   int
rows    0   int
cols    0   int
+       data    0x0000000000000000 <NULL>   unsigned char *
+       datastart   0x0000000000000000 <NULL>   const unsigned char *
+       dataend 0x0000000000000000 <NULL>   const unsigned char *
+       datalimit   0x0000000000000000 <NULL>   const unsigned char *
+       allocator   0x0000000000000000 <NULL>   cv::MatAllocator *
+       u   0x0000000000000000 <NULL>   cv::UMatData *
+       size    {p=0x000000bdfc93f9e8 {0} } cv::MatSize
+       step    {p=0x000000bdfc93fa30 {0} buf=0x000000bdfc93fa30 {0, 0} }   cv::MatStep

Так что, кажется, центры NULL. Так что, возможно, вход data_mat в неправильной форме, так что kmeans () ничего не выводит в центры, но опять же я не получаю сообщение об ошибке для kmeans ()

Большое спасибо заранее за вашу помощь и помощь,

Timo

Редактировать 1: ошибка происходит внутри kmeans (), так как

cv::kmeans(data_mat, k, labels, criteria, attempts, cv::KMEANS_PP_CENTERS, centers);
std::cout << "Finished k-means" << std::endl;

Кут не выводится на консоль. Тем не менее, льняной номер ошибки был kmeans () + 1, поэтому я просто выяснил это, разместив там общий шаблон.

2

Решение

Итак, я нашел ответ:

Потому что я использую Тип CV32_F Я должен был получить доступ к нему как поплавок Мат.

так меняется data_mat.at<double>(rows, cols) = all_data[rows][cols];
в data_mat.at<float>(rows, cols) = all_data[rows][cols]; сделал работу за меня.

Изначально я хотел работать с CV64_F, поэтому у меня было двойной все кончено, но я узнал, что OpenCV-k-means работает только до CV32_F. Затем я забыл изменить это, что привело к выполнению первого шага кластеризации, но после второго он дал сбой.

0

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

Других решений пока нет …

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