如何让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
相关产品推荐
相关产品推荐

