Android 在OpenCV中跟踪连续帧中的特征
我已经编写了一个程序,使用goodFeaturesToTrack和calcOpticalFlowPyrLK从帧到帧跟踪特征。该程序工作可靠,能够根据前一帧在Android摄像头上的预览图像中估计光流。以下是一些描述一般流程的片段:Android 在OpenCV中跟踪连续帧中的特征,android,c++,opencv,Android,C++,Opencv,我已经编写了一个程序,使用goodFeaturesToTrack和calcOpticalFlowPyrLK从帧到帧跟踪特征。该程序工作可靠,能够根据前一帧在Android摄像头上的预览图像中估计光流。以下是一些描述一般流程的片段: goodFeaturesToTrack(grayFrame, corners, MAX_CORNERS, quality_level, min_distance, cv::noArray(), eig_block_size, use_harris, 0
goodFeaturesToTrack(grayFrame, corners, MAX_CORNERS, quality_level,
min_distance, cv::noArray(), eig_block_size, use_harris, 0.06);
上面的代码在循环中一次又一次地运行,每次迭代都会捕获一个新的预览帧。安全角点、旧角点和角点都是类向量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函数确实需要
std::vector
作为参数
请注意,向量包含cv::Point2f
对象本身,而不是指向cv::Point2f
的指针,因此不存在多态行为
此外,让您的功能继承自cv::Point2f
可能不是一个理想的解决方案。在这种情况下使用组合会更简单,更不用说建模正确的关系(Feature
has-acv::Point2f
)
依赖对象在内存中的位置也可能不是一个好主意。相反,请仔细阅读您选择的数据结构。我自己刚刚进入OpenCV,因此无法解决代码的这一方面,但您的问题可能是代码中的一个错误,导致基类未初始化(至少没有像您预期的那样初始化)。您的代码应该如下所示:
Feature()
: Point2f()
{
}
Feature(float a, float b)
: Point2f(a,b)
{
}
您的实现在构造函数中创建两个临时Point2f对象。这些临时对象不会初始化Feature对象的Point2f基类,这些临时对象会在构造函数末尾被销毁。这几乎就是我要走的路线,除了“Feature”中有一个“std::vector”元素,其中“Feature”向量的每个元素都是过去的观察值。现在可以理解为什么这是唯一一个似乎支持任何前进势头的方法。
Feature()
: Point2f()
{
}
Feature(float a, float b)
: Point2f(a,b)
{
}