2017-11-22 9 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_()) 

私は、エラーの詳細を学ぶためにGBDを使用:

は、ここに私のコードです。これは、出力された:

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 

OKここでコマンドの出力(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」を呼ぶことはありません。これを行うことで、GUIイベントループを開始する前にPythonオブジェクトを削除するようにPythonに依頼しています。その行を削除し、役立つかどうか確認してください。 –

+0

私はちょうどいくつかのものを試しましたが、それは私のコードの中にdel camをもう持っていないので、仕事をしませんでした。 psutilを使ってコード内のメモリ使用量を表示しました。残念ながら、セグメンテーションフォルトはランダムに発生するようです。場合によっては46528832バイトを表示するときに動作し、49455104バイトでは動作しないことがあります。 – Xenoshell

+0

PyQtのバージョン番号(あなたのPyQtがコンパイルされているQT5のバージョン)も提供できますか? –

答えて

0

あなたが終了する前に、カメラをアンロードしようとしましたか?セグメンテーションフォルトは、不正なメモリロケーションを読み書きしようとした場合に発生します。

unloadは、camオブジェクトに割り当てられているすべてのリソースを解放します。

+0

startVidにself.cam.unload()を追加すると)は何もしませんでしたが、今はウィンドウが表示されません。私は明らかに問題を探検し、私は多くの人々が 'del'を使ってコードを解体するのを見た。 – Xenoshell

関連する問題