2017-02-09 62 views
3

我對覆盆子pi和python都相當陌生。我已經寫了一個代碼來分析圖像,但我不斷收到致命的python錯誤:(pygame parachute)Segmentation Fault。它通常發生在我的程序中15分鐘到1小時之間。從我讀過的內容來看,這通常是某種記憶超越問題。我還沒有找到任何能夠解決我的問題的具體答案。這是我的代碼。請幫忙。有沒有人有任何建議如何解決或調試這個問題?致命python錯誤:(pygame降落傘)分割錯誤

import cv2 
from SimpleCV import Image, Camera 
import time 
import os 
import RPi.GPIO as GPIO 

T = 1 
z = 0 

GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(31, GPIO.OUT) 
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

GPIO.output(31,GPIO.HIGH) 
cam = Camera(prop_set={'width':320, 'height':240}) 
while(T): 

    w = [0 in range(9)] 

    if(GPIO.input(32)): 
     start = 80 
     pixel = 0 
     end = 225 
     time.sleep(0.32) 
     img = cam.getImage() 
     img.save('original.jpg') 
     edges = cv2.imread('original.jpg') 

     edges = cv2.Canny(edges,90,210) 
     print("hola") 
     for y in range (100,160): 
      i = 0 
      first = 0 
      temp = 0 
      last = 0 
      for x in range (start, end): 
       pixel = edges[y,x] 

       if (pixel >=120 and first == 0): 
        first = x 


       if (pixel >=120 and first != 0 and last < x): 
        last = x 

      if last != 0: 
       temp = last - first 
       for x in range(start, end): 
        if ((x <= last) and (x >=first)): 
         edges[y,x] = 140; 

     while(GPIO.input(32)): 
      pass 

我不知道是什麼的大部分意思,但如果我運行(GDB)程序,並做了回溯我得到這個...

(gdb) bt 
#0 0x000835f4 in PyEval_EvalFrameEx() 
#1 0x00081ca4 in PyEval_EvalCodeEx() 
#2 0x000c37c4 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

今天我發現,如果我做的一切都是進口SimpleCV,圖像和攝像頭,然後打開攝像頭和進入無限循環,我仍然得到分割故障

(gdb) bt 
#0 0x00087024 in PyEval_EvalFrameEx() 
#1 0x000840cc in PyEval_EvalFrameEx() 
#2 0x000a4520 in ??() 

如果我使用pygame的拍攝照片,做一個回溯,我得到一個分割故障稍微多一些inf ormation

#0 0x0006de50 in PyErr_Format() 
#1 0x70952ee0 in v412_read_frame() from /usr/lib/python2.7/dist-packages/pygame/_camera.so 
#2 0x7094ede0 in camera_get_image() from /usr/lib/python2.7/dist-packages/pygame/_camera.so 
#3 0x0008360c in PyEval_EvalFrameEx() 
#4 0x00081ca4 in PyEval_EvalCodeEx() 
#5 0x000c37c4 in ??() 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

我發現了gdb的一個新函數。 I型信息線程和我得到...

Id Target ID   Frame 
2 Thread 0x72df9460 (LWP 601) "python2.7" 0x76e3ab80 in poll()at ../sysdeps/unix/syscall-template.S:81 
*1 Thread 0x76ff6000 (LWP 600) "python2.7" 0x0006de50 in PyErr_Format() 

然後,如果我輸入列表我得到這個

1  ../sysdeps/unix/syscall-template.S: No such file or directory 

我相信,星號表示是結束該程序的線程,但我不確定。有人知道該從這裏做什麼嗎?

+0

如果您懷疑存在內存問題,則可以嘗試查看資源監視器(例如top)以查看內存使用情況 – Nullman

+0

我已經查看過,並且它永遠不會超過32%。我想知道如果也許我正在使用的圖書館之一是調用一個遙不可及的地址?我已經消除了它是cv2的可能性,但我相信我需要其他庫才能開始。 – maddmaxamofo

+0

今天,我試着用pygame拍攝並保存圖片,並省略了simpleCV。它工作了大約2個小時,然後給了我可怕的致命Python錯誤:(pygame parachute)分割錯誤 – maddmaxamofo

回答

0

這在技術上不是答案,而是更多的解決方法。我完全放棄了SimpleCV。我不知道在SimpleCV,pygame中是否有錯誤,或者它是否在我的頭上。我發現,如果我使用pygame拍攝照片並每分鐘重新初始化一次,我永遠不會出現分段錯誤。

import cv2 
import numpy as np 
import pygame 
import pygame.camera 

import time 
import os 
import RPi.GPIO as GPIO 

T = 1 
z = 0 
buff = 0 
flag = 0 


pygame.camera.init() 
pygame.camera.list_cameras() 
GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BOARD) 
GPIO.setup(31, GPIO.OUT) 
GPIO.setup(32, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) 

GPIO.output(31,GPIO.HIGH) 

while(T): 

    w = [0 in range(9)] 
    if (flag == 0): 
     print("Ready") 
     flag = 1 


    if (z == 0): 
     z+=1 
     camera = pygame.camera.Camera("/dev/video0",(320,240)) 
     camera.start()   

    if(GPIO.input(32) and (z>=1)): 

     start = 80 
     pixel = 0 
     end = 225 


     time.sleep(0.32) 
     for buff in range(0,5): 
      img = camera.get_image() 

     pygame.image.save(img, "original.jpg") 

     edges = cv2.imread("pic.jpg") 

     edges = cv2.Canny(edges,90,210) 
     np.edges = edges 

     for y in range (100,160): 
      i = 0 
      first = 0 
      temp = 0 
      last = 0 
      for x in range (start, end): 
       pixel = np.edges[y,x] 

       if (pixel >=120 and first == 0): 
        first = x 


       if (pixel >=120 and first != 0 and last < x): 
        last = x 

      if last != 0: 
       temp = last - first 
       for x in range(start, end): 
        if ((x <= last) and (x >=first)): 
         edges[y,x] = 140; 

     z=0; 
     camera.stop() 

     while(GPIO.input(32)): 
      pass 

只要您每分鐘至少拍攝一張照片,它看起來好像不會分段。我已經測試了一次約25小時,另一次測試了12小時。如果您不需要頻繁拍攝照片,則可以在下次需要時停止相機並重新初始化它。我希望這有助於某人,因爲這對我來說是幾個星期的一個大問題。