C++ StereoBm Opencv函数给出一个错误;“无法定义抽象类的对象”;

C++ StereoBm Opencv函数给出一个错误;“无法定义抽象类的对象”;,c++,algorithm,opencv,syntax-error,disparity-mapping,C++,Algorithm,Opencv,Syntax Error,Disparity Mapping,当我初始化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

当我初始化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);

注释中的建议修复了错误,因此我在用建议替换工作代码后发布了工作代码,以便在出现类似问题时可以帮助其他人

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);

如果您使用的是3.1版,则会出现以下错误:

use of undeclared identifier 'createStereoBM'
对于3.1,您可以尝试:

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

opencv版本?(还有像:
sbm.state->preFilterSize=5;
中的指针看起来有点错误OpenCV 3.0版,我已经编辑了正确的代码,最初我写了错误的代码。如果有任何帮助,我们将不胜感激。..Ptr sbm=createStereoBM(16,2);//否则它将在您可以使用它之前就死了。(您需要这里的智能指针)非常感谢,您的建议解决了我的问题:)我真的很感谢您。您还记得您尝试过这个示例代码的opencv版本吗?在
3.3.1
中,我得到了编译错误:
错误:“createStereoBM”未在此范围内声明StereoBM*sbm=createStereoBM(16,2)