私は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?)
あなたはどこにいても「del cam」を呼ぶことはありません。これを行うことで、GUIイベントループを開始する前にPythonオブジェクトを削除するようにPythonに依頼しています。その行を削除し、役立つかどうか確認してください。 –
私はちょうどいくつかのものを試しましたが、それは私のコードの中にdel camをもう持っていないので、仕事をしませんでした。 psutilを使ってコード内のメモリ使用量を表示しました。残念ながら、セグメンテーションフォルトはランダムに発生するようです。場合によっては46528832バイトを表示するときに動作し、49455104バイトでは動作しないことがあります。 – Xenoshell
PyQtのバージョン番号(あなたのPyQtがコンパイルされているQT5のバージョン)も提供できますか? –