Я работал над использованием класса StereoBM для создания карты диспаратности на основе двух входных каналов камер.
Я могу создать указанную переменную StereoBM *sbm;
но всякий раз, когда я вызываю функцию, у меня возникает ошибка сегментации при выпуске Release. Сборка Debug не будет работать, поскольку она прерывается из-за malloc(): memory corruption
,
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 ++.
StereoBM *sbm;
Вы объявляете указатель без выделения объекта.
cv::Ptr<cv::StereoBM> sbm = cv::StereoBM::create()
— это правильный способ создания объекта StereoBM.
Других решений пока нет …