IVideoCapture类的目的是什么

Pta*_*666 7 c++ opencv

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

class MyClass {
public:
    MyClass(std::shared_ptr<SomeInterfaceToVideoCapture> camera);
}
Run Code Online (Sandbox Code Playgroud)

我查看了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));
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

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;
Run Code Online (Sandbox Code Playgroud)

所以,显然这个cv::IVideoCapture界面永远不会定义.但是,在类中的相同标题中cv::VideoCapture有两个受保护的字段:

protected:
    Ptr<CvCapture> cap;
    Ptr<IVideoCapture> icap;
Run Code Online (Sandbox Code Playgroud)

我找不到有关如何使用此icap字段的任何文档.当然,从技术上讲,我可以继承cv::VideoCapture然后有权访问,icap但我没有看到目的.

由于在类中cv::VideoCapture所有方法都是虚拟的,我仍然可以覆盖测试,模拟或任何应用程序的默认行为,这很好.但是,出于好奇:我的问题是:前方声明cv::IVideoCapture的目的是什么,受保护领域的目的是什么icap.这是什么样的模式?

Pta*_*666 1

看起来IVideoCapture类在内部用作pimpl 惯用语VideoCapture,同时也是实际的接口。像这样的类实现它并在内部使用,区别在于它被声明为公共的,但当然我找不到 OpenCV 用户实际使用这个接口的任何理由。VideoCapture_IntelPerCVideoCaptureIVideoCapture