跟踪OpenCV中连续帧的特征

我编写了一个程序,使用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和角落都是类向量<Point2f>的所有数组。 上面的代码很好用。

现在,对于我已经确定的每个功能,我希望能够分配一些关于该功能的信息...发现的次数,可能是功能的描述符,谁知道......我的第一个做法是这是:

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);
  }
}

接下来,我所有的输出数组都从矢量<Point2f>更改为矢量<Feature>,它在我自己的扭曲世界中应该工作,因为Feature被定义为Point2f的后代类。 应用多态性,我无法想象有什么好的理由说明,为什么这会呕吐我,除非我做了其他可怕的错误。

这是我得到的错误消息。

OpenCV错误:在void cv :: Mat :: convertTo(cv :: OutputArray,int,double,double)const,file / home / reports / ci / slave50-SDK / opencv / modules /中创建失败(func!= 0) core / src / convert.cpp,第1095行

所以,我在论坛上的问题是,OpenCV的功能是否真的需要一个Point2f向量,或者一个Point2f的后代类是否也能工作? 下一步是让gdb在Android手机上处理移动代码,并更准确地查看崩溃的位置,但如果我的方法存在根本性缺陷,我不想走这条路。

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

提前致谢。


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

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

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

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


我只是自己进入OpenCV,因此无法解决代码的这方面问题,但是您的问题可能是代码中的一个错误,导致未初始化的基类(至少未按照您的预期初始化)。 你的代码应该是这样的:

Feature()
  : Point2f()
{
}
Feature(float a, float b)
  : Point2f(a,b)
{
}

您的实现在构造函数中创建两个临时Point2f对象。 这些临时对象不会初始化Feature对象的Point2f基类,并且这些临时对象在构造函数的末尾被销毁。

链接地址: http://www.djcxy.com/p/95151.html

上一篇: Keeping track of features in successive frames in OpenCV

下一篇: Rotating videos with FFmpeg