OpenCV特征匹配并行处理

OpenCV feature matching parallel processing

本文关键字:并行处理 特征 OpenCV      更新时间:2023-10-16

我匹配的图像具有以下属性:正确匹配的关键点对应具有相同(或非常接近(的 y 坐标值。 有点像这样。

加快程序速度并提高准确性。我将两张图像剪切成 12 条水平条纹,然后进行特征匹配。

目标是获取关键点信息(坐标(。

它看起来像这样:

void featureMatching(Mat &img1, Mat &img2, vector<KeyPoint> &keypoints_1,
vector<KeyPoint> &keypoints_2) {
// store the matched keypoint pairs into keypoints_1 and keypoints_2.
}
void feature_blocks(Mat &img_l, Mat &img_r, vector<KeyPoint> &keypoints_l,
vector<KeyPoint> &keypoints_r, int num_block) {
Mat block_l, block_r;
Mat temp_block;
vector<Mat> mat_blocks;
vector<KeyPoint> temp_keypoints_l, temp_keypoints_r;
Mat concated_block;
int block_width, bloch_height;
block_width = img_l.cols;
block_height = int(img_l.rows / num_block);
for (int i = 0, coor_y = 0; i < num_block; i++, coor_y += block_height) {
if (i == num_block - 1)
block_height += img_l.rows % num_block;
block_l = img_l(Rect(0, coor_y, block_width, bloch_height));
block_r = img_r(Rect(0, coor_y, block_width, bloch_height));
if (DEBUG) {
cout << "----- block " << i << " ----- " << endl;
}
temp_keypoints_l.clear();
temp_keypoints_r.clear();
featureMatching(block_l, block_r, temp_keypoints_l, temp_keypoints_r);
keypoints_l.insert(end(keypoints_l), begin(temp_keypoints_l),
end(temp_keypoints_l));
keypoints_r.insert(end(keypoints_r), begin(temp_keypoints_r),
end(temp_keypoints_r));
}
}
int main() {
...
img1 = imread("test1.jpg", IMREAD_COLOR);
img2 = imread("test2.jpg", IMREAD_COLOR);
vector<KeyPoint> keypoint1, keypoint2;
feature_blocks(img1, img2, keypoint1, keypoint2, 12);
}

只要 keypoint1[i] 对应于 keypoint2[i],keypoint1 和 keypoint2 中的键点顺序就无关紧要。有没有一种简单的方法在feature_blocks中并行化 for 循环?

我阅读了OpenCV文档中的教程,但我只是不知道如何实现它。也就是说,我不知道如何使每个线程处理一个图像块。

编辑

我根据Warpstar22的推荐使用OpenMP。 它有效!

#pragma omp parallel for
for (int i = 0; i < num_block; i++) {
int block_height = int(img_l.rows / num_block);
int coor_y = block_height * i;
if (i == num_block - 1)
block_height += img_l.rows % num_block;
Mat block_l, block_r;
block_l = img_l(Rect(0, coor_y, block_width, block_height));
block_r = img_r(Rect(0, coor_y, block_width, block_height));
if (DEBUG) {
cout << "----- block " << i << " ----- " << endl;
}
vector<KeyPoint> temp_keypoints_l, temp_keypoints_r;
featureMatching(block_l, block_r, temp_keypoints_l, temp_keypoints_r,
coor_y);
#pragma omp critical
keypoints_l.insert(end(keypoints_l), begin(temp_keypoints_l),
end(temp_keypoints_l));
#pragma omp critical
keypoints_r.insert(end(keypoints_r), begin(temp_keypoints_r),
end(temp_keypoints_r));
}

您可能更容易使用 OpenMP。OpenMP 可以真正易于集成。当我制作算法并发现它很慢时,我已经多次使用它。如果您尝试并行化循环,则可以在 for 循环语句上方添加行#pragma omp parallel for。然后,您必须使用-fopenmp进行编译。这是指向OpenMP的简单教程的链接。

或者,我认为 OpenCV 在运行其特征描述符函数时已经通过并行处理优化了处理。我不确定,但我知道在构建时有一个并行处理支持的标志,您需要确保已启用。此外,如果您也没有该功能,parallel_for功能也不起作用。