我正在编写一个类,它将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
的目的是什么?这是什么样的模式?
答案 0 :(得分:1)
似乎IVideoCapture
类在VideoCapture
内用作pimpl idiom,同时也是实际的界面。像VideoCapture_IntelPerC
这样的类实现它并在VideoCapture
中使用。不同之处在于声明为public,但当然我找不到OpenCV用户实际使用此IVideoCapture
接口的任何理由。