提问人:pptaszni 提问时间:4/5/2018 更新时间:5/8/2018 访问量:393
IVideoCapture 类的用途是什么
What is the purpose of IVideoCapture class
问:
我正在编写一个类,该类将用于各种目的:处理实时视频流、处理离线图像序列、处理其他一些虚假数据。我的 OpenCV 版本是 3.4。显然,我想到的第一个解决方案是为我的类提供指向某个接口的指针:cv::VideoCapture
cv::VideoCapture
class MyClass {
public:
MyClass(std::shared_ptr<SomeInterfaceToVideoCapture> camera);
}
我查看了 OpenCV 文档,我实际上发现,在标题中确实有一个前向声明(这是接口的标准命名约定)。尽管看起来它实际上并没有继承它,但我还是试了一下:videoio.hpp
IVideoCapture
cv::VideoCapture
cv::IVideoCapture
class MyClass {
public:
MyClass(std::shared_ptr<cv::IVideoCapture> camera) {
if (camera->isOpened()) {
std::cerr << "VideoCapture device is not working" << std::endl;
}
}
}
// and later in GTest I create the instance like this:
MyClass myCl(new cv::VideoCapture(0));
我得到了错误:
error: invalid use of incomplete type ‘class cv::IVideoCapture’
if (camera->isOpened()) {
/usr/local/include/opencv2/videoio.hpp:581:7: note: forward declaration of ‘class cv::IVideoCapture’
class IVideoCapture;
所以,显然这个接口从来没有定义过。但是,在类的同一标头中,有两个受保护的字段:cv::IVideoCapture
cv::VideoCapture
protected:
Ptr<CvCapture> cap;
Ptr<IVideoCapture> icap;
我找不到任何关于如何使用此字段的文档。当然,从技术上讲,我可以继承然后访问,但我看不出目的。icap
cv::VideoCapture
icap
由于在类中所有方法都是虚拟的,因此我仍然可以覆盖测试、模拟或任何应用程序的默认行为,这很好。但是,只是出于好奇:我的问题是:cv::IVideoCapture
的正向声明的目的是什么,受保护字段 icap
的目的是什么。那是什么模式?cv::VideoCapture
答:
似乎 class 在里面用作 pimpl 成语,同时又是实际的接口。像 implement it 这样的类并在内部使用,区别在于它被声明为公共的,但当然我找不到任何理由让 OpenCV 用户实际使用这个接口。IVideoCapture
VideoCapture
VideoCapture_IntelPerC
VideoCapture
IVideoCapture
评论