Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在OpenCV中跟踪连续帧中的特征_Android_C++_Opencv - Fatal编程技术网

Android 在OpenCV中跟踪连续帧中的特征

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和calcOpticalFlowPyrLK从帧到帧跟踪特征。该程序工作可靠,能够根据前一帧在Android摄像头上的预览图像中估计光流。以下是一些描述一般流程的片段:

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更改为vector,在我自己的扭曲世界中,这应该是可行的,因为Feature被定义为Point2f的后代类。但是,我想不出有什么好的理由让我呕吐,除非我做了其他可怕的错事

这是我收到的错误信息

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

因此,我向论坛提出的问题是,OpenCV函数真的需要一个Point2f向量吗,还是Point2f的后代类也可以工作?下一步将是让gdb在Android手机上使用移动代码,并更准确地看到它在哪里崩溃,但如果我的方法存在根本性缺陷,我不想走这条路

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


提前感谢。

简短的回答是,OpenCV函数确实需要
std::vector
作为参数

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

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