上一篇太长了,把其中调用的FeatureTracker
类里面的setMask()
成员函数单独拿出来介绍。
row, col
:FeatureTracker
类的数据成员,被赋值为row = cur_img.rows; col = cur_img.cols;
首先,建立一个和cur_img
同样大小的灰度(CV_8UC1
)“图片”,白色(255);
把已经得到的信息,组织成一个新的数据结构
vector
其中的每一个元素make_pair(track_cnt[i], make_pair(cur_pts[i], ids[i]))
track_cnt, cur_pts, ids
分别对应:点的跟踪计数、点的位置和点的ID;
并按照track_cnt
排序,由多到少;
信息保存到cnt_pts_id
,此时将track_cnt, cur_pts, ids
清空。
按顺序遍历cnt_pts_id
的每个元素,按顺序将对应信息存入track_cnt, cur_pts, ids
同时,cv::circle(mask, it.second.first, MIN_DIST, 0, -1);
查看openCV官方文档如下:
C++ API:
void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
前几个参数比较直观,介绍最后几个:
thickness – Thickness of the circle outline, if positive. Negative thickness means that a filled circle is to be drawn. (-1表示填充)
那么源代码的含义就是,在mask
的cur_pts
位置上,画一个半径为MIN_DIST
(具体值怎么设定?)的颜色为黑色(0)的填充圆。
【注意】:mask
为FeatureTracker
类的数据成员,因此结果得以保存!
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);
}
}
}