59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
视频显示组件
|
||
用于显示视频帧和检测结果
|
||
"""
|
||
|
||
import cv2
|
||
import numpy as np
|
||
from PyQt5.QtWidgets import QLabel
|
||
from PyQt5.QtCore import Qt
|
||
from PyQt5.QtGui import QImage, QPixmap, QPainter, QPen, QFont
|
||
|
||
class VideoWidget(QLabel):
|
||
"""视频显示组件"""
|
||
|
||
def __init__(self):
|
||
super().__init__()
|
||
self.setMinimumSize(640, 480)
|
||
self.setStyleSheet("border: 1px solid gray; background-color: black;")
|
||
self.setAlignment(Qt.AlignCenter)
|
||
self.setText("视频显示区域\n点击'开始检测'开始")
|
||
self.setScaledContents(True)
|
||
|
||
def update_frame(self, frame):
|
||
"""更新显示帧"""
|
||
if frame is None:
|
||
return
|
||
|
||
# 转换BGR到RGB
|
||
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
||
h, w, ch = rgb_frame.shape
|
||
bytes_per_line = ch * w
|
||
|
||
# 创建QImage
|
||
qt_image = QImage(rgb_frame.data, w, h, bytes_per_line, QImage.Format_RGB888)
|
||
|
||
# 转换为QPixmap并显示
|
||
pixmap = QPixmap.fromImage(qt_image)
|
||
|
||
# 缩放以适应widget大小,保持宽高比
|
||
scaled_pixmap = pixmap.scaled(
|
||
self.size(),
|
||
Qt.KeepAspectRatio,
|
||
Qt.SmoothTransformation
|
||
)
|
||
|
||
self.setPixmap(scaled_pixmap)
|
||
|
||
def paintEvent(self, event):
|
||
"""绘制事件"""
|
||
super().paintEvent(event)
|
||
|
||
# 如果没有图像,显示提示文本
|
||
if not self.pixmap():
|
||
painter = QPainter(self)
|
||
painter.setPen(QPen(Qt.white))
|
||
painter.setFont(QFont("Arial", 16))
|
||
painter.drawText(self.rect(), Qt.AlignCenter, "视频显示区域\n点击'开始检测'开始") |