2017-02-15 93 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