電腦視覺CV 之 CMT跟蹤演算法分析四

來源:互聯網
上載者:User

標籤:cmt   電腦視覺   演算法   跟蹤   

1 前言在上一部分我們已經分析到了計算特徵點的縮放和旋轉,這裡最後分析去掉不好的特徵點的方法。2 最後步驟分析vote的基本思想就是這些特徵點相對中心的相對距離在把縮放旋轉考慮進去之後是相對不變的,也就是按道理下一幀的特徵點相對中心的位置是不變的。但是由於映像本身的變化,不可能得到完全一樣的相對位置,這個時候,有一些會離中心近,有一些會偏差很大。那麼,作者就採用聚類的方法,選擇最大的一類作為最好的特徵點。其他的不要。
上面這個圖應該可以很好的理解這個過程。再看作者自己官網上的圖大家應該可以理解。代碼上作者找了一個聚類的庫來做,具體我沒有深入分析了:
void Consensus::findConsensus(const vector<Point2f> & points, const vector<int> & classes,        const float scale, const float rotation,        Point2f & center, vector<Point2f> & points_inlier, vector<int> & classes_inlier){    //If no points are available, reteurn nan    if (points.size() == 0)    {        center.x = numeric_limits<float>::quiet_NaN();        center.y = numeric_limits<float>::quiet_NaN();        return;    }    //Compute votes 計算投票:基本方法就是計算點相對於正規化且計算其旋轉加縮放後的點的相對位置 保持相對一致    vector<Point2f> votes(points.size());    for (size_t i = 0; i < points.size(); i++)    {        votes[i] = points[i] - scale * rotate(points_normalized[classes[i]], rotation);    }    t_index N = points.size();    float * D = new float[N*(N-1)/2]; //This is a lot of memory, so we put it on the heap    cluster_result Z(N-1);    //Compute pairwise distances between votes    //計算votes點之間的相對距離    int index = 0;    for (size_t i = 0; i < points.size(); i++)    {        for (size_t j = i+1; j < points.size(); j++)        {            //TODO: This index calculation is correct, but is it a good thing?            //int index = i * (points.size() - 1) - (i*i + i) / 2 + j - 1;            // 計算相對距離            D[index] = norm(votes[i] - votes[j]);            index++;        }    }    MST_linkage_core(N,D,Z);    union_find nodes(N);    //Sort linkage by distance ascending    std::stable_sort(Z[0], Z[N-1]);    //S are cluster sizes    int * S = new int[2*N-1];    //TODO: Why does this loop go to 2*N-1? Shouldn‘t it be simply N? Everything > N gets overwritten later    for(int i = 0; i < 2*N-1; i++)    {        S[i] = 1;    }    t_index parent = 0; //After the loop ends, parent contains the index of the last cluster    for (node const * NN=Z[0]; NN!=Z[N-1]; ++NN)    {        // Get two data points whose clusters are merged in step i.        // Find the cluster identifiers for these points.        t_index node1 = nodes.Find(NN->node1);        t_index node2 = nodes.Find(NN->node2);        // Merge the nodes in the union-find data structure by making them        // children of a new node        // if the distance is appropriate        if (NN->dist < thr_cutoff)        {            parent = nodes.Union(node1, node2);            S[parent] = S[node1] + S[node2];        }    }    //Get cluster labels    int * T = new int[N];    for (t_index i = 0; i < N; i++)    {        T[i] = nodes.Find(i);    }    //Find largest cluster    int S_max = distance(S, max_element(S, S + 2*N-1));    //Find inliers, compute center of votes    points_inlier.reserve(S[S_max]);    classes_inlier.reserve(S[S_max]);    center.x = center.y = 0;    for (size_t i = 0; i < points.size(); i++)    {        //If point is in consensus cluster        if (T[i] == S_max)        {            points_inlier.push_back(points[i]);            classes_inlier.push_back(classes[i]);            center.x += votes[i].x;            center.y += votes[i].y;        }    }    center.x /= points_inlier.size();    center.y /= points_inlier.size();    delete[] D;delete[] S;delete[] T;}

通過這樣的演算法得到inlier
然後在代碼中,作者又做了一次匹配,matchlocal,在我看來和findconsensus的目的是一樣的,也是通過相對的點的距離來判定是不是要的特徵,然後在對這些特徵做一次匹配,是就選進來,最後將inlier的點和matchlocal的點合并,作為最終的特徵點。matchlocal的代碼如下:
void Matcher::matchLocal(const vector<KeyPoint> & keypoints, const Mat descriptors,        const Point2f center, const float scale, const float rotation,        vector<Point2f> & points_matched, vector<int> & classes_matched){    if (keypoints.size() == 0) {        return;    }    //Transform initial points    vector<Point2f> pts_fg_trans;    pts_fg_trans.reserve(pts_fg_norm.size());    for (size_t i = 0; i < pts_fg_norm.size(); i++)    {        // 同樣是計算相對位置        pts_fg_trans.push_back(scale * rotate(pts_fg_norm[i], -rotation));    }    //Perform local matching    for (size_t i = 0; i < keypoints.size(); i++)    {        //Normalize keypoint with respect to center        Point2f location_rel = keypoints[i].pt - center;        //Find potential indices for matching        vector<int> indices_potential;        for (size_t j = 0; j < pts_fg_trans.size(); j++)        {            // 計算位置偏差            float l2norm = norm(pts_fg_trans[j] - location_rel);            // 設定一個閾值            if (l2norm < thr_cutoff) {                indices_potential.push_back(num_bg_points + j);            }        }        //If there are no potential matches, continue        if (indices_potential.size() == 0) continue;        //Build descriptor matrix and classes from potential indices        Mat database_potential = Mat(indices_potential.size(), database.cols, database.type());        for (size_t j = 0; j < indices_potential.size(); j++) {            database.row(indices_potential[j]).copyTo(database_potential.row(j));        }        //Find distances between descriptors        vector<vector<DMatch> > matches;        // 對選出的特徵點進行特徵匹配        bfmatcher->knnMatch(descriptors.row(i), database_potential, matches, 2);        vector<DMatch> m = matches[0];        float distance1 = m[0].distance / desc_length;        float distance2 = m.size() > 1 ? m[1].distance / desc_length : 1;        if (distance1 > thr_dist) continue;        if (distance1/distance2 > thr_ratio) continue;        int matched_class = classes[indices_potential[m[0].trainIdx]];        points_matched.push_back(keypoints[i].pt);        classes_matched.push_back(matched_class);    }}

好了,由於時間關係,CMT演算法就分析到這了。有很多不足,可能也分析不到位甚至有錯的地方,請批評指正。
文章原創,轉載麻煩註明出處:blog.csdn.net/songrotek

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

電腦視覺CV 之 CMT跟蹤演算法分析四

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.