2017-02-15 65 views
2

使用這種簡單的獨立演示崩潰。用gcc 6.2,它工作正常{1,1,0}但甩掉這個與data = {1,0,0}CV :: OpenCV中3.2.0 connectedComponentsWithStats有時用gcc 6.2

======= Memory map: ======== 
00400000-00407000 r-xp 00000000 08:01 15214967       /home/doria/build/Examples/c++/OpenCV/Bug/Bug 
00606000-00607000 rw-p 00006000 08:01 15214967       /home/doria/build/Examples/c++/OpenCV/Bug/Bug 
020b2000-0216c000 rw-p 00000000 00:00 0         [heap] 
7f2608000000-7f2608021000 rw-p 00000000 00:00 0 
7f2608021000-7f260c000000 ---p 00000000 00:00 0 
7f260cc1d000-7f260cc24000 r-xp 00000000 08:01 10883576     /lib/x86_64-linux-gnu/librt-2.23.so 
7f260cc24000-7f260ce23000 ---p 00007000 08:01 10883576     /lib/x86_64-linux-gnu/librt-2.23.so 
7f260ce23000-7f260ce24000 r--p 00006000 08:01 10883576     /lib/x86_64-linux-gnu/librt-2.23.so 
7f260ce24000-7f260ce25000 rw-p 00007000 08:01 10883576     /lib/x86_64-linux-gnu/librt-2.23.so 
7f260ce25000-7f260ce28000 r-xp 00000000 08:01 10883446     /lib/x86_64-linux-gnu/libdl-2.23.so 

有什麼想法?

+0

大衛!我想我發現了這個錯誤。我會給算法的作者發一封電子郵件,看看他是否有進一步的見解 – Miki

回答

3

我對臭蟲負責......感嘆。

問題是該算法在圖像上的2x2塊中工作。標籤的最大數量是每塊一個。不幸的是,如果圖像具有奇數行和/或列,則塊的數量估計是錯誤的。因此,要解決這個問題,我們應該做的事情:

const size_t Plength = ((img.rows + 1)/2) * ((img.cols + 1)/2); 

我們將提交一份拉請求OpenCV的這個今天。另外還有一套改進的測試。順便說一下,我們仍然在等待包含算法的並行版本(多核)。 我們已經在11月份提交了一個 pull request的算法的並行版本(多核),該算法也修復了該錯誤。

自2017年6月起,您可以在OpenCV 3.3中找到固定版本。此外,它還包含並行版本。

3

我可以用Visual Studio 2015(vc14 x64)重現此錯誤。

的問題似乎符合352 of connectedcomponents.cpp

//A quick and dirty upper bound for the maximimum number of labels. 
const size_t Plength = img.rows*img.cols/4; 
LabelT *P = (LabelT *)fastMalloc(sizeof(LabelT)* Plength); 

隨着測試圖像,這PLength計算結果爲0

Plength = (3*1)/4 = 0 

所以*P具有零個元素。

然而,這assignement在算法的幾個地方:

P[lunique] = lunique; 

lunique具有價值>0。所以這會導致堆損壞有時

修復應該是提供一個更好的估計上限Plength

+1

我希望我可以給+5 :)今天,這引起了嚴重的頭痛。 –

+0

我同時使用了電子圍欄和valgrind(一次一個),實際上它們都沒有在我指示爲「崩潰」的情況下崩潰。你還會如何追蹤這樣的事情? –

+0

@David我想這個visual studio調試器做得非常好。崩潰位於'P'的'fastFree'附近,所以很清楚要查找什麼 – Miki