VINS-Fusionコード読み(六)
前のページは長すぎます.
得られた情報を新たなデータ構造
ソースコードの意味は、
【注意】
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_DIST
はmask
クラスのデータメンバーであるので、結果は保存されます.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);
}
}
}