2017-02-09 22 views
3

Я довольно новичок как в малине pi, так и в python. Я написал код для анализа изображения, но я продолжаю получать фатальную ошибку python: (pygame parachute) Segmentation Fault. Обычно это происходит от 15 минут до часа в моей программе. Из того, что я прочитал, это, как правило, какая-то проблема с избыточной памятью. Я не нашел конкретных ответов, которые смогли решить мою проблему. Вот мой код. Пожалуйста помоги. Кто-нибудь имеет какие-либо советы о том, как исправить или отладить эту проблему?Неустранимая ошибка python: (pygame parachute) Ошибка сегментации

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 и сделать трассировку, я получаю дефект сегментации с немного большим количеством 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. Я печатаю Информация темы, и я получаю ...

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

Если вы подозреваете проблему с памятью, вы можете попробовать посмотреть монитор ресурсов, такой как верхний, чтобы увидеть использование памяти – Nullman

+0

Я посмотрел на это, и он никогда не становится выше 32%. Мне интересно, может быть, одна из библиотек, которые я использую, вызывает адрес, который недоступен? Я исключил возможность, что это cv2, но я считаю, что мне нужны другие библиотеки, чтобы начать. – maddmaxamofo

+0

Сегодня я попытался взять и сохранить изображение с pygame и пропустить simpleCV. Он проработал около 2 часов, а затем дал мне ужасную ошибку Fatal 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 часов на другой. Если вам не нужно часто делать фотографии, вы можете остановить камеру и повторно инициализировать ее в следующий раз, когда это необходимо. Надеюсь, это поможет кому-то, поскольку это была огромная проблема для меня в течение нескольких недель.