2017-02-09 1 views
3

저는 라즈베리 파이와 파이썬 둘 다 매우 새롭습니다. 나는 이미지를 분석하는 코드를 작성했지만 치명적인 파이썬 오류가 계속 발생합니다. (파이 게임 낙하산) 분할 오류. 내 프로그램에 보통 15 분에서 1 시간 정도 걸립니다. 내가 읽은 것에서 이것은 일종의 메모리 오버 리치 문제입니다. 나는 내 문제를 해결할 수있는 구체적인 답을 찾지 못했습니다. 여기 내 코드가있다. 도와주세요. 아무도이 문제를 해결하거나 디버깅하는 방법에 대한 조언을 갖고 있습니까?치명적인 파이썬 오류 : (파이 게임 낙하산) 분할 오류

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 ??() 

을 얻을, 내가 얻을 약간 더 많은 정보를 가진 분할 오류 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 시간 동안 일한 다음 두려운 치명적인 파이썬 오류를주었습니다. (파이 게임 낙하산) 분할 결함 – maddmaxamofo

답변

0

이것은 기술적으로 대답이 아니지만 해결 방법이 많습니다. 나는 SimpleCV를 완전히 포기했다. SimpleCV, 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 시간 동안 시험했다. 자주 사진을 찍을 필요가 없다면, 카메라를 멈추고 다음에 필요할 때 다시 초기화 할 수 있습니다. 몇 주 동안 나에게 커다란 문제가 되었기 때문에 이것이 도움이되기를 바랍니다.

관련 문제