53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from queue import Queue
 | 
						|
import cv2
 | 
						|
from PyQt5.QtCore import (QThread, QTime, QMutex, pyqtSignal, QMutexLocker)
 | 
						|
 | 
						|
from .structures import ThreadStatisticsData
 | 
						|
 | 
						|
 | 
						|
class BaseThread(QThread):
 | 
						|
 | 
						|
    """
 | 
						|
    Base class for all types of threads (capture, processing, stitching, ...,
 | 
						|
    etc). Mainly for collecting statistics of the threads.
 | 
						|
    """
 | 
						|
 | 
						|
    FPS_STAT_QUEUE_LENGTH = 32
 | 
						|
 | 
						|
    update_statistics_gui = pyqtSignal(ThreadStatisticsData)
 | 
						|
 | 
						|
    def __init__(self, parent=None):
 | 
						|
        super(BaseThread, self).__init__(parent)
 | 
						|
        self.init_commons()
 | 
						|
 | 
						|
    def init_commons(self):
 | 
						|
        self.stopped = False
 | 
						|
        self.stop_mutex = QMutex()
 | 
						|
        self.clock = QTime()
 | 
						|
        self.fps = Queue()
 | 
						|
        self.processing_time = 0
 | 
						|
        self.processing_mutex = QMutex()
 | 
						|
        self.fps_sum = 0
 | 
						|
        self.stat_data = ThreadStatisticsData()
 | 
						|
 | 
						|
    def stop(self):
 | 
						|
        with QMutexLocker(self.stop_mutex):
 | 
						|
            self.stopped = True
 | 
						|
 | 
						|
    def update_fps(self, dt):
 | 
						|
        # add instantaneous fps value to queue
 | 
						|
        if dt > 0:
 | 
						|
            self.fps.put(1000 / dt)
 | 
						|
 | 
						|
        # discard redundant items in the fps queue
 | 
						|
        if self.fps.qsize() > self.FPS_STAT_QUEUE_LENGTH:
 | 
						|
            self.fps.get()
 | 
						|
 | 
						|
        # update statistics
 | 
						|
        if self.fps.qsize() == self.FPS_STAT_QUEUE_LENGTH:
 | 
						|
            while not self.fps.empty():
 | 
						|
                self.fps_sum += self.fps.get()
 | 
						|
 | 
						|
            self.stat_data.average_fps = round(self.fps_sum / self.FPS_STAT_QUEUE_LENGTH, 2)
 | 
						|
            self.fps_sum = 0
 |