关于android:跟踪OpenCV中连续帧中的功能

Keeping track of features in successive frames in OpenCV

我编写了一个程序,它使用GoodFeaturesToTrack和CalcOpticalFlowPyrlk来跟踪各个帧之间的特性。该程序工作可靠,可以从前一帧估计安卓相机预览图像中的光流。以下是一些描述一般流程的片段:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
    }

}

上面的代码在一个循环中一遍又一遍地运行,在这个循环中每次迭代都会捕获一个新的预览帧。安全角、旧角和角都是类向量的数组。上面的代码工作得很好。

现在,对于我识别的每个特性,我想能够分配一些关于特性的信息…找到的次数,可能是特征的描述,谁知道…我的第一个方法是:

1
2
3
4
5
6
7
8
9
10
11
12
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);
  }
}

接下来,我所有的输出数组都从vector改为vector,在我自己扭曲的世界里,这应该是有效的,因为feature被定义为point2f的一个派生类。应用了多态性,除非我做了其他严重错误的事情,否则我无法想象这会在我身上吐出什么好理由。

这是我收到的错误信息。

OpenCV错误:断言失败(FUNC!= 0)在空CV::MAT::Curtoto(CV::OutPoint阵列,INT,双,双)const,文件/home /Reals/Ci/SLave50SDK/OpenCV/Mult/Cys/Src/Currency.CPP,第1095行

所以,我要问的是,opencv函数是否真的需要一个point2f向量,或者point2f的后代类也可以工作?下一步将是让GDB在Android手机上使用移动代码,并更准确地看到它崩溃的地方,但是如果我的方法存在根本性的缺陷,我不想走这条路。

或者,如果使用上面的方法跨多个帧跟踪一个特性,那么每个点的内存中的地址是否会改变?

事先谢谢。


我刚刚进入OpenCV,所以不能解决代码的这个方面,但是您的问题可能是代码中的一个错误,导致未初始化的基类(至少不像您预期的那样初始化)。你的代码应该是这样的:

1
2
3
4
5
6
7
8
Feature()
  : Point2f()
{
}
Feature(float a, float b)
  : Point2f(a,b)
{
}

您的实现在构造函数中创建两个临时的point2f对象。这些临时对象不会初始化功能对象的point2f基类,而这些临时对象将在构造函数的末尾被销毁。


简而言之,opencv函数需要std::vector作为参数。

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

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

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