我使用calcOpticalFlowPyrLK()
功能来跟踪要素点。我想使用calcOpticalFlowPyrLK()
生成的状态向量将匹配的点与结果分开。
opencv page的文档说,
输出状态向量(无符号字符);向量的每个元素 如果找到相应功能的流,则设置为1, 否则,它被设置为0.
但是在实现之前打印状态向量时,我发现状态向量大小更大,即使数组通过跟踪的特征点大小,也会分散1和0。
如果我的跟踪点矢量大小为65,则状态矢量大小为100,即使在状态[64]之后也存在1和0。
如果有人可以帮助我获得正确的分数,那将会有所帮助。
谢谢。
答案 0 :(得分:1)
在我的实现中,我在calcOpticalFlowPyrLK()之前清除 nextPts 和状态向量。 prevPts,nextPts和status的大小完全相同。如果状态中的数据为0,则输出流无效。
vector<cv::Point2f> points_prev;
/* points_prev.push_back(some data) */
vector<cv::Point2f> points_next;
vector<uchar> status;
calcOpticalFlowPyrLK(img_prev, img_next, points_prev, points_next, status, err, winSize, 3, termcrit, 0, 0.001);
for (size_t i = 0; i < status.size(); i++)
{
if(status.at(i) == 0)
/*points_prev[i] is not valid*/
}
答案 1 :(得分:1)
状态向量应与特征向量的大小相同。 如果您发现尺寸不匹配 - 请分享您正在使用的代码。
在这里,我们如何使用它来过滤掉“坏”功能:
calcOpticalFlowPyrLK(gray_1, gray_2, features_1, features_2, status, err,
wins_size, max_level, term_crit);
// filter points with bad status
size_t i, k;
for( i = k = 0; i < features_2.size(); i++ ){
if (!status[i]) continue;
features_1[k] = features_1[i];
features_2[k] = features_2[i];
err[k] = err[i];
k++;
}
features_1.resize(k);
features_2.resize(k);
err.resize(k);