Eine kleine Frage zum binokularen Stereo-Matching (ComputeStereoMatches) in ORB-SLAM2::Frame.cc

  • Dieser Artikel wird entsprechend der Struktur beschrieben : 1: Frontier-Einführung ->  2: Fragen   ->  3: Lösung

1: Grenzeinführung

Die Funktion void Frame::ComputeStereoMatches() in orb-slam2 wird vom Konstruktor Frame::Frame() der Fernglaskamera aufgerufen; die linken und rechten Bilder werden von der Fernglaskamera in einem Bild erfasst und die Tiefe wird durch Stereo ermittelt Abgleich der linken und rechten Bildinformationen. Die Verarbeitungsschritte in orb-slam2 sind ( siehe Autor: guoqing) :

Sparse-Stereo-Matching von zwei Bildrahmen (d. h. ORB-Feature-Point-Matching, nicht pixelweises dichtes Matching, aber dennoch zufriedenstellende Linienausrichtung)

Eingabe: Orb-Feature-Punktsätze, die zwei Frames von stereorektifizierten Bildern img_left und img_right entsprechen

  1. Statistiken zu Zeilen-Feature-Punkten. Zählen Sie den ORB-Feature-Punktsatz für jede Zeile von img_right. Dies ist praktisch, um Stereo-Matching-Ideen (Zeilensuche/Polarliniensuche) zu verwenden, um nach Punkten mit demselben Namen zu suchen und eine pixelweise Beurteilung zu vermeiden .
  2. Grobe Übereinstimmung. Suchen Sie gemäß dem Ergebnis von Schritt 1 für den Orb-Feature-Punkt Pi auf der i-ten Linie von img_left nach ähnlichen Orb-Feature-Punkten im Orb-Feature-Punkt, der auf der i-ten Linie von img_right festgelegt ist, und erhalten Sie Qi
  3. Exaktes Matching. Mit dem Punkt qi als Mittelpunkt und innerhalb des Radiusbereichs r wird ein Block-Matching (normalisiertes SAD) durchgeführt, um die Matching-Ergebnisse weiter zu optimieren
  4. Optimierung der Subpixel-Präzision. Die in Schritt 3 erhaltene Parallaxe ist eine Präzision vom Typ uchar/int, nicht unbedingt die reale Parallaxe, und die reale Parallaxe der Float-Präzision wird durch Subpixel-Differenz (parabolische Interpolation) erhalten.
  5. Optimaler Disparitätswert/Tiefenauswahl. Erhalten Sie den besten Matching-Punkt durch den Winner-Taken-Algorithmus (WTA).
  6. Ausreißer löschen. Block-Matching-Ähnlichkeitsschwellenwertbeurteilung, der normalisierte Sad ist der kleinste, bedeutet nicht, dass es sich um eine korrekte Übereinstimmung handeln muss, wie z. B. Beleuchtungsänderungen, schwache Texturen usw. führen zu falschen Übereinstimmungen

Ausgabe: Karte mit spärlicher Feature-Punkt-Disparität/Tiefenkarte (Subpixel-Genauigkeit) mvDepth-Matching-Ergebnis mvuRight

Aufgrund der Besonderheit des Aufbaus der binokularen Kamera verläuft die Epipolarlinie parallel zur Reihe. Daher wird in der Merkmalspunktstatistik der ersten Reihe der ORB-Merkmalspunktsatz in jeder Reihe des rechten Bildes gezählt, so dass bei Übereinstimmung der Merkmalspunkte festgestellt wird, dass die Merkmalspunkte des linken Bildes mit den Merkmalspunkten übereinstimmen Bilder können gemäß den entsprechenden vorherigen Statistiken gezählt werden. Der ORB-Merkmalspunktsatz der Zeile, wodurch ein pixelweiser Vergleich vermieden wird.

Meine Frage liegt in der Zählung der Merkmalspunkte der Reihe rechts.

Zweitens: Zweifel

Der Vorgang zum Zählen der Merkmalspunkte der Zeile rechts:

