使用VideoCapture类创建一个类

时间:2015-10-22 09:39:26

标签: c++ opencv

定义类很新,我遇到了在自制类中定义VideoCapture对象的问题。见下面的代码。 我尝试创建一个包含有关视频文件的所有信息的类。所以我初始化了videoCapture对象。哪个工作正常,但之后的'构造函数' (fName :: setAviName)完成了它的工作,我调用了该类的另一个函数(fAvi.GetNumFrames()),VideoCapture对象变成了NULL指针。 显然,当我的构造函数'被破坏时,VideoCapture对象就会被销毁。完了。该类的其他私有变量工作正常。

尝试用共享指针解决问题'但没有成功。

问题清楚了吗?这可能是我想做的吗?怎么样?或者我不应该打扰?

非常感谢,

DS

#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;

class fName
{
    std::string d_AvifName;  // name of the Avi file
    std::shared_ptr<VideoCapture> d_capture;

public:
    int setAviName(string const &fName);  //sets name in class
    int const GetNumFrames() const;
};


// functions: --------------------------------------------------

int fName::setAviName(std::string const &fName)
{  //sets AVI name in class and opens video stream

    VideoCapture d_capture(fName);

    if(!d_capture.isOpened()){  // check if succeeded
        d_AvifName = "No AVI selected";
        return (-1);
    }
    else{
        d_AvifName = fName;
        return(1);
    }

}

int const fName::GetNumFrames() const
{
    cout << d_capture->get(CV_CAP_PROP_FRAME_COUNT) << endl;
    return d_capture->get(CV_CAP_PROP_FRAME_COUNT);
};


int main(int argc, char *argv[])

{

    fName fAvi;

    int IsOK = fAvi.setAviName("/Users/jvandereb/Movies/DATA/Verspringen/test_acA1300-30gc-cam5_000035.avi");
    if (IsOK)
    cout << fAvi.GetNumFrames() << endl;

}

1 个答案:

答案 0 :(得分:0)

您的函数fName::setAviName会创建一个名为d_capture的新局部变量,因此未设置全局d_capture

您可以只创建一个非指针实例,而不是使用shared pointer

class fName
{
    std::string d_AvifName;  // name of the Avi file
    VideoCapture d_capture;

public:
    fName(std::string const &fName);
    int setAviName(std::string const &fName);  //sets name in class
    int const GetNumFrames() const;
};

我还建议创建一个真正的构造函数:

fName::fName(std::string const &fName) 
{
    if (!setAviName(fName)) {
       //throw some exception for example
    }
}

然后,您需要更改setAviName,您可以使用open

int fName::setAviName(std::string const &fName)
{  //sets AVI name in class and opens video stream
    if(!d_capture.open(fName)){  // open and check if succeeded
        d_AvifName = "No AVI selected";
        return (-1);
    }
    else{
        d_AvifName = fName;
        return(1);
    }
}

此外,您需要更改GetNumFrames,因为d_capture不再是指针:

int const fName::GetNumFrames() const
{
    cout << d_capture.get(CV_CAP_PROP_FRAME_COUNT) << endl;
    return d_capture.get(CV_CAP_PROP_FRAME_COUNT);
};