c++ - 调用 cv::stereoBM 构造函数时出错

标签 c++ opencv

如果我像这样 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/

相关文章:

c++ - 在一组 27 个浮点值中选择中位数的最快代码 C/C++

c++ - C/C++ 中的宏扩展

c++ - 位图到 mat/2d 数组

ios - 将16位 float 的MTLTexture转换为cv::Mat 32位 float 类型

c++ - 有没有关于如何将包含文件夹和文件的 zip 文件解压缩到某个目录并通过 MiniZip 将它们打包回来的教程?

c++ - QString::endsWith() 不起作用?

opencv - RANSAC相机校准实现

opencv - 如何在opencv中使用GenericIndex类

java - 致命异常 : main java. lang.RuntimeException

C++ 指向类实例的指针