2011-10-08 14 views
5

Używam SimpleCV do wyszukiwania obiektów typu blob do użytku z robotem samojezdnym. Problem polega na tym, że wywołuję polecenie findBlobs w SimpleCV. Kiedy całkowicie zablokować obiektyw kamery Kinect, Pygame awarii daje mi ten błąd:Pygame Błąd segmentacji podczas korzystania z funkcji biblioteki FindBlob SimpleCV

Błąd krytyczny Python (pygame spadochron) Segmentacja Fault

Czasem to działa, a innym razem po prostu wywala, nawet gdy obiektyw jest odblokowany. To prawie zawsze zawiesza się, gdy uruchomię go na dłużej niż około trzydzieści sekund. Ponownie zainstalowałem i naprawiłem wiele problemów w SimpleCV i próbowałem ponownej instalacji Pygame'a i to nie pomaga w ogóle. Używam również Kinect X-Box jako źródła mojego aparatu. Używam Ubuntu 11.04.

Oto mój dokładny kod:

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) 

Odpowiedz

0

Fatal Python error: (pygame parachute) Segmentation Fault

To oznacza, że ​​część kodu awarii, a teraz trzeba debugowania go znaleźć problem. Zakładam, że czegoś się uczysz; może również nauczyć się debugowania ;-)

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.

To są klasyczne objawy korupcji sterty lub wyścig danych.

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

Dlaczego tak uważasz? Twój problem w ogóle nie wygląda tak, jak w przypadku instalacji.

Oto, co należy zrobić: Narzędzie do debugowania problemów z korupcją sterty w systemie Linux to narzędzie valgrind. Uruchomić go tak:

valgrind python your-code.py 

Niestety domyślnej instalacji Python nie jest Valgrind w obsłudze, a przede polecenia najprawdopodobniej produkować dużo „pamięci niezainicjowane odczytać” błędów. Będziesz chciał tłumić większość z nich przy użyciu tego tłumienia file.

Koncentracja na błędach zawierających części inne niż Python (w szczególności SimpleCV) może być możliwa. Szukasz invalid {read,write} ... N bytes after block ....

Jeśli znajdziesz taki błąd, możesz spróbować go dalej debugować za pomocą GDB lub zgłosić go programistom SimpleCV i mieć nadzieję na najlepsze.

Jeśli nie znajdziesz błędu, możesz utworzyć przyjazną dla Valgrind wersji Pythona (instructions) i spróbować ponownie.

Jeśli powyższy przebieg to Valgrind-clean, możesz mieć wyścig, a nie korupcję sterty. Powtórz z ThreadSanitizer.

2

Anthony jeden z twórców SimpleCV tutaj: można spróbować zmienić ostatni wiersz:

sleep(0.01) 

Wystarczy, aby sprawdzić, czy istnieje jakiś rodzaj emisji dzieje, gdy nie może przetwarzać dość szybko. Niedawno uaktualniłem do wersji Ubuntu 11.04 i myślę, że jest kilka błędów w języku Pythona, które muszę zgrupować, które pojawiły się od 10.10.

Także jeśli można pisać to do naszej kolejki emisyjnej byłbym wdzięczny: http://github.com/ingenuitas/SimpleCV/issues

5

Kat tutaj pisałem bibliotekę SimpleCV blob.

Było kilka problemów z biblioteką BLOB, które znaleźliśmy po dostarczeniu wersji 1.1. Dwa duże były takie, że biblioteka BLOB trafiła w pytona o maksymalną głębokość rekurencji i wyskoczyła z niego. Drugi wywodzi się z rzeczywistej podstawowej owinięcia OpenCV i powoduje błąd pygame, gdy nie wykryto obiektów typu blob przez twórcę obiektów typu blob.

Rozwiązaniem jest teraz użycie wersji, która znajduje się w gałęzi głównej naszego repozytorium github. Ta łatana wersja będzie również dostępna w nowej wersji SimpleCV 1.2, która zostanie udostępniona na później w tym miesiącu. Jeśli chcesz, aby ręcznie naprawić kod mam wklejony stały fragment poniżej:

W BlobMaker.py wokół linii 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

Wystarczy wymienić próg blob „-1”; Miałem ten sam problem i to naprawiło.

Powiązane problemy