2017-02-09 151 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小时。如果您不需要频繁拍摄照片,则可以在下次需要时停止相机并重新初始化它。我希望这有助于某人,因为这对我来说是几个星期的一个大问题。