我编写了一个程序,该程序使用goodFeaturesToTrack和calcOpticalFlowPyrLK来逐帧跟踪要素。该程序可靠地工作,并且可以根据前一帧估计Android相机上预览图像中的光流。以下是一些片段,描述了一般过程:

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从vector 更改为vector 在我自己的世界中应该起作用,因为Feature被定义为Point2f的后代。多态性的应用,除非我做了其他可怕的错误,否则我无法想象有什么好理由为什么会这样this我。

这是我收到的错误消息。

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

因此,我在论坛上的问题是OpenCV函数确实需要Point2f vector ,还是Point2f的后代类也可以工作?下一步将是使gdb在Android手机上使用移动代码,并更准确地查看崩溃的位置,但是,如果我的方法存在根本缺陷,我不想走这条路。

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

提前致谢。

最佳答案

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

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

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

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

10-04 21:02