2017-11-22 3 views
0

나는 Raspbian과 함께 Raspberry Pi 3 V1.2를 연구 중이다. 내 문제는 때로는 내 코드가 작동하고 (창이 열리 며 카메라 피드가 표시됨) 때로는 오류가 발생한다는 것입니다 (오류는 세그먼트 오류 임). 나는 코드가 가끔씩 만 작동한다는 것을 한번도 경험하지 못했습니다. 나는 컴파일러가 startVid 함수에있을 때 오류가 발생한다는 것을 알고있다. 누구나 아이디어가 있으십니까? 이미 도움을 주셔서 감사합니다.카메라 비디오 피드를 표시하려고하는 세그먼트 오류입니다. PyQt5

import sys 
from PyQt5 import QtCore , QtWidgets, QtGui, QtMultimedia, QtMultimediaWidgets 
from PyQt5.QtCore import QObject, pyqtSignal 
from PyQt5.QtWidgets import QApplication 
from PyQt5.QtMultimedia import QCamera, QCameraInfo, QMediaObject, QCameraViewfinderSettings, QCameraImageCapture 
from PyQt5.QtMultimediaWidgets import QCameraViewfinder 


class Camera(QObject): 
    def __init__(self, parent = QObject()): 
     super(Camera, self).__init__(parent) 
     self.cam = QCamera() 
     self.caminfo = QCameraInfo(self.cam) 
     self.camvfind = QCameraViewfinder() 
     self.camvfindset = QCameraViewfinderSettings() 
     self.cammode = self.cam.CaptureMode(1) 
     self.camimgcap = QCameraImageCapture(self.cam) 

    def iniCamera(self): 
     print(self.caminfo.description()) 
     print(self.caminfo.availableCameras()) 

     if self.cam.isCaptureModeSupported(self.cammode): 
      print("Capturemode supported") 


    def startVid(self): 

     self.camvfind.show() 

     self.cam.setViewfinder(self.camvfind) 

     self.cam.load() 
     self.camvfindset.setResolution(1280,720) 
     #print(self.cam.supportedViewfinderFrameRateRanges(self.camvfind)) 
     self.camvfindset.setMinimumFrameRate(15) 

     self.cam.setCaptureMode(self.cammode) 
     self.cam.start() 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 

    cam = Camera() 

    cam.iniCamera() 

    cam.startVid() 


    sys.exit(app.exec_()) 

내가 오류에 대한 자세한 내용은 강남을 사용 :

여기 내 코드입니다. 이것은 출력했다 :

Starting program: /usr/bin/python3 qt.py 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1". 
[New Thread 0x720a7470 (LWP 20003)] 
[New Thread 0x716ff470 (LWP 20004)] 

** (python3:19975): WARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files 
[New Thread 0x6ff00470 (LWP 20007)] 
[New Thread 0x6f5ff470 (LWP 20008)] 
[New Thread 0x6e6ab470 (LWP 20022)] 
[Thread 0x6e6ab470 (LWP 20022) exited] 
[New Thread 0x6e6ab470 (LWP 20023)] 
[Thread 0x6e6ab470 (LWP 20023) exited] 
Venus USB2.0 Camera 
[<PyQt5.QtMultimedia.QCameraInfo object at 0x72fde030>] 
Capturemode supported 

Thread 1 "python3" received signal SIGSEGV, Segmentation fault. 
0x7344b620 in platform_get_handle() from /opt/vc/lib/libEGL.so 

여기에 확인 명령 (GDB) BT의 출력 :

(gdb) bt 
0 0x733d4620 in platform_get_handle() from /opt/vc/lib/libEGL.so 
1 0x733c9f2c in eglCreateWindowSurface() from /opt/vc/lib/libEGL.so 
2 0x722e7004 in ??() 
    from /usr/lib/arm-linux-gnueabihf/qt5/plugins/xcbglintegrations/libqxcb-egl-integration.so 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 
+0

나는 당신이있는 곳에서'del cam'을 호출하지 않을 것입니다. 이를 통해 Python이 GUI 이벤트 루프를 시작하기 전에 PyQt 객체를 삭제하도록 Python에 요청합니다. 해당 줄을 제거하고 도움이되는지 확인하십시오. –

+0

글쎄, 난 그냥 몇 가지 물건을 시도했지만, 그래서 내가 더 이상 내 코드에서 델 캠을 가지고 일을하지 않았다. psutil을 사용하여 코드에서 메모리 사용량을 표시했습니다. 하지만 슬프게도 세분화 오류는 무작위로 발생하는 것으로 보입니다. 때로는 46528832 바이트를 표시 할 때 작동하고 때로는 49455104 바이트가 나올 때도 있습니다. – Xenoshell

+0

PyQt의 버전 번호를 제공 할 수 있습니까 (모래는 PyQt가 컴파일되는 QT5의 버전입니까)? –

답변

0

당신이 종료하기 전에 카메라를 언로드하려고 했습니까? 세그먼테이션 결함은 불법적 인 메모리 위치를 읽거나 쓰려고 할 때 발생합니다.

언로드하면 cam 객체에 할당 된 모든 리소스가 해제됩니다.

+0

입니다. self.amload()를 startVid) 아무것도하지 않았다. 게다가 지금은 심지어 창이 나타나지 않을 것이다. 나는 분명히 문제를 봤는데, 나는 많은 사람들이'del'을 사용하여 코드를 해체하는 것을 보았다. – Xenoshell

관련 문제