如果我像这样 decalre 一个 stereoBM 的实例
cv::StereoBM bmState;
编译器抛出错误:
cannot declare field ‘bmState’ to be of abstract type ‘cv::StereoBM’
但是当我声明它时
cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16,21);
然后就可以了。
请解释如何继续使用前一种方法。
最佳答案
恐怕你运气不好,我认为你做不到。根据https://docs.opencv.org/3.4/d9/dba/classcv_1_1StereoBM.html , StereoBM
是一个抽象类,即它的一些成员函数是纯虚的,因此不能直接实例化。
查看 cv::StereoBM::create
的实现https://github.com/opencv/opencv/blob/master/modules/calib3d/src/stereobm.cpp我们可以在cpp文件中看到StereoBM
的非抽象派生类被定义,即StereoBMImpl
.在 create
它的一个实例被分配并作为 Ptr<StereoBM>
返回.现在,我认为您无法访问 StereoBMImpl
即使可以,我也强烈建议不要这样做,文档清楚地规定了使用该类的方法,如果您希望代码可移植,您应该坚持使用。
最终这是您必须接受的设计。如果您能告诉我们为什么您绝对需要使用第一个声明,也许我们可以尝试提供帮助。
有关抽象基类的更多信息,请参阅 https://en.cppreference.com/w/cpp/language/abstract_class
关于c++ - 调用 cv::stereoBM 构造函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57234187/