簡體   English   中英

OpenCV 特征匹配並行處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM