OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ロバストなカメラ姿勢推定のためのArUcoマーカーおよびボードの検出

詳細説明

ArUcoマーカー検出。正方形のフィデューシャルマーカー(拡張現実マーカーとしても知られる)は、簡単・高速・ロバストなカメラ姿勢推定に有用である。

ArucoDetector クラスの主な機能は、画像中のマーカーの検出である。マーカーがボードとしてまとめられている場合は、ArucoDetector::refineDetectedMarkers() で検出できなかったマーカーの復元を試みることができる。ArUcoマーカーは、高度なチェスボードコーナー探索にも利用できる。これを行うには、CharucoBoard にマーカーをまとめ、CharucoDetector::detectBoard() でチェスボードのコーナーを探索する。

この実装は、R. Muñoz-Salinas と S. Garrido-Jurado による ArUco Library [102] に基づいている。

マーカーは AprilTag 2 [301] の基準マーカー検出手法に基づいて検出することもできる。

参照
[102] このコードは、Google Summer of Code 2015 (GSoC 15) のプロジェクトとして Sergio Garrido-Jurado によって最初に開発された。


警告
OpenCV では、AprilTag ファミリーに対して返されるコーナー位置の順序は、ArUco のものと一致していない。
この順序は、公式の AprilTag ライブラリ が採用している慣例とも異なることに注意。


サポートされている ArUco マーカーファミリーの概要を次の画像に示す:


サポートされている AprilTag マーカーファミリーの概要を次の画像に示す:

覚え書き
公式の AprilTag 画像と一致させるため、AprilTag マーカー用に aruco::generateImageMarker を使って生成された画像(上の図)は180度回転されている。aruco::generateImageMarker 関数を使用する場合、デフォルトでは公式の AprilTag の慣例とは異なる画像を出力する。AprilRobotics/apriltag-imgs リポジトリを参照。これが、上の画像で ArUco と AprilTag のコーナー順序が異なって見える理由である。


ArUco マーカーファミリーについては、推奨されるファミリーは DICT_ARUCO_MIP_36h12 である。こちら を参照。一般に、より小さいマーカーファミリー (例: 4x46x6) は、カメラ距離に対してより良い検出率を与えるが、その代わりに誤検出やマーカーIDのデコードエラーが発生する確率が高くなる。ファミリー内のマーカーIDの数も、アプリケーションのユースケースや、マーカーIDのデコード処理中の誤ったビットを訂正する能力との関係で考慮すべき点である。

あらかじめ生成された MIP_36h12 ArUco マーカー画像を、次の場所からダウンロードできる:

AprilTag ファミリーについては、あらかじめ生成されたマーカー画像が AprilRobotics/apriltag-imgs リポジトリにある。

覚え書き
コーナー位置を正確に抽出するには、マーカーの周囲に白い境界(白と黒の遷移の間に強い勾配を持たせるため)があることが重要である。これは、悪い照明や紛らわしい色の背景といった困難な条件下でマーカーの輪郭を正確に抽出するために必要である。


マーカーの検出率を改善したり、ユースケース(例: 画像解像度)に適応させたりするために調整できる引数が複数ある。次を参照:

コーナーリファインメント手法は、aruco::CornerRefineMethod に従って変更でき、より多くの計算時間を要する代わりにコーナー位置の精度を向上させることができる。


カメラフレームに対するマーカーの姿勢を推定するには、以下の情報源を参照することを推奨する:

クラス

class  cv::aruco::ArucoDetector
 ArucoDetector クラスの主な機能は、detectMarkers() メソッドによる画像内のマーカー検出である。 詳細...
 
class  cv::aruco::Board
 ArUcoマーカーのBoard詳細...
 
class  cv::aruco::CharucoBoard
 ChArUcoボードは、チェスボードの白い正方形の内側にマーカーを配置した平面チェスボードである。 詳細...
 
class  cv::aruco::CharucoDetector
 
struct  cv::aruco::CharucoParameters
 
struct  cv::aruco::DetectorParameters
 struct DetectorParametersArucoDetector で使用される 詳細...
 
class  cv::aruco::Dictionary
 Dictionary は同じサイズの一意なArUcoマーカーの集合である。続きを読む...
 
class  cv::aruco::GridBoard
 マーカーをグリッド状に配置した平面ボード。 詳細...
 
struct  cv::aruco::RefineParameters
 struct RefineParametersArucoDetector で使用される 詳細...
 

列挙型

enum  cv::aruco::CornerRefineMethod {
  cv::aruco::CORNER_REFINE_NONE ,
  cv::aruco::CORNER_REFINE_SUBPIX ,
  cv::aruco::CORNER_REFINE_CONTOUR ,
  cv::aruco::CORNER_REFINE_APRILTAG
}
 
