モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約、プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

OpenCV による特徴点のマッチング (Python)

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
「」ステッカーの表示権
メッセージ
料金
¥(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

※利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2018/09/27
最終更新最終更新
2024/09/08
記事区分記事区分
一般公開

目次

    運用系Sier

    0
    ステッカーを贈るとは?

    特徴点の検出 Feature Detection

    特徴点として利用できるものの一つに、物体の角があります。角を検出するアルゴリズムの一つに Harris Corner Detection があります。分かりやすさのため、モルフォロジー変換で「角」を膨張させています。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import numpy as np
    import cv2 as cv
    
    # 画像の読み込み
    img = cv.imread('aaa.png')
    
    # グレースケール変換
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    
    # 特徴点として扱いやすい「角」を計算
    dst = cv.cornerHarris(gray.astype(np.float32), 2, 3, 0.04)
    
    # 分かりやすさのため、モルフォロジー変換で「角」を膨張させます。
    dst_dilated = cv.dilate(dst, None)
    
    # もとの画像に赤い点として描画します。
    img[dst_dilated > 0.01 * dst_dilated.max()] = [0, 0, 255]
    
    # 描画してみます。
    cv.normalize(dst, dst, 0, 255, cv.NORM_MINMAX)
    cv.normalize(dst_dilated, dst_dilated, 0, 255, cv.NORM_MINMAX)
    cv.imshow('dst', dst.astype(np.uint8))
    cv.imshow('dst_dilated', dst_dilated.astype(np.uint8))
    
    cv.imshow('img', img)
    cv.waitKey(0)
    

    特徴点のマッチング Feature Matching

    特徴点に対する特徴記述子 Feature Description を計算して、それぞれの画像で計算結果を比較してマッチングします。マッチング結果は、例えばパノラマ画像の作成などに利用できます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import numpy as np
    import cv2 as cv
    
    # 画像を読み込みます
    img1 = cv.imread('aaa.png')
    img2 = cv.imread('fff.png')
    
    # グレースケール変換
    gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
    gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
    
    # ORB detector で特徴点 (keypoints) と特徴量 (descriptors) を計算します。
    orb = cv.ORB_create()
    kp1, des1 = orb.detectAndCompute(gray1, None)
    kp2, des2 = orb.detectAndCompute(gray2, None)
    
    # 総当たりで特徴量をマッチングします。
    bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
    matches = bf.match(des1, des2)
    
    # より良くマッチした 10 の特徴点を可視化してみます。
    matches = sorted(matches, key = lambda x:x.distance)
    dst = cv.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
    
    cv.imshow('dst', dst)
    cv.waitKey(0)
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    運用系Sier

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事