【问题标题】:Pygame Segmentation error when using the SimpleCV library findBlob function使用 SimpleCV 库 findBlob 函数时出现 Pygame 分割错误
【发布时间】:2011-10-08 20:51:14
【问题描述】:

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

致命的 Python 错误:(pygame parachute) Segmentation Fault

有时它可以工作,有时它只是崩溃,即使镜头没有被挡住。当我运行它超过大约三十秒时,它几乎总是会崩溃。 我已经重新安装并修复了 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)

【问题讨论】:

    标签: python segmentation-fault pygame kinect simplecv


    【解决方案1】:

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

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

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

    在 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)
    

    【讨论】:

      【解决方案2】:

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

      sleep(0.01)
      

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

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

      【讨论】:

        【解决方案3】:

        致命的 Python 错误:(pygame parachute) Segmentation Fault

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

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

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

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

        你为什么认为它会?您的问题一点也不看起来像是安装问题。

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

          valgrind python your-code.py
        

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

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

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2020-05-26
            • 1970-01-01
            • 1970-01-01
            • 2020-04-20
            • 1970-01-01
            • 2022-01-14
            • 2016-08-06
            • 2014-11-17
            • 2020-05-28
            相关资源
            最近更新 更多