enum  cv::aruco::PredefinedDictionaryType {
  cv::aruco::DICT_4X4_50 = 0 ,
  cv::aruco::DICT_4X4_100 ,
  cv::aruco::DICT_4X4_250 ,
  cv::aruco::DICT_4X4_1000 ,
  cv::aruco::DICT_5X5_50 ,
  cv::aruco::DICT_5X5_100 ,
  cv::aruco::DICT_5X5_250 ,
  cv::aruco::DICT_5X5_1000 ,
  cv::aruco::DICT_6X6_50 ,
  cv::aruco::DICT_6X6_100 ,
  cv::aruco::DICT_6X6_250 ,
  cv::aruco::DICT_6X6_1000 ,
  cv::aruco::DICT_7X7_50 ,
  cv::aruco::DICT_7X7_100 ,
  cv::aruco::DICT_7X7_250 ,
  cv::aruco::DICT_7X7_1000 ,
  cv::aruco::DICT_ARUCO_ORIGINAL ,
  cv::aruco::DICT_APRILTAG_16h5 ,
  cv::aruco::DICT_APRILTAG_25h9 ,
  cv::aruco::DICT_APRILTAG_36h10 ,
  cv::aruco::DICT_APRILTAG_36h11 ,
  cv::aruco::DICT_ARUCO_MIP_36h12
}
 事前定義されたマーカー辞書/セット。続きを読む...
 

関数

void cv::aruco::drawDetectedCornersCharuco (InputOutputArray image, InputArray charucoCorners, InputArray charucoIds=noArray(), Scalar cornerColor=Scalar(255, 0, 0))
 Charucoコーナーの集合を描画する。
 
void cv::aruco::drawDetectedDiamonds (InputOutputArray image, InputArrayOfArrays diamondCorners, InputArray diamondIds=noArray(), Scalar borderColor=Scalar(0, 0, 255))
 検出されたChArUco Diamondマーカーの集合を描画する。
 
void cv::aruco::drawDetectedMarkers (InputOutputArray image, InputArrayOfArrays corners, InputArray ids=noArray(), Scalar borderColor=Scalar(0, 255, 0))
 検出されたマーカーを画像に描画する。
 
Dictionary cv::aruco::extendDictionary (int nMarkers, int markerSize, const Dictionary &baseDictionary=Dictionary(), int randomSeed=0)
 基本辞書を新しいnMarkersで拡張する。
 
void cv::aruco::generateImageMarker (const Dictionary &dictionary, int id, int sidePixels, OutputArray img, int borderBits=1)
 正規のマーカー画像を生成する。
 
Dictionary cv::aruco::getPredefinedDictionary (int dict)
 DICT_* で参照される事前定義された辞書の1つを返す。
 
Dictionary cv::aruco::getPredefinedDictionary (PredefinedDictionaryType name)
 PredefinedDictionaryTypeで定義された事前定義された辞書の1つを返す。
 

変数

static constexpr float cv::aruco::DEFAULT_VALID_BIT_ID_THRESHOLD {0.49f}
 

列挙型詳解

◆ CornerRefineMethod

#include <opencv2/objdetect/aruco_detector.hpp>

列挙値
CORNER_REFINE_NONE 
Python: cv.aruco.CORNER_REFINE_NONE

ArUcoのアプローチに基づくタグとコーナーの検出。

CORNER_REFINE_SUBPIX 
Python: cv.aruco.CORNER_REFINE_SUBPIX

ArUcoのアプローチに加え、コーナーのサブピクセル精度を用いてコーナー位置を高精度化する。

CORNER_REFINE_CONTOUR 
Python: cv.aruco.CORNER_REFINE_CONTOUR

ArUcoのアプローチに加え、輪郭点による直線フィッティングを用いてコーナー位置を高精度化する。

CORNER_REFINE_APRILTAG 
Python: cv.aruco.CORNER_REFINE_APRILTAG

AprilTag 2 のアプローチ [301] に基づくタグおよびコーナーの検出。

◆ PredefinedDictionaryType

#include <opencv2/objdetect/aruco_dictionary.hpp>

事前定義されたマーカー辞書/セット。

各辞書は、ビット数と含まれるマーカー数を示す

  • DICT_ARUCO_ORIGINAL: 標準的なArUcoライブラリのマーカー。1024マーカー、5x5ビット、最小距離0
列挙値
DICT_4X4_50 
Python: cv.aruco.DICT_4X4_50

4x4ビット、任意の2コード間の最小ハミング距離 = 4、50コード

DICT_4X4_100 
Python: cv.aruco.DICT_4X4_100

4x4ビット、任意の2コード間の最小ハミング距離 = 3、100コード

DICT_4X4_250 
Python: cv.aruco.DICT_4X4_250

4x4ビット、任意の2コード間の最小ハミング距離 = 3、250コード

DICT_4X4_1000 
Python: cv.aruco.DICT_4X4_1000

