Opencv学习笔记之——画出两帧的特征点之间的对应关系

Posted gwpscut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Opencv学习笔记之——画出两帧的特征点之间的对应关系相关的知识,希望对你有一定的参考价值。

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学习笔记之——画出两帧的特征点之间的对应关系的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:在Opencv下基于ORB的图像特征提取

SLAM中的卡方分布

数字图像处理OpenCV3 扩展模块学习笔记

移动摄像机的视频稳定

OpenCV实现摄像机标定和像素转换,surf寻找特征点,FLANN匹配算子进行匹配

寻找两帧之间的变换