Взаимная корреляция OpenCV Vector x Matrix - PullRequest
0 голосов
/ 26 мая 2020

Все примеры открытых CV, которые я могу найти, похоже, относятся к 2D-ядру поверх 2D-изображения.

У меня есть 1d-ядро, и я ищу операцию, которая вернет для каждой строки значение и смещение что приводит к максимальной корреляции.

Прямой C ++, мой код будет выглядеть так:

    vector<int> offset(img.rows);
    vector<int> amp(img.rows);
    std::vector<double> corrs(MAX_SEARCH);

    for(int row = 0; row< img.rows; row++){
        row_data = img.row(row)
        for (int i = 0; i < MAX_SEARCH; i++) {
            double correlation = 0;
            for (int j = 0; j < wfm.size(); j++) {
                correlation += (wfm[j] * row_data[i+j]);
            }
            corrs[i] = correlation;
        }

        amp[row]  = *std::max_element(corrs.begin(), corrs.end());
        offest[row] = std::max_element(corrs.begin(), corrs.end()) - corrs.begin();
    }

Ключевое, что я ищу, - это возможность воспользоваться какой-то отдельной инструкцией Множественные оптимизации данных, которые, я думаю, должен уметь OpenCV, или, если OpenCV этого не добьется, как этот код можно переписать для этого.

1 Ответ

1 голос
/ 26 мая 2020

Если вы используете функции OpenCV, вам необходимо собрать OpenCV для вашего компьютера с поддержкой SIMD. Или вы можете следовать этому решению на форумах OpenCV.

Могу я порекомендовать OpenMP для вашего кода. Добавить легко. Вы просто добавляете #pragma omp simd перед последним для l oop. Затем скомпилируйте с -fopenmp. Здесь - это простое руководство по пониманию OpenMP. И их документация по опции simd.

...