[英]OpenCV feature matching parallel processing
我匹配的圖像具有以下屬性:正確匹配的關鍵點對應該具有相同(或非常接近)的 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 函數也不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.