OpenCV 및 PyQt5 기반 멀리뛰기 결과 표시 프로그램

OpenCV 및 PyQt5 기반 멀리뛰기 결과 표시 프로그램

최근 몇 년 동안 점점 더 많은 사람들이 스포츠에 관심을 기울이고 있으며 그 중 멀리뛰기는 세간의 이목을 끄는 스포츠입니다. 선수들의 멀리뛰기 결과를 더 잘 표시하기 위해 이 기사에서는 OpenCV 및 PyQt5를 기반으로 멀리뛰기 결과 표시 프로그램을 구현하는 방법을 소개합니다.

본 논문의 멀리뛰기 결과 표시 프로그램은 크게 영상 속 이미지를 읽어 선수의 점프거리를 계산하는 부분과, 선수가 점프하는 영상과 그 결과를 보여주는 부분으로 크게 두 부분으로 구성된다. 인터페이스에서. 아래에서는 이 두 부분의 구현 방법을 각각 소개합니다.

1. 점프 거리 계산

1. 배경 이미지 가져오기

프로그램은 처음에 점프 필드의 배경 이미지를 가져와야 합니다. 점프 거리 계산을 용이하게 하기 위해 배경 이미지를 그레이스케일 이미지로 변환하고 가우시안 블러 처리를 수행해야 합니다.

self.cap = cv2.VideoCapture('跳远3.mp4')
_, self.bg_frame = self.cap.read()
self.bg_frame = cv2.cvtColor(self.bg_frame, cv2.COLOR_BGR2GRAY)
self.bg_frame = cv2.GaussianBlur(self.bg_frame, (21, 21), 0)

2. 비디오 프레임을 읽고 점프 거리를 계산합니다.

프로그램이 비디오 이미지의 각 프레임을 읽을 때 그레이스케일 이미지로 변환하고 가우시안 블러 처리를 수행해야 합니다. 그런 다음 전경 이미지를 배경 빼기와 이진화를 통해 구하고 전경 이미지에서 가장 큰 윤곽을 찾습니다. 마지막으로 가장 큰 윤곽의 타원의 장축 길이를 기준으로 점프 거리를 계산합니다.

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
# 背景减除
diff = cv2.absdiff(self.bg_frame, gray)
thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓并计算跳跃距离
if len(contours) > 0:
    c = max(contours, key=cv2.contourArea)
    cv2.drawContours(frame, [c], 0, (0, 255, 0), 2)
    (x, y), radius = cv2.minEnclosingCircle(c)
    cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 0), 2)
    if len(c) > 4:
        ellipse = cv2.fitEllipse(c)
        cv2.ellipse(frame, ellipse, (0, 255, 0), 2)
        self.distance = ellipse[1][0] * 0.025

2. 인터페이스 표시

프로그램의 인터페이스 디스플레이는 주로 PyQt5 라이브러리를 통해 실현됩니다. 점프 비디오를 표시하기 위해 인터페이스에 QLabel을 추가하고 점프 거리 결과를 표시하기 위해 다른 QLabel을 추가합니다. 동시에 점프 비디오와 점프 거리 결과를 정기적으로 새로 고치기 위해 타이머도 추가해야 합니다.

class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.video = Video()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 1200, 700)
        self.setWindowTitle('Jumping Distance')

        # 添加用于显示视频的QLabel
        self.video_label = QtWidgets.QLabel(self)
        self.video_label.setGeometry(QtCore.QRect(100, 50, 1000, 600))
        self.video_label.setFrameShape(QtWidgets.QFrame.Box)

        # 添加用于显示跳跃距离的QLabel
        self.result_label = QtWidgets.QLabel(self)
        self.result_label.setGeometry(QtCore.QRect(275, 30, 300, 100))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.result_label.setFont(font)
        self.result_label.setAlignment(QtCore.Qt.AlignCenter)
        self.result_label.setObjectName("result_label")

        # 添加一个定时器
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateFrame)
        self.timer.start(1)

타이머가 작동할 때마다 Video 클래스의 readFrame 메서드를 호출하여 비디오 이미지를 가져와 QLabel에 표시합니다. 동시에 점프 거리 결과를 업데이트하고 QLabel에 표시해야 합니다.

def updateFrame(self):
    frame = self.video.readFrame()
    if frame is not None:
        # 将Qt格式的图像显示在QLabel上
        self.video_label.setPixmap(QtGui.QPixmap.fromImage(frame))

        # 在self.result_label上显示跳跃距离结果
        self.result_label.setText("跳跃距离:%.2f 米" % self.video.distance)

위의 방법을 통해 멀리뛰기 결과 표시 프로그램의 기능을 구현할 수 있습니다. 프로그램을 사용할 때 비디오 파일과 코드 파일을 같은 디렉토리에 놓고 프로그램을 실행하기만 하면 됩니다. 프로그램 실행 중에 선수의 점프 영상과 점프 거리 결과를 실시간으로 볼 수 있어 선수의 점프 결과를 더 잘 표시할 수 있습니다.

3. 효과 표시

여기에 이미지 설명 삽입

요약하다

이 기사에서는 Python 및 OpenCV 라이브러리를 기반으로 멀리뛰기 결과 표시 프로그램을 구현하는 방법을 소개합니다. 비디오에서 선수의 점프 거리를 계산하고 인터페이스에서 실시간으로 점프 비디오 및 점프 거리 결과를 표시함으로써 선수의 멀리뛰기 결과를 더 잘 표시할 수 있습니다.

추천

출처blog.csdn.net/qq_46556714/article/details/130830793