You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让cv2.VideoCapture读取视频结束后自动退出循环

解决视频播放完毕自动关闭的问题

问题原因

你的代码仅以cap.isOpened()作为循环条件,即便视频所有帧都读取完成,视频捕获对象仍处于打开状态,不会自动终止循环。你尝试的ret=True判断未生效,是因为没有在循环内对ret为False的情况执行退出逻辑。

修改后的代码

#Video Feed

# Setting up video capture device
# 0 = built-in webcam & 2 = External webcam
# If want to grab a video clip, type the name of video and its file loc within (...)

cap = cv2.VideoCapture(video_path)

# Start the holistic model
# 'Holistic' allows me to access the Holistic estimation model
# '0.6' = 60%

with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:

    # 此处保留你原有的手足口输出方法(若有)
    while cap.isOpened():
        ret, frame = cap.read()
        
        # 新增:判断是否读取到帧,未读取到则退出循环(视频播放完毕)
        if not ret:
            break

        #recoloring it back to BGR b/c it will rerender back to opencv
        image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        image.flags.writeable = False

        results = holistic.process(image)

        #setting image writeable back to true to be able process it
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        #Draw the pose landmarks
        mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
                                 mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=4),
                                 mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2))

        try:
            pose = results.pose_landmarks.landmark
            pose_row = list(np.array([[landmark.x, landmark.y, landmark.z, landmark.visibility] for landmark in pose]).flatten())

            row = pose_row
            row.insert(0, class_name)

            # data is appended to csv. if csv does not exist, new file is created
            with open('Pose_keypoints.csv', mode='a', newline='') as f:
                csv_writer = csv.writer(f, delimiter=',', quotechar='\"', quoting=csv.QUOTE_MINIMAL)
                csv_writer.writerow(row)

        except:
            pass

        cv2.imshow('Training Data Feed', image)

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

cap.release()
cv2.destroyAllWindows()

关键修改点

  • 在读取帧后立即添加if not ret: break,当ret为False时(表示视频已播放完或帧读取失败),直接跳出循环,随后执行cap.release()和cv2.destroyAllWindows()关闭窗口。

内容的提问来源于stack exchange,提问作者user22699858

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:35:41