【问题标题】:Keeping track of features in successive frames in OpenCV在 OpenCV 中跟踪连续帧中的特征
【发布时间】:2013-04-28 12:03:37
【问题描述】:

我编写了一个程序,它使用 goodFeaturesToTrack 和 calcOpticalFlowPyrLK 逐帧跟踪特征。该程序可靠地工作,并且可以从前一帧估计 Android 相机上的预览图像中的光流。下面是一些描述一般过程的sn-ps:

goodFeaturesToTrack(grayFrame, corners, MAX_CORNERS, quality_level,
        min_distance, cv::noArray(), eig_block_size, use_harris, 0.06);

...

if (first_time == true) {
    first_time = false;
    old_corners = corners;
    safe_corners = corners;
    mLastImage = grayFrame;

} else {

    if (old_corners.size() > 0 && corners.size() > 0) {

        safe_corners = corners;
        calcOpticalFlowPyrLK(mLastImage, grayFrame, old_corners, corners,
                status, error, Size(21, 21), 5,
                TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30,
                        0.01));
    } else {
        //no features found, so let's start over.
        first_time = true;
    }

}

上面的代码在一个循环中一遍又一遍地运行,每次迭代都会抓取一个新的预览帧。 Safe_corners、old_corners 和corners 都是类vector 的数组。上面的代码效果很好。

现在,对于我确定的每个功能,我希望能够分配有关该功能的一些信息...找到的次数,也许是该功能的描述符,谁知道...我的第一个这样做的方法是:

class Feature: public Point2f {
private:
  //things about a feature that I want to track
public: 
  //getters and fetchers and of course:
  Feature() {
    Point2f();
  }
  Feature(float a, float b) { 
    Point2f(a,b);
  }
}

接下来,我所有的 outputArrays 都从向量 更改为向量 ,这在我自己扭曲的世界中应该可以工作,因为 Feature 被定义为 Point2f 的后代类。应用了多态性,我想不出有什么好的理由让我感到恶心,除非我做了其他可怕的错误。

这是我收到的错误消息。

OpenCV 错误:void cv::Mat::convertTo(cv::OutputArray, int, double, double) const, 文件 /home/reports/ci/slave50-SDK/opencv 中的断言失败 (func != 0) /modules/core/src/convert.cpp,第 1095 行

那么,我对论坛的问题是,OpenCV 函数真的需要 Point2f 向量还是 Point2f 的后代类也能正常工作?下一步是让 gdb 在 Android 手机上使用移动代码并更准确地查看崩溃的位置,但是如果我的方法存在根本缺陷,我不想走这条路。

或者,如果使用上述方法跨多个帧跟踪特征,每个点在内存中的地址是否会改变?

提前致谢。

【问题讨论】:

    标签: android c++ opencv


    【解决方案1】:

    简短的回答是YES,OpenCV 函数确实需要std::vector<cv::Point2f> 作为参数。

    请注意,向量包含cv::Point2f 对象本身,而不是指针 指向cv::Point2f,因此不存在多态行为。

    此外,让您的 Feature 继承自 cv::Point2f 可能不是一个理想的解决方案。在这种情况下使用组合会更简单,更不用说建模正确的关系了(Feature has-a cv::Point2f)。

    依赖对象在内存中的位置也可能不是一个好主意。相反,请阅读您选择的数据结构。

    【讨论】:

    • 这几乎就是我要走的路线,除了 'Feature' 有一个 'std::vector<:point2f>' 元素,其中 'Feature' 向量的每个元素都是过去的观察.现在可以理解为什么这是似乎支持任何前进动力的唯一方法。
    【解决方案2】:

    我自己刚刚进入 OpenCV,因此无法解决代码的这方面问题,但您的问题可能是代码中的错误导致未初始化的基类(至少未如您预期的那样初始化)。您的代码应如下所示:

    Feature()
      : Point2f()
    {
    }
    Feature(float a, float b)
      : Point2f(a,b)
    {
    }
    

    您的实现在构造函数中创建了两个临时 Point2f 对象。这些临时对象不会初始化 Feature 对象的 Point2f 基类,这些临时对象会在构造函数结束时被销毁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2020-08-13
      • 2011-08-22
      相关资源
      最近更新 更多