Когда я инициализирую объект 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);
Если вы используете версию 3.1, вы получите следующую ошибку:
use of undeclared identifier 'createStereoBM'
Для 3.1 вы можете попробовать:
StereoBM *sbm = StereoBM::create(16, 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);