IVideoCapture 类的用途是什么

What is the purpose of IVideoCapture class

提问人:pptaszni 提问时间:4/5/2018 更新时间:5/8/2018 访问量:393

问:

我正在编写一个类,该类将用于各种目的:处理实时视频流、处理离线图像序列、处理其他一些虚假数据。我的 OpenCV 版本是 3.4。显然,我想到的第一个解决方案是为我的类提供指向某个接口的指针:cv::VideoCapturecv::VideoCapture

class MyClass {
public:
    MyClass(std::shared_ptr<SomeInterfaceToVideoCapture> camera);
}

我查看了 OpenCV 文档,我实际上发现,在标题中确实有一个前向声明(这是接口的标准命名约定)。尽管看起来它实际上并没有继承它,但我还是试了一下:videoio.hppIVideoCapturecv::VideoCapturecv::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::IVideoCapturecv::VideoCapture

protected:
    Ptr<CvCapture> cap;
    Ptr<IVideoCapture> icap;

我找不到任何关于如何使用此字段的文档。当然,从技术上讲,我可以继承然后访问,但我看不出目的。icapcv::VideoCaptureicap

由于在类中所有方法都是虚拟的,因此我仍然可以覆盖测试、模拟或任何应用程序的默认行为,这很好。但是,只是出于好奇:我的问题是:cv::IVideoCapture 的正向声明的目的是什么,受保护字段 icap 的目的是什么。那是什么模式?cv::VideoCapture

C++ OpenCV

评论

1赞 GPPK 4/5/2018
可能有用,它在这里被大量使用
0赞 pptaszni 4/5/2018
谢谢@GPPK。它看起来像 PImpl 成语(几乎)。

答:

1赞 pptaszni 5/8/2018 #1

似乎 class 在里面用作 pimpl 成语,同时又是实际的接口。像 implement it 这样的类并在内部使用,区别在于它被声明为公共的,但当然我找不到任何理由让 OpenCV 用户实际使用这个接口。IVideoCaptureVideoCaptureVideoCapture_IntelPerCVideoCaptureIVideoCapture