Type cv :: StereoBM必须实现继承的纯虚方法

时间:2016-03-04 12:37:46

标签: c++ opencv virtual stereo-3d disparity-mapping

我一直在努力使用StereoBM类根据两个摄像头输入源生成视差图。

我可以创建一个有针对性的变量StereoBM *sbm;,但每当我调用一个函数时,我都会看到一个带有Release版本的分段错误。由于malloc(): memory corruption而中止,Debug构建将不会运行。

Disparity_Map::Disparity_Map(int rows, int cols, int type) : inputLeft(), inputRight(), greyLeft(), greyRight(), Disparity() {
    inputLeft.create(rows, cols, type);
    inputRight.create(rows, cols, type);

    greyLeft.create(rows, cols, type);
    greyRight.create(rows, cols, type);
}
void Disparity_Map::computeDisparity(){

    cvtColor(inputLeft, greyLeft, CV_BGR2GRAY);
    cvtColor(inputRight, greyRight, CV_BGR2GRAY);

    StereoBM *sbm;

    // This is where the segfault/memory corruption occurs
    sbm->setNumDisparities(112);
    sbm->setBlockSize(9);
    sbm->setPreFilterCap(61);
    sbm->setPreFilterSize(5);
    sbm->setTextureThreshold(500);
    sbm->setSpeckleWindowSize(0);
    sbm->setSpeckleRange(8);
    sbm->setMinDisparity(0);
    sbm->setUniquenessRatio(0);
    sbm->setDisp12MaxDiff(1);

    sbm->compute(greyLeft, greyRight, Disparity);
    normalize(Disparity, Disparity, 0, 255, CV_MINMAX, CV_8U);
}

我不完全确定我上面的错误。在创建非指针变量时,我对所有类的方法都有这个警告:

The type 'cv::StereoBM' must implement the inherited pure virtual method 'cv::StereoMatcher::setSpeckleRange'

我已经包含了标题<opencv2/calib3d/calib3d.hpp>,我确保链接了库,并且我正在运行opencv 3.1.0。

是否有人能够阐明以上所有内容?因为我还在学习OpenCV并通过C ++推动自己。

1 个答案:

答案 0 :(得分:1)

StereoBM *sbm;

您在没有分配对象的情况下声明指针。

cv::Ptr<cv::StereoBM> sbm = cv::StereoBM::create() - 这是创建StereoBM对象的正确方法。