5

ArUco マーカーを使用して遠近法を修正し、画像のサイズを計算しています。この画像では、マーカーの外縁間の正確な距離を知っており、それを使用して黒い四角形のサイズを計算しています。

私の問題はaruco::detectMarkers、マーカーの真のエッジを常に識別するとは限らないことです(詳細画像に示されているように)。マーカーの角に基づいて遠近法を修正すると、画像内のオブジェクトのサイズ計算に影響を与える歪みが発生します。

のエッジ検出精度を向上させる方法はありaruco::detectMarkersますか?

ボード全体の縮小写真は次のとおりです。

マーカーボード

エッジ検出の不正確さを示す左下のマーカーの詳細を次に示します。

左下のマーカー

同じマーカー ID の正確なエッジ検出を示す右上のマーカーの詳細を次に示します。

ここに画像の説明を入力

この縮小された画像ではわかりにくいですが、左上のマーカーは正確で、右下のマーカーは不正確です。

呼び出す私の関数detectMarkers

bool findMarkers(const Mat image, Point2d outerMarkerCoordinates[], Point2d innerMarkerCoordinates[], Size2d *boardSize) {
    Ptr<aruco::Dictionary> theDictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_1000);
    vector<vector<Point2f> > markers;
    vector<int> ids;

    aruco::detectMarkers(image, theDictionary, markers, ids);

    aruco::drawDetectedMarkers(image, markers, ids);

    return true; //There's actually more code here that makes sure there are four markers.
}
4

1 に答える 1

5

オプションのdetectorParameters引数toを調べると、detectMarkersというパラメーターが示されましたdoCornerRefinement。その説明は、「サブピクセルの洗練を行うかどうか」です。表示されているエラーは 1 ピクセルより大きいため、これが私の状況に当てはまるとは思いませんでした。とにかく試してみて、cornerRefinementWinSize値を試してみたところ、実際に問題が解決したことがわかりました。現在、ArUco の意味での「ピクセル」は、画像ピクセルではなく、マーカー内の正方形の 1 つのサイズであると考えています。

への変更された呼び出しdetectMarkers:

bool findMarkers(const Mat image, Point2d outerMarkerCoordinates[], Point2d innerMarkerCoordinates[], Size2d *boardSize) {
    Ptr<aruco::Dictionary> theDictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_1000);
    vector<vector<Point2f> > markers;
    vector<int> ids;
    Ptr<aruco::DetectorParameters> detectorParameters = new aruco::DetectorParameters;

    detectorParameters->doCornerRefinement = true;
    detectorParameters->cornerRefinementWinSize = 11;       

    aruco::detectMarkers(image, theDictionary, markers, ids, detectorParameters);

    aruco::drawDetectedMarkers(image, markers, ids);

    return true; //There's actually more code here that makes sure there are four markers.
}

成功!

正しく識別されたエッジ

于 2016-12-09T18:13:30.160 に答える