2011-10-08 18 views
5

Ho utilizzato SimpleCV per trovare blob da utilizzare con un robot a guida automatica. Il problema è quando chiamo il comando findBlobs in SimpleCV. Quando ho bloccare completamente la lente della fotocamera Kinect, PyGame si blocca dandomi questo errore:Errore di segmentazione di Pygame quando si utilizza la funzione findBlob della libreria SimpleCV

errore Python Fatal: (pygame paracadute) Segmentation Fault

volte funziona e altre volte appena si blocca, anche quando la lente è sbloccato. Crolla quasi sempre quando lo eseguo per più di una trentina di secondi. Ho reinstallato e risolto molti problemi in SimpleCV e ho provato a reinstallare Pygame e non sembra affatto di aiuto. Inoltre, sto usando X-Box kinect come fonte della mia videocamera. Sto usando Ubuntu 11.04.

Ecco il mio codice esatto:

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) 

risposta

0

Fatal Python error: (pygame parachute) Segmentation Fault

Questo significa che un codice si è schiantato, e ora è necessario eseguire il debug di esso per trovare il problema. Presumo che tu stia imparando qualcosa; potrebbe anche imparare come eseguire il debug ;-)

Sometimes it works and other times it just crashes, even when the lens is unblocked. It will almost always crash when i run it for longer than about thirty seconds.

Questi sono i classici sintomi di danneggiamento dell'heap o di una corsa di dati.

I have re-installed and fixed many problems in SimpleCV and tried re-installing Pygame and it doesn't seem to help.

Perché hai pensato che sarebbe? Il tuo problema non è su tutti sembra un problema di installazione.

Quindi ecco quello che fai: lo strumento per il debug dei problemi di corruzione dell'heap su Linux è valgrind. Eseguire in questo modo:

valgrind python your-code.py 

Purtroppo, l'installazione di default di Python non è Valgrind-friendly, e al di sopra di comando sarà probabilmente produrre un sacco di "memoria non inizializzata leggere" gli errori. Dovrai sopprimerne la maggior parte usando questa soppressione file.

Potrebbe essere possibile concentrarsi su errori che contengono parti non Python (e SimpleCV in particolare). Stai cercando invalid {read,write} ... N bytes after block ....

Se si riscontra un tale errore, è possibile provare a eseguire il debugging ulteriormente con GDB o segnalarlo agli sviluppatori SimpleCV e sperare per il meglio.

Se non si trova l'errore, è possibile creare una versione di Python compatibile con Valgrind (instructions) e riprovare.

Se la corsa precedente è Valgrind-clean, è possibile che si verifichi una corsa anziché un danneggiamento dell'heap. Ripeti con ThreadSanitizer.

2

Anthony uno degli sviluppatori simplecv qui: Puoi provare a cambiare l'ultima riga:

sleep(0.01) 

solo per vedere se c'è qualche tipo di problema in corso in cui non può elaborare abbastanza veloce. Recentemente ho aggiornato a Ubuntu 11.04 e penso che ci siano un paio di bug Python che ho bisogno di schiacciare che sono spuntati dal 10.10.

Anche se si potrebbe inviare questo alla nostra coda di emissione lo apprezzerei: http://github.com/ingenuitas/SimpleCV/issues

5

Kat qui, ho scritto la biblioteca simplecv blob.

Ci sono stati un paio di problemi con la libreria blob che abbiamo trovato dopo aver spedito la versione 1.1. I due grandi erano che la libreria blob avrebbe raggiunto la profondità massima di ricorsione di Python e avrebbe potuto essere salvata. Il secondo deriva dal wrapper OpenCV sottostante e causa l'errore pygame quando non ci sono blob rilevati dal blob maker.

La soluzione al momento è quella di utilizzare la versione presente nel ramo principale del nostro repository github. La versione con patch sarà disponibile anche nella nuova versione di SimpleCV 1.2, prevista per la fine di questo mese. Se si vuole risolvere manualmente il codice che ho incollato lo snippet fisso di seguito:

In BlobMaker.py attorno alla riga 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) 
0

Basta sostituire la soglia blob con "-1"; Ho avuto lo stesso problema e questo l'ha risolto.