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
这是我收到的错误信息。
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函数需要
注意,向量本身包含
另外,让您的
依赖对象在内存中的位置也可能不是一个好主意。相反,请阅读您选择的数据结构。