5

我一直在使用 SimpleCV 来查找要与自动驾驶机器人一起使用的 blob。问题是当我在 SimpleCV 中调用 findBlobs 命令时。当我完全挡住 Kinect 相机的镜头时,PyGame 崩溃并出现以下错误:

致命的 Python 错误:(pygame 降落伞)分段错误

有时它可以工作,有时它只是崩溃,即使镜头没有被阻挡。当我运行它超过大约三十秒时,它几乎总是会崩溃。我已经重新安装并修复了 SimpleCV 中的许多问题,并尝试重新安装 Pygame,但它似乎根本没有帮助。另外,我使用 X-Box kinect 作为我的相机源。我正在使用 Ubuntu 11.04。

这是我的确切代码:

from SimpleCV import *
from SimpleCV.Display import *
from time import sleep
k = Kinect()
dis = Display()

while 1:
    depth = k.getDepth()
    depth = depth.invert()
    depth = depth.erode()
    blobs = depth.findBlobs(threshval=127, minsize=10, maxsize=0)
    if blobs:
        blobs.draw()
    depth.save(dis)
    sleep(0)
4

4 回答 4

5

Kat 在这里,我编写了 SimpleCV blob 库。

在发布 1.1 版本后,我们发现 blob 库存在一些问题。最大的两个是 blob 库将达到 python 最大递归深度并退出。第二个源于实际的底层 OpenCV 包装器,当 blob 制造商检测到没有 blob 时会导致 pygame 错误。

现在的解决方案是使用我们 github repo 的 master 分支中的版本。补丁版本也将在本月晚些时候发布的新 SimpleCV 1.2 版本中提供。如果您想手动修复代码,我在下面粘贴了固定代码段:

在 BlobMaker.py 第 55 行附近

    def extractFromBinary(self,binaryImg,colorImg, minsize = 5, maxsize = -1):
        #fix recursion limit bug
        sys.setrecursionlimit(1000000)

        if (maxsize <= 0):  
        maxsize = colorImg.width * colorImg.height 

       retVal = []
       #fix all black image bug
       test = binaryImg.meanColor()
       if( test[0]==0.00 and test[1]==0.00 and test[2]==0.00):
           return FeatureSet(retVal)


       seq = cv.FindContours( binaryImg._getGrayscaleBitmap(), self.mMemStorage, cv.CV_RETR_TREE, cv.CV_CHAIN_APPROX_SIMPLE)

       retVal = self._extractFromBinary(seq,False,colorImg,minsize,maxsize)
       del seq
       return FeatureSet(retVal)
于 2011-10-10T19:29:24.443 回答
2

Anthony 是这里的 SimpleCV 开发人员之一:您可以尝试更改最后一行:

sleep(0.01)

只是为了看看是否存在某种类型的问题,它不能足够快地处理。我最近升级到 Ubuntu 11.04,我认为我需要解决一些自 10.10 以来出现的 python 错误。

另外,如果您可以将此发布到我们的问题队列中,我将不胜感激:http: //github.com/ingenuitas/SimpleCV/issues

于 2011-10-10T19:09:38.620 回答
0

只需将您的 blob 阈值替换为“-1”即可;我有同样的问题,这解决了它。

于 2012-01-31T10:05:04.563 回答
0

致命的 Python 错误:(pygame 降落伞)分段错误

这意味着一些代码崩溃了,现在你需要调试它来发现问题。我假设您正在学习一些东西;还不如学习如何调试;-)

有时它可以工作,有时它只是崩溃,即使镜头没有被阻挡。当我运行它超过大约三十秒时,它几乎总是会崩溃。

这些是堆损坏或数据竞争的典型症状。

我已经重新安装并修复了 SimpleCV 中的许多问题,并尝试重新安装 Pygame,但似乎没有帮助。

为什么你认为它会?您的问题根本不像安装问题。

所以这就是你要做的:在 Linux 上调试堆损坏问题的工具是 valgrind。像这样运行它:

  valgrind python your-code.py

不幸的是,默认的 Python 安装对 Valgrind 不友好,上面的命令可能会产生很多“未初始化的内存读取”错误。你会想用这个抑制文件来抑制它们中的大多数。

可以专注于包含非 Python 部分(尤其是 SimpleCV)的错误。您正在寻找invalid {read,write} ... N bytes after block ....

如果您发现这样的错误,您可以尝试使用 GDB 进一步调试它,或者将其报告给 SimpleCV 开发人员并希望最好。

如果你没有发现错误,你可以构建一个对 Valgrind 友好的 Python 版本(指令),然后再试一次。

如果上面的运行是 Valgrind-clean,那么你可能会遇到竞争而不是堆损坏。重复ThreadSanitizer

于 2011-10-09T15:11:10.650 回答