OpenCV 向量 x 矩阵互相关

OpenCV Vector x Matrix cross correlation

本文关键字:向量 OpenCV      更新时间:2023-10-16

我能找到的所有开放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无法实现这一点,如何重写这段代码来做到这一点。

如果您使用的是 OpenCV 函数,则需要通过 SIMD 支持为您的机器构建 OpenCV。或者您可以在 OpenCV 论坛上遵循此解决方案。

对于您的代码,我可以推荐OpenMP。很容易添加。您只需在最后一个 for 循环之前添加#pragma omp simd。然后使用 -fopenmp 编译。这是一个了解OpenMP的简单教程。以及他们关于 simd 选项的文档。