4x4ビット、任意の2コード間の最小ハミング距離 = 2、1000コード

DICT_5X5_50 
Python: cv.aruco.DICT_5X5_50

5x5ビット、任意の2コード間の最小ハミング距離 = 8、50コード

DICT_5X5_100 
Python: cv.aruco.DICT_5X5_100

5x5ビット、任意の2コード間の最小ハミング距離 = 7、100コード

DICT_5X5_250 
Python: cv.aruco.DICT_5X5_250

5x5ビット、任意の2コード間の最小ハミング距離 = 6、250コード

DICT_5X5_1000 
Python: cv.aruco.DICT_5X5_1000

5x5ビット、任意の2コード間の最小ハミング距離 = 5、1000コード

DICT_6X6_50 
Python: cv.aruco.DICT_6X6_50

6x6ビット、任意の2コード間の最小ハミング距離 = 13、50コード

DICT_6X6_100 
Python: cv.aruco.DICT_6X6_100

6x6ビット、任意の2コード間の最小ハミング距離 = 12、100コード

DICT_6X6_250 
Python: cv.aruco.DICT_6X6_250

6x6ビット、任意の2コード間の最小ハミング距離 = 11、250コード

DICT_6X6_1000 
Python: cv.aruco.DICT_6X6_1000

6x6ビット、任意の2コード間の最小ハミング距離 = 9、1000コード

DICT_7X7_50 
Python: cv.aruco.DICT_7X7_50

7x7ビット、任意の2コード間の最小ハミング距離 = 19、50コード

DICT_7X7_100 
Python: cv.aruco.DICT_7X7_100

7x7ビット、任意の2コード間の最小ハミング距離 = 18、100コード

DICT_7X7_250 
Python: cv.aruco.DICT_7X7_250

7x7ビット、任意の2コード間の最小ハミング距離 = 17、250コード

DICT_7X7_1000 
Python: cv.aruco.DICT_7X7_1000

7x7ビット、任意の2コード間の最小ハミング距離 = 14、1000コード

DICT_ARUCO_ORIGINAL 
Python: cv.aruco.DICT_ARUCO_ORIGINAL

6x6ビット、任意の2コード間の最小ハミング距離 = 3、1024コード

DICT_APRILTAG_16h5 
Python: cv.aruco.DICT_APRILTAG_16h5

4x4ビット、任意の2コード間の最小ハミング距離 = 5、30コード

DICT_APRILTAG_25h9 
Python: cv.aruco.DICT_APRILTAG_25h9

5x5ビット、任意の2コード間の最小ハミング距離 = 9、35コード

DICT_APRILTAG_36h10 
Python: cv.aruco.DICT_APRILTAG_36h10

6x6ビット、任意の2コード間の最小ハミング距離 = 10、2320コード

DICT_APRILTAG_36h11 
Python: cv.aruco.DICT_APRILTAG_36h11

6x6ビット、任意の2コード間の最小ハミング距離 = 11、587コード

DICT_ARUCO_MIP_36h12 
Python: cv.aruco.DICT_ARUCO_MIP_36h12

6x6ビット、任意の2コード間の最小ハミング距離 = 12、250コード

関数詳解

◆ drawDetectedCornersCharuco()

void cv::aruco::drawDetectedCornersCharuco ( InputOutputArray image,
InputArray charucoCorners,
InputArray charucoIds = noArray(),
Scalar cornerColor = Scalar(255, 0, 0) )
Python:
cv.aruco.drawDetectedCornersCharuco(image, charucoCorners[, charucoIds[, cornerColor]]) -> image

#include <opencv2/objdetect/charuco_detector.hpp>

Charucoコーナーの集合を描画する。

引数
image入出力画像。1チャンネルまたは3チャンネルでなければならない。チャンネル数は変更されない。
charucoCorners検出された charuco コーナーのベクトル
charucoIdscharucoCorners 内の各コーナーの識別子のリスト
cornerColor各コーナーを囲む四角形の色

この関数は検出されたCharucoコーナーの集合を描画する。識別子ベクトルが与えられている場合は、各コーナーのidも描画する。

◆ drawDetectedDiamonds()

void cv::aruco::drawDetectedDiamonds ( InputOutputArray image,
InputArrayOfArrays diamondCorners,
InputArray diamondIds = noArray(),
Scalar borderColor = Scalar(0, 0, 255) )
Python:
cv.aruco.drawDetectedDiamonds(image, diamondCorners[, diamondIds[, borderColor]]) -> image

#include <opencv2/objdetect/charuco_detector.hpp>

検出されたChArUco Diamondマーカーの集合を描画する。

