2016-03-04 115 views
0

我一直在努力爭取用StereoBM類基於兩個攝像頭輸入饋送到產生差異圖。該類型品種:: StereoBM必須實現繼承純虛方法

我可以創建一個尖銳的變量StereoBM *sbm;但每當我調用一個函數,我提出與發佈版本分割故障。由於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++推動自己。

+0

你能否提供一個能夠重現錯誤的小片段?如何做一個[mcve] – Miki

+0

我已經更新了原始帖子,我試圖使用opencv 3.1.0的代碼將sbm設置爲指針,另一個錯誤是當我定義'StereoBM sbm'時,什麼都沒有否則 代碼編譯,但不運行。 – humroben

+1

您可以定義一個指向SMB的指針,但實際上並沒有創建一個 –

回答

0
StereoBM *sbm; 

您聲明沒有分配對象的指針。

cv::Ptr<cv::StereoBM> sbm = cv::StereoBM::create() - 這是創建StereoBM對象正確的方法。

+0

謝謝,那正是我需要的。我的代碼現在運行,我可以繼續我的項目。我會投票,但我沒有足夠的聲譽。 – humroben

相關問題