OpenCV4.x画像処理の例-特徴記述子マッチャーとマッチングポイントの描画

セクション2機能記述子マッチャーとマッチングポイントの描画

OpenCVのキーポイント記述子のマッチャーには、パブリックインターフェイスを備えたラッパーがあり、同じ問題を解決するさまざまなアルゴリズムを簡単に切り替えることができます。このセクションでは、多次元空間のベクトルで表される一致する記述子を具体的に紹介します。ベクトル記述子マッチャーを実装するすべてのオブジェクトは、DescriptorMatcherインターフェイスと、対応するキーポイントおよびマッチングポイントの描画インターフェイスを継承します。

1、cv :: drawKeypoints


キーポイントを描く

void cv :: drawKeypoints(InputArray image、const std :: vector <KeyPoint>&keypoints、InputOutputArray outImage、const Scalar&color = Scalar :: all(-1)、DrawMatchesFlags flags = DrawMatchesFlags :: DEFAULT)

パラメータは次のとおりです。

パラメータ名 パラメータの説明
画像 元の画像
キーポイント 元の画像の要点
outImage 出力画像。その内容は、出力イメージに描画される内容を定義するフラグ値によって異なります。以下の可能なフラグビット値を参照してください。
キーポイントの色。
フラグ ロゴセットグラフィック機能。可能なフラグ値はDrawMatchesFlagsによって定義されます。上記のdrawMatchesの詳細を参照してください。

2、cv :: drawMatches


2つの画像から見つかったキーポイントの一致を描画します。

void cv :: drawMatches(InputArray img1、const std :: vector <KeyPoint>&keypoints1、InputArray img2、const std :: vector <KeyPoint>&keypoints2、const std :: vector <DMatch>&matches1to2、InputOutputArray outImg、const Scalar &matchColor = Scalar :: all(-1)、const Scalar&singlePointColor = Scalar :: all(-1)、const std :: vector <char>&matchesMask = std :: vector <char>()、DrawMatchesFlags flags = DrawMatchesFlags :: DEFAULT)

パラメータは次のとおりです。

パラメータ名 パラメータの説明
img1 最初のソース画像
キーポイント1 最初のソース画像のキーポイント
img2 2番目のソース画像
キーポイント2 ソース画像の2番目の重要なポイント
matchs1to2 最初の画像から2番目の画像に一致します。つまり、keypoints1 [i]にはkeypoints2 [matches [i]]に対応するポイントがあります。
outImg 出力画像。その内容は、出力イメージに描画される内容を定義するフラグ値によって異なります。以下の可能なフラグビット値を参照してください。
matchColor 一致の色(線と接続の要点)。matchColor == Scalar :: all(-1)の場合、色はランダムに生成されます。
singlePointColor 単一のキーポイント(円)の色。これは、キーポイントに一致するものがないことを意味します。singlePoint Color == Scalar :: all(-1)の色はランダムに生成されます。
マッチマスク マスクは、どの一致が描画されるかを決定します。マスクが空の場合、すべての一致が描画されます。
フラグ ロゴセットグラフィック機能。可能なフラグ値はDrawMatchesFlagsによって定義されます。

3、cv :: BFMatcher


ブルートフォース記述子マッチャー。このマッチャーは、最初のグループの記述子ごとに、各記述子を試行することにより、2番目のグループで最も近い記述子を見つけます。この記述子マッチャーは、シールドされた記述子セットの許可されたマッチングをサポートします。

BFMatcherクラスは、DescriptorMatcherインターフェイスを継承し、対応するメソッドを実装します。BFMatcherオブジェクトの作成は、静的createメソッドを介して実行されます。

static Ptr cv :: BFMatcher :: create(int normType = NORM_L2、bool crossCheck = false)

パラメータは次のとおりです。

パラメータ名 パラメータの説明
normType NORM_L1、NORM_L2、NORM_HAMMING、およびNORM_HAMMING2のいずれか。SIFTおよびSURF記述子の場合、L1およびL2normsがより適切な選択です。WTA_K== 3または4の場合、NORM_HAMMINGはORB、BRISK、およびBriefとともに使用し、NORM_HAMMING2はORBとともに使用する必要があります(ORB :: ORB構築関数の説明を参照)。
クロスチェック falseの場合、クエリ記述子ごとにk最近傍が見つかった場合、これがデフォルトのBFMatcherの動作になります。crossCheck == trueの場合、k = 1のknnMatch()メソッドはペア(i、j)のみを返すため、i番目のクエリ記述子の場合、マッチャーセットのj番目の記述子が最も近く、逆もまた同様ですが、BFMatcherは一貫したペアのみを返します。十分な一致がある場合、この手法は通常、外れ値が最も少ない最良の結果を生成します。これは、SIFTペーパーでD.Loweが使用した比率テストの代替手段です。