引数
image入出力画像。1チャンネルまたは3チャンネルでなければならない。チャンネル数は変更されない。
diamondCornersdetectCharucoDiamond() が返すのと同じ形式でのダイヤモンドコーナーの位置。(例: std::vector<std::vector<cv::Point2f> > )。検出された N 個のマーカーに対して、この配列の次元は Nx4 であるべきである。コーナーの順序は時計回りであるべきである。
diamondIdsdetectCharucoDiamond() が返すのと同じ形式での、diamondCorners 内のダイヤモンドの識別子のベクトル (例: std::vector<Vec4i>)。省略可能。指定しない場合、ID は描画されない。
borderColorマーカー境界の色。残りの色(テキストの色と最初のコーナーの色)はこの色を基に計算される。

検出されたdiamondの配列を与えると、この関数はそれらを画像中に描画する。マーカーの境界が描画され、与えられている場合はマーカー識別子も描画される。デバッグ目的に有用である。

◆ drawDetectedMarkers()

void cv::aruco::drawDetectedMarkers ( InputOutputArray image,
InputArrayOfArrays corners,
InputArray ids = noArray(),
Scalar borderColor = Scalar(0, 255, 0) )
Python:
cv.aruco.drawDetectedMarkers(image, corners[, ids[, borderColor]]) -> image

#include <opencv2/objdetect/aruco_detector.hpp>

検出されたマーカーを画像中に描画する。

引数
image入出力画像。1チャンネルまたは3チャンネルでなければならない。チャンネル数は変更されない。
corners入力画像上のマーカーコーナーの位置(例: std::vector<std::vector<cv::Point2f> > )。検出されたマーカーがN個の場合、この配列の次元はNx4でなければならない。コーナーの順序は時計回りでなければならない。
idsmarkersCorners 内のマーカーの識別子のベクトル。省略可能で、指定しない場合はidは描画されない。
borderColorマーカー境界の色。残りの色(テキストの色と最初のコーナーの色)は、視認性を向上させるためにこの色を基に計算される。

検出されたマーカーコーナーの配列とそれに対応するidを与えると、この関数はマーカーを画像中に描画する。マーカーの境界が描画され、与えられている場合はマーカー識別子も描画される。デバッグ目的に有用である。

◆ extendDictionary()

Dictionary cv::aruco::extendDictionary ( int nMarkers,
int markerSize,
const Dictionary & baseDictionary = Dictionary(),
int randomSeed = 0 )
Python:
cv.aruco.extendDictionary(nMarkers, markerSize[, baseDictionary[, randomSeed]]) -> retval

#include <opencv2/objdetect/aruco_dictionary.hpp>

ベース辞書を新たなnMarkersで拡張する。

引数
nMarkers辞書内のマーカー数
markerSize各マーカーの1次元あたりのビット数
baseDictionaryこの辞書のマーカーを先頭に含める(省略可能)
randomSeedtheRNG() に渡すユーザー指定のシード値

この関数はnMarkers個のマーカーから構成される新しい辞書を作成し、各マーカーは markerSize x markerSize ビットで構成される。baseDictionaryが与えられている場合、そのマーカーは直接含められ、残りはそれらに基づいて生成される。baseDictionaryのサイズがnMarkersより大きい場合、baseDictionaryの先頭nMarkers個のみが採用され、新たなマーカーは追加されない。

◆ generateImageMarker()

void cv::aruco::generateImageMarker ( const Dictionary & dictionary,
int id,
int sidePixels,
OutputArray img,
int borderBits = 1 )
Python:
cv.aruco.generateImageMarker(dictionary, id, sidePixels[, img[, borderBits]]) -> img

#include <opencv2/objdetect/aruco_detector.hpp>

正規のマーカー画像を生成する。

引数
dictionaryマーカーの種類を示すマーカー辞書
id返されるマーカーの識別子。指定された辞書内の有効なidでなければならない。
sidePixelsピクセル単位での画像のサイズ
imgマーカーが描画された出力画像
borderBitsマーカー境界の幅。

この関数はマーカー画像を正準形(すなわち印刷可能な状態)で返す

◆ getPredefinedDictionary() [1/2]

Dictionary cv::aruco::getPredefinedDictionary ( int dict)
Python:
cv.aruco.getPredefinedDictionary(dict) -> retval

#include <opencv2/objdetect/aruco_dictionary.hpp>

DICT_* で参照される定義済み辞書のいずれかを返す。

◆ getPredefinedDictionary() [2/2]

Dictionary cv::aruco::getPredefinedDictionary ( PredefinedDictionaryType name)
Python:
cv.aruco.getPredefinedDictionary(dict) -> retval

#include <opencv2/objdetect/aruco_dictionary.hpp>

PredefinedDictionaryType で定義された定義済み辞書のいずれかを返す。

変数詳解

◆ DEFAULT_VALID_BIT_ID_THRESHOLD

float cv::aruco::DEFAULT_VALID_BIT_ID_THRESHOLD {0.49f}
staticconstexpr