IVideoCapture类的目的是什么

时间:2018-04-05 07:29:03

标签: c++ opencv

我正在编写一个类,它将cv::VideoCapture类用于各种目的:处理实时视频流,处理离线图像序列,处理其他一些假数据。我的OpenCV版本是3.4。显然,我想到的第一个解决方案是为我的类提供指向某个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::VideoCapture中所有方法都是虚拟的,我仍然可以覆盖测试,模拟或任何应用程序的默认行为,这很好。但是,出于好奇:我的问题是:cv::IVideoCapture的前瞻性声明的目的是什么?受保护的领域icap的目的是什么?这是什么样的模式?

1 个答案:

答案 0 :(得分:1)

似乎IVideoCapture类在VideoCapture内用作pimpl idiom,同时也是实际的界面。像VideoCapture_IntelPerC这样的类实现它并在VideoCapture中使用。不同之处在于声明为public,但当然我找不到OpenCV用户实际使用此IVideoCapture接口的任何理由。