DescriptorMatcherインターフェースには、いくつかのコアインターフェースがあります。

  • void cv :: DescriptorMatcher :: match(InputArray queryDescriptors、InputArray trainDescriptors、std :: vector <DMatch>&matches、InputArray mask = noArray())

  • void cv :: DescriptorMatcher :: radiusMatch(InputArray queryDescriptors、InputArray trainDescriptors、std :: vector <std :: vector <DMatch >>&matches、float maxDistance、InputArray mask = noArray()、bool CompactResult = false)

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 读取图像
    cv::Mat src1 = cv::imread("images/plane.jpg");
    if(src1.empty()){
        cerr << "cannot read image 1.\n";
        return EXIT_FAILURE;
    }
    cv::Mat src2 = cv::imread("images/plane_part.jpg");
    if(src2.empty()){
        cerr << "cannot read image 2.\n";
        return EXIT_FAILURE;
    }

    // 转换成灰度图像
    cv::Mat gray1,gray2;
    cv::cvtColor(src1,gray1,cv::COLOR_BGR2GRAY);
    cv::cvtColor(src2,gray2,cv::COLOR_BGR2GRAY);

    // 创建SIFT特征提取器
    cv::Ptr<cv::SIFT> sift = cv::SIFT::create(256,3,0.09,220,2.5);

    // 特征点检测
    // 检测特征点
    vector<cv::KeyPoint> keypoints1,keypoints2;
    cv::Mat descriptor1,descriptor2;
    sift->detectAndCompute(gray1,cv::Mat(),keypoints1,descriptor1);
    sift->detectAndCompute(gray2,cv::Mat(),keypoints2,descriptor2);

    // 创建特征点匹配器
    cv::Ptr<cv::BFMatcher> matcher = cv::BFMatcher::create();

    // 执行特征点匹配
    vector<cv::DMatch> dmatch;
    matcher->match(descriptor1,descriptor2,dmatch);

    // 绘制特征点和匹配特征结果
    cv::Mat matchResult;
    cv::drawMatches(src1,keypoints1,src2,keypoints2,dmatch,matchResult);
    cv::imshow("src1",src1);
    cv::imshow("src2",src2);
    cv::imshow("match result",matchResult);
    cv::waitKey();
    return 0;
}

ここに画像の説明を挿入
ここに画像の説明を挿入

4、cv :: FlannBasedMatcher


フランベースの記述子マッチャー。マッチャーは、トレイン記述子セットのcv :: flan :: Indexをトレーニングし、最も近い検索メソッドを呼び出して、最適な一致を見つけます。したがって、大きな列車セットを照合する場合、このマッチャーはブルートフォースマッチャーよりも高速である可能性があります。flann :: Indexはこの機能をサポートしていないため、FlannBasedMatcherはシールドされた記述子セットの許可されたマッチングをサポートしていません。

FlannBasedMatcherクラスは、DescriptorMatcherインターフェイスを継承し、対応するメソッドを実装します。BFMatcherオブジェクトの作成は、静的createメソッドを介して実行されます。

static Ptr cv :: FlannBasedMatcher :: create()

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 读取图像
    cv::Mat src1 = cv::imread("images/plane.jpg");
    if(src1.empty()){
        cerr << "cannot read image 1.\n";
        return EXIT_FAILURE;
    }
    cv::Mat src2 = cv::imread("images/plane_part.jpg");
    if(src2.empty()){
        cerr << "cannot read image 2.\n";
        return EXIT_FAILURE;
    }

    // 转换成灰度图像
    cv::Mat gray1,gray2;
    cv::cvtColor(src1,gray1,cv::COLOR_BGR2GRAY);
    cv::cvtColor(src2,gray2,cv::COLOR_BGR2GRAY);

    // 创建SIFT特征提取器
    cv::Ptr<cv::SIFT> sift = cv::SIFT::create(256,3,0.09,220,2.5);

    // 特征点检测
    // 检测特征点
    vector<cv::KeyPoint> keypoints1,keypoints2;
    cv::Mat descriptor1,descriptor2;
    sift->detectAndCompute(gray1,cv::Mat(),keypoints1,descriptor1);
    sift->detectAndCompute(gray2,cv::Mat(),keypoints2,descriptor2);

    // 创建特征点匹配器
    cv::Ptr<cv::FlannBasedMatcher> matcher = cv::FlannBasedMatcher::create();

    // 执行特征点匹配
    vector<cv::DMatch> dmatch;
    matcher->match(descriptor1,descriptor2,dmatch);

    // 绘制特征点和匹配特征结果
    cv::Mat matchResult;
    cv::drawMatches(src1,keypoints1,src2,keypoints2,dmatch,matchResult);
    cv::imshow("src1",src1);
    cv::imshow("src2",src2);
    cv::imshow("match result",matchResult);
    cv::waitKey();
    return 0;
}

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wujuxKkoolerter/article/details/114163008