Laptimer

The lap timer uses a minimalist interface that displays the number of laps completed in red and the last lap time in black.

Code

Just copy the code and let it run! Please note that

cv2.VideoCapture(0)

is used here, i.e., the laptop's internal camera. If you want to use an external USB camera, you must change this to

cv2.VideoCapture(1)
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt
from time import time
import cv2
from ultralytics import YOLO

class DoubleTextDisplay(QWidget):
    def __init__(self):
        super().__init__()
        # GUI
        self.setWindowTitle("YOLO LapTimer")
        self.setMinimumSize(600, 200)


        # labels for lap - numer and time
        self.left_label = QLabel()
        self.right_label = QLabel()
        self.left_label.setStyleSheet("border: 2px solid black; padding: 10px; color: red")
        self.right_label.setStyleSheet("border: 2px solid black; padding: 10px;")
        self.left_label.setFixedWidth(200)
        self.left_label.setFixedWidth(400)
        # large font
        font = QFont("Arial", 200, QFont.Bold)
        self.left_label.setFont(font)
        self.right_label.setFont(font)


        self.left_label.setAlignment(Qt.AlignCenter)
        self.right_label.setAlignment(Qt.AlignCenter)

        # Layout: horizontal
        layout2 = QHBoxLayout()
        layout2.addWidget(self.left_label)
        layout2.addWidget(self.right_label)
        self.setLayout(layout2)
        # Video Capture via OpenCV
        self.cam = cv2.VideoCapture(0)
        # AI Model for Object Detection
        self.model = YOLO("yolo11n_ncnn_model")


    def set_texts(self, left_text, right_text):
        self.left_label.setText(left_text)
        self.right_label.setText(right_text)

    def startlapTimer(self):
        timeold = 0
        lap= 0
        while self.cam.isOpened():
            success, frame = self.cam.read()
            if success:
                # Analyse
                results = self.model.predict(frame, classes=[2, 3, 7, 36], verbose=False)
                # Einzeichnen Bounding Box
                finalframe = results[0].plot()
                if results[0].boxes:
                    t = time()
                    if timeold == 0:
                        timeold = t
                    else:
                        diff = t - timeold
                        if diff > 1:
                            lap+=1
                            diff = round(t - timeold, 2)
                            self.set_texts(str(lap), str(diff))
                        timeold = t

                cv2.imshow("Laptimer", finalframe)
                # press space to exit
                if cv2.waitKey(1) == ord(" "):
                    break
            else:
                print("Something went wrong ...")
                break


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = DoubleTextDisplay()
    window.set_texts("00", "00.00")
    window.show()
    window.startlapTimer()
    sys.exit(app.exec_())

Test

This video shows how the Laptimer works in practice.