基于OpenCV和PyQt5的跳远成果展示程序
近年来,体育运动越来越受到人们的关注,其中跳远是一项备受瞩目的运动项目。为了更好地展示运动员的跳远成果,本文将介绍一种基于OpenCV和PyQt5的跳远成果展示程序实现方法。
本文的跳远成果展示程序主要包括两个部分:一是通过读取视频中的图像,计算运动员的跳跃距离;二是在界面上显示运动员跳跃的视频和跳跃距离结果。下面我们将分别介绍这两个部分的实现方法。
一、计算跳跃距离
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
二、界面显示
程序的界面显示主要通过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)
通过上述方法,我们就可以实现跳远成果展示程序的功能。在使用程序时,我们只需要将视频文件与代码文件放置在同一个目录下,并运行程序即可。在程序运行过程中,我们可以实时地看到运动员跳跃的视频和跳跃距离结果,从而更好地展示运动员的跳跃成果。
三.效果展示
总结
本文介绍了一种基于Python和OpenCV库的跳远成果展示程序实现方法。通过计算视频中运动员的跳跃距离,并在界面上实时显示跳跃视频和跳跃距离结果,可以更好地展示运动员的跳远成果。