iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

我的影像視覺定位學習筆記系列 第 26

day26-calcOpticalFlowPyrLK光流

  • 分享至 

  • xImage
  •  

再昨天遇到計算出來的初始化點雲與特徵點的追蹤的問題的時候,
透過之前已經遇處理的特徵點似乎匹配數量不太足夠,
在1-2兩張影像的特徵點要有匹配才會有3D點
而1-3的匹配點又要剛好有3D點我才能將其塞入PnP求解。
我有嘗試過將3D點轉換到第二張相機的坐標系
嘗試透過2-3的匹配點求解PnP然而匹配的數量依然不理想,
也許你的測試案例是可行的,而結果也是合理的那恭喜QQ

由於我的測試環境不理想,所以我只好變更策略,
使用第一張影像的特徵點去追蹤第三張影像的特徵點
我必須準備第一張影像與第三張影像,
並給輸入poits1我想追蹤的第一張影像中的特徵點
程式會將可能的追蹤點輸出在poits2
而我可以調整winSize 掃略的視窗大小來調整搜尋的位置,
如果位移大winSize就必須大,
但如果你的影像是從影片也許你的winSize可以小一點效果會比較好。

std::vector<float> err;
cv::Size winSize = cv::Size(40, 40);
cv::TermCriteria termcrit = cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 30, 0.01);

calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 3, termcrit, 0, 0.001);

而必須要注意的是也許我要追蹤的點跑出視窗外,那麼我必須將這些無效點給移除,

int indexCorrection = 0;
for (int i = 0; i < status.size(); i++)
{
    cv::Point2f pt = points2.at(i - indexCorrection);
    if ((status.at(i) == 0) || (pt.x < 0) || (pt.y < 0)) {
        if ((pt.x < 0) || (pt.y < 0)) {
            status.at(i) = 0;
        }
        points1.erase(points1.begin() + (i - indexCorrection));
        points2.erase(points2.begin() + (i - indexCorrection));
        indexCorrection++;
    }

}

之後在輸入PnP求解的同時,
需要注意輸入的影像點與3D點的個數是否一致,
由於輸入的影像點有可能失效而被移除,
3D點也需要將追失的點移除。


上一篇
day25-solvePnP
下一篇
day27-stereo camera triangulate深度相機 三角測量
系列文
我的影像視覺定位學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言