void FeatureTracker::event_drawTrack(const cv::Mat &imLeft, const cv::Mat &imRight,
vector<int> &curLeftIds,
vector<cv::Point2f> &curLeftPts,
vector<cv::Point2f> &curRightPts,
map<int, cv::Point2f> &prevLeftPtsMap)
{//画图的时候,imTrack是个全局变量,用于输出当前帧以及其检测的特征点
//int rows = imLeft.rows;
int cols = imLeft.cols;
if (!imRight.empty())
cv::hconcat(imLeft, imRight, imTrack);//将两张图像水平接起来
else
imTrack = imLeft.clone();
cv::cvtColor(imTrack, imTrack, CV_GRAY2RGB);//变为黑白
for (size_t j = 0; j < curLeftPts.size(); j++)
{
double len = std::min(1.0, 1.0 * track_cnt[j] / 20);//跟踪数少于20次,len为0,这样为蓝色。当跟踪大于20次,len为1,这样点为红色
cv::circle(imTrack, curLeftPts[j], 2, cv::Scalar(255 * (1 - len), 0, 255 * len), 2);
}
if (!imRight.empty())
{
// for (size_t i = 0; i < curRightPts.size(); i++)
// {
// cv::Point2f rightPt = curRightPts[i];
// rightPt.x += cols;
// cv::circle(imTrack, rightPt, 2, cv::Scalar(0, 255, 0), 2);//cvScalar的储存顺序是B-G-R
// cv::Point2f leftPt = curLeftPts[i];
// cv::line(imTrack, leftPt, rightPt, cv::Scalar(0, 255, 0), 1, 8, 0);
// }
map<int, cv::Point2f>::iterator mapIt;
for (size_t i = 0; i < curLeftIds.size(); i++)
{
int id = curLeftIds[i];
mapIt = prevLeftPtsMap.find(id);//这是之前的特征点
cv::Point2f rightPt = mapIt->second;
rightPt.x += cols;
if(mapIt != prevLeftPtsMap.end()){
cv::circle(imTrack, rightPt, 2, cv::Scalar(0, 0,255), 1.5);//将其点画出来,绿色
cv::Point2f leftPt = curLeftPts[i];
// cv::line(imTrack, leftPt, rightPt, cv::Scalar(0, 255, 0), 1, 8, 0);
cv::arrowedLine(imTrack, leftPt, rightPt, cv::Scalar(0, 255, 0), 1, 8, 0, 0.02);//绿色的
// cv::arrowedLine(imTrack, curLeftPts[i], mapIt->second, cv::Scalar(0, 255, 0), 1, 8, 0, 0.2);//绿色的
}
}
}
Opencv学习笔记之——画出两帧的特征点之间的对应关系
特征点跟踪绘制
最新推荐文章于 2024-06-18 16:16:39 发布
本文介绍了一个用于视觉跟踪的特征点绘制方法,该方法通过不同颜色的圆圈来表示当前帧中检测到的特征点,并使用箭头连接左右图像中对应的特征点,便于直观展示特征点的匹配情况。

898

被折叠的 条评论
为什么被折叠?



