From 593b4270610ed53cd9d0317e2292fbfce3068281 Mon Sep 17 00:00:00 2001 From: linyqh Date: Sat, 23 Nov 2024 18:54:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(video=5Fprocessor):=20cpu=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E5=85=B3=E9=94=AE=E5=B8=A7=E5=A4=B1=E8=B4=A5;=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20KMeans=20=E8=81=9A=E7=B1=BB=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加对空镜头帧的检查 - 添加异常捕获,当 KMeans 聚类失败时使用备选方案 - 备选方案:选择镜头中间的帧作为关键帧 -优化代码结构,提高鲁棒性 --- app/utils/video_processor_v2.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/utils/video_processor_v2.py b/app/utils/video_processor_v2.py index 6b59182..0569b5a 100644 --- a/app/utils/video_processor_v2.py +++ b/app/utils/video_processor_v2.py @@ -88,10 +88,21 @@ class VideoProcessor: end = shot_boundaries[i] shot_frames = frames[start:end] + if not shot_frames: + continue + + # 将每一帧转换为灰度图并展平为一维数组 frame_features = np.array([cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY).flatten() for frame in shot_frames]) - kmeans = KMeans(n_clusters=1, random_state=0).fit(frame_features) - center_idx = np.argmin(np.sum((frame_features - kmeans.cluster_centers_[0]) ** 2, axis=1)) + + try: + # 尝试使用 KMeans + kmeans = KMeans(n_clusters=1, random_state=0).fit(frame_features) + center_idx = np.argmin(np.sum((frame_features - kmeans.cluster_centers_[0]) ** 2, axis=1)) + except Exception as e: + logger.warning(f"KMeans 聚类失败,使用备选方案: {str(e)}") + # 备选方案:选择镜头中间的帧作为关键帧 + center_idx = len(shot_frames) // 2 keyframes.append(shot_frames[center_idx]) keyframe_indices.append(start + center_idx)