再昨天遇到計算出來的初始化點雲與特徵點的追蹤的問題的時候,
透過之前已經遇處理的特徵點似乎匹配數量不太足夠,
在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點也需要將追失的點移除。