1. Nehmen Sie die Höhe der 0. Schicht der Pyramide (das Originalbild) als Zeile und zählen Sie die Merkmalspunkte des rechten Bildes Zeile für Zeile

// 金字塔底层(0层)图像高 nRows
    const int nRows = mpORBextractorLeft->mvImagePyramid[0].rows;

Das heißt, die aus der gesamten Pyramide extrahierten Merkmalspunkte werden einheitlich gemäß den Zeilen der 0. Schicht organisiert

2. Verwenden Sie einen zweidimensionalen Vektor, um den Index des Kugelmerkmalspunkts jeder Zeile zu speichern

    vector<vector<size_t> > vRowIndices(nRows, vector<size_t>());
    for(int i=0; i<nRows; i++) vRowIndices[i].reserve(200);

	// 右图特征点数量,N表示数量 r表示右图,且不能被修改
    const int Nr = mvKeysRight.size();

    for(int iR = 0; iR < Nr; iR++) {
        // 获取特征点ir的y坐标,即行号
        const cv::KeyPoint &kp = mvKeysRight[iR];
        // 获取特征点ir的y坐标,即行号
        const float &kpY = kp.pt.y;   
        // 这里考虑到了不同金字塔层提取的特征点的尺度问题,动态变化上下行搜索范围
        // 但是为什么不考虑不同金字塔特征点ir的y坐标的尺度问题呢?
        // 就这样把它归为第0层的某行特征点?
        const float r = 2.0f * mvScaleFactors[mvKeysRight[iR].octave];
        const int maxr = ceil(kpY + r);
        const int minr = floor(kpY - r);

        for(int yi=minr;yi<=maxr;yi++)
            vRowIndices[yi].push_back(iR);
    }

Meine Frage ist:

Da nun die Skala der von verschiedenen Pyramidenschichten extrahierten Merkmalspunkte berücksichtigt wird, ändert sich der Suchbereich nach oben und unten dynamisch (obwohl nach dem Prinzip der Epipolarlinien die übereinstimmenden Merkmalspunkte rechts auf derselben Linie liegen sollten). (Bild, aber unter Berücksichtigung des Fehlers wird es immer noch der nächstgelegene nach oben und unten sein.)
Aber warum nicht die Skala der y-Koordinaten der Merkmalspunkte ir verschiedener Pyramidenschichten berücksichtigen? Einfach als eine bestimmte Reihe von Merkmalspunkten auf Ebene 0 klassifizieren? 

Drittens: Lösen

Wenn der Code dies sieht, bleibt er hängen. Ich habe nicht verstanden, warum die y-Koordinaten der Merkmalspunkte verschiedener Pyramidenschichten als 0. Schicht verwendet werden können. Ich denke, der Autor hat hier einen Fehler gemacht ...

Schauen wir uns die Pyramidenebene in ORBextractor.cc später noch einmal an, im Funktor ORBextractor::operator():

// Step 6 对非第0层图像中的特征点的坐标恢复到第0层图像(原图像)的坐标系下
// ? 得到所有层特征点在第0层里的坐标放到_keypoints里面
// 对于第0层的图像特征点,他们的坐标就不需要再进行恢复了
if (level != 0)
{
    // 获取当前图层上的缩放系数
    float scale = mvScaleFactor[level];
    // 遍历本层所有的特征点
    for (vector<KeyPoint>::iterator keypoint = keypoints.begin(), keypointEnd = keypoints.end(); keypoint != keypointEnd; ++keypoint)
         // 特征点本身直接乘缩放倍数就可以了
         keypoint->pt *= scale;
    }

Es stellt sich heraus, dass die Koordinaten der von verschiedenen Pyramidenschichten extrahierten Merkmalspunkte im Koordinatensystem des Bildes der 0. Schicht (Originalbild) wiederhergestellt werden.

orb-slam2 hat viele Codes und bleibt hängen, wenn Sie einen bestimmten Punkt nicht beachten. Ich teile es und hoffe, jemandem zu helfen, der die gleiche Verwirrung hat wie ich.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_58045467/article/details/131047382
conseillé
Classement