【问题标题】:StereoBm Opencv function gives an error "object of an abstract class cannot be defined"StereoBm Opencv 函数给出错误“无法定义抽象类的对象”
【发布时间】:2014-11-22 01:44:59
【问题描述】:

当我初始化 StereoBM 对象时,我收到一个错误“无法定义抽象类的对象”。我检查了 calib3d.hpp,发现 StereoBM 是一个抽象类。请提供一个解决方案,如何在 StereoBM 类中定义所有这些功能

cv::Mat leftimg =cv::imread("leftimage.jpg");
cv::Mat rightimg = cv::imread("rightimage.jpg");
cv::Size imagesize = leftimg.size();

cv::Mat g1,g2,disp,disp8;
cv::cvtColor(leftimg,g1,cv::COLOR_BGR2GRAY);
cv::cvtColor(rightimg,g2,cv::COLOR_BGR2GRAY);

cv::StereoBM *sbm;    
sbm->setDisp12MaxDiff(1);
sbm->setSpeckleRange(8);
sbm->setSpeckleWindowSize(0);
sbm->setUniquenessRatio(0);
sbm->setTextureThreshold(507);
sbm->setMinDisparity(-39);
sbm->setPreFilterCap(61);
sbm->setPreFilterSize(5);
sbm->compute(g1,g2,disp);
normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);

cv::imshow("left", leftimg);
cv::imshow("right", rightimg);
cv::imshow("disp", disp8);

【问题讨论】:

  • opencv 版本? (还有类似的指针:sbm.state->preFilterSize = 5; 看起来很可疑
  • opencv 3.0 版,我已经编辑包含正确的代码,我最初编写了错误的代码。任何帮助将不胜感激..
  • Ptr sbm = createStereoBM(16,2); // 否则它会在你使用之前死掉。 (这里需要智能指针)
  • 非常感谢,您的建议解决了我的问题..:) 非常感谢您。

标签: c++ algorithm opencv syntax-error disparity-mapping


【解决方案1】:

如果您使用的是 3.1 版本,您将收到以下错误:

use of undeclared identifier 'createStereoBM'

对于 3.1 你可以试试:

StereoBM *sbm = StereoBM::create(16, 2);

【讨论】:

    【解决方案2】:

    评论中的建议修复了错误,因此我在将其替换为建议后发布了工作代码,以便在遇到类似问题时可以帮助其他人。

    cv::Mat leftimg =cv::imread("leftimage.jpg");
    cv::Mat rightimg = cv::imread("rightimage.jpg");
    cv::Size imagesize = leftimg.size();
    cv::Mat g1,g2,disp,disp8;
    cv::cvtColor(leftimg,g1,cv::COLOR_BGR2GRAY);
    cv::cvtColor(rightimg,g2,cv::COLOR_BGR2GRAY);
    
    cv::StereoBM *sbm=cv::createStereoBM(16,2);    
    sbm->setDisp12MaxDiff(1);
    sbm->setSpeckleRange(8);
    sbm->setSpeckleWindowSize(0);
    sbm->setUniquenessRatio(0);
    sbm->setTextureThreshold(507);
    sbm->setMinDisparity(-39);
    sbm->setPreFilterCap(61);
    sbm->setPreFilterSize(5);
    sbm->compute(g1,g2,disp);
    normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U);
    
    cv::imshow("left", leftimg);
    cv::imshow("right", rightimg);
    cv::imshow("disp", disp8);
    

    【讨论】:

    • 你还记得你试过这个示例代码的哪个opencv版本吗?在3.3.1,我得到这个编译错误:error: ‘createStereoBM’ was not declared in this scope StereoBM *sbm= createStereoBM(16,2);
    • 对于 3.3.1 尝试 StereoBM *sbm = StereoBM::create(16, 2); ,这应该可以解决问题。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2021-11-24
    • 2013-05-13
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多