OpenCVとPyQt5をベースにした走り幅跳び結果表示プログラム
近年、スポーツへの注目が高まっており、その中でも走り幅跳びは注目度の高いスポーツです。アスリートの走り幅跳びの結果をより良く表示するために、この記事では、OpenCVとPyQt5に基づいて走り幅跳びの結果表示プログラムを実現する方法を紹介します。
本論文の走幅跳び結果表示プログラムは主に動画内の画像を読み取って選手の跳躍距離を計算する部分と、選手が跳んでいる映像と跳躍距離の結果を表示する部分で構成されている。インターフェース上で。以下では、これら 2 つの部分の実装方法をそれぞれ紹介します。
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ライブラリをベースに実現する方法を紹介します。映像内の選手の跳躍距離を計算し、インターフェース上に跳躍映像と跳躍距離の結果をリアルタイムで表示することで、選手の走幅跳びの結果をより良く表示することができる。