VINS-Fusionコード読み(六)

2158 ワード

前のページは長すぎます.FeatureTrackerクラスのsetMask()のメンバー関数を個別に取り出して紹介します.row, col:FeatureTrackerクラスのデータメンバーは、row = cur_img.rows; col = cur_img.cols;によって最初に与えられ、cur_imgと同じ大きさの階調(CV_8UC1)「ピクチャ」、白(255)を作成する.
得られた情報を新たなデータ構造vector>> cnt_pts_id;に構成する各要素make_pair(track_cnt[i], make_pair(cur_pts[i], ids[i]))は、それぞれ、点の追跡カウント、点の位置および点のIDに対応する.track_cnt, cur_pts, idsに従って並べ替えて、多いから少ないまで;情報はtrack_cntに保存され、cnt_pts_idはクリアされる.track_cnt, cur_pts, idsの各要素を順次巡回し、対応する情報をcnt_pts_idに順番に保存しながら、track_cnt, cur_pts, idsは、次の通りopenCV公式文書を調べます.cv::circle(mask, it.second.first, MIN_DIST, 0, -1); C++ API:のいくつかのパラメータは直感的で、最後のいくつかを紹介します.
ソースコードの意味は、void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0)maskの位置に、半径cur_pts(具体的な値はどう設定しますか?)の色が黒(0)の塗りつぶし円を描くということです.
【注意】MIN_DISTmaskクラスのデータメンバーであるので、結果は保存されます.
void FeatureTracker::setMask()
{
    mask = cv::Mat(row, col, CV_8UC1, cv::Scalar(255));

    // prefer to keep features that are tracked for long time
    vector>> cnt_pts_id;

    for (unsigned int i = 0; i < cur_pts.size(); i++)
        cnt_pts_id.push_back(make_pair(track_cnt[i], make_pair(cur_pts[i], ids[i])));

    sort(cnt_pts_id.begin(), cnt_pts_id.end(), [](const pair> &a, const pair> &b)
         {
            return a.first > b.first;
         });

    cur_pts.clear();
    ids.clear();
    track_cnt.clear();

    for (auto &it : cnt_pts_id)
    {
        if (mask.at(it.second.first) == 255)
        {
            cur_pts.push_back(it.second.first);
            ids.push_back(it.second.second);
            track_cnt.push_back(it.first);
            cv::circle(mask, it.second.first, MIN_DIST, 0, -1);
        }
    }
}