python QThread и pydc1394
Я занимаюсь разработкой приложения для получения изображений. Я использую PyQt4, pydc1394 (оболочка libdc1394 Python для камеры FireWire) на MacOS Sierra, а камера AVT Marlin F131B. Мне удалось написать программу, которая может получать изображения с камеры, однако эта программа ломается через 10 минут (это время может отличаться на разных компьютерах), возвращая ошибку сегментации.
Первоначально я подозревал утечку памяти в pydc1394. Однако когда я запускаю код с деактивированным QThread.emit, код работает очень хорошо. Проблема возникает, когда я пытаюсь подключить главное окно к объекту Qthread.
Мой код прилагается. У вас есть идеи о том, что происходит, пожалуйста?
Спасибо
from PyQt4 import QtGui, QtCore
from pydc1394 import DC1394Library, Camera
from threading import Thread
from datetime import datetime as dt
import time, sys, os, cv2
import numpy as np
class AcquisitionThread(QtCore.QThread):
sig = QtCore.pyqtSignal(object)
def __init__(self,cam):
super(AcquisitionThread,self).__init__()
self._cam = cam
self._running = True
self.start()
print 'acquisition thread initiated'
def run(self):
while self._cam.running and self._running:
frame = self._cam.current_image
timestamp = frame.timestamp
image = np.asarray(frame[:,:])
self.sig.emit(frame)
now_time = str(dt.now())
return
def terminate(self):
self._running = False
print 'acquisition thread terminated'
self.wait()
print "Exited with success"
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow,self).__init__()
self.resize(700,540)
self.move(300,300)
self.setWindowTitle("Camera Acquisition")
self.scene = QtGui.QGraphicsScene(self)
self.view = QtGui.QGraphicsView(self.scene)
self.view.setSizeIncrement(2,2)
self.vbox = QtGui.QVBoxLayout()
self.vbox.addWidget(self.view)
self.setLayout(self.vbox)
#initiate camera
l = DC1394Library()
try:
list_cameras = l.enumerate_cameras()
except:
list_cameras = []
if len(list_cameras) > 0:
print len(list_cameras), "camera(s) found:"
for i,c in enumerate(list_cameras):
print i,"\t",c['guid']
else:
print "No camera was found. Program exiting ..."
sys.exit()
self._cam = Camera(l,guid = l.enumerate_cameras()[0]['guid'])
#start camera
self._cam.start(interactive=True)
print "camera started"
time.sleep(1)
self.acquisitionThread = AcquisitionThread(self._cam)
self.acquisitionThread.sig.connect(self.displayImage)
self.show()
def displayImage(self,frame):
timestamp = frame.timestamp
#print timestamp
now_time = str(dt.now())
print now_time,"\t",timestamp
img = np.asarray(frame[:,:])
h,w = img.shape
pix = QtGui.QPixmap(QtGui.QImage(img.tostring(),w,h,QtGui.QImage.Format_RGB888).rgbSwapped())
self.scene.clear()
self.scene.addPixmap(pix)
#print "done displaying"
def closeEvent(self,event):
self._cam.stop()
print "camera stopped"
self._cam.close()
print "camera closed"
self.acquisitionThread.terminate()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(app.exec_())