提取視頻每一幀存儲圖片
最近在搞視頻檢測問題,在用到將視頻分幀保存為圖片時,圖片可以保存,但是會出現(-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
問題而不能正常運行,在檢查代碼、檢查路徑等措施均無果后,了解了視頻分幀的原理后,才解決了問題,原因是缺少分幀結束的判斷條件,在寫入前,加上:
if frame is None;break
else:
import cv2# 讀取視頻并分幀為圖片
video = cv2.VideoCapture("python/video/video2.mp4")
save_path = "python/img2"
index = 0
if video.isOpened():f = int(video.get(cv2.CAP_PROP_FPS)) # 讀取視頻幀率print("The video's fps is ", f) # 顯示視頻幀率rval, frame = video.read() # 讀取視頻幀
else:rval = False
while rval:print(index)rval,frame = video.read()cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)index += 1
出現報錯的原因很簡單,在使用rval,frame
讀取視頻的幀時,幀圖片保存在frame
對應的索引里。而在寫入圖片時,沒有加入判斷條件,當視頻被分幀結束后,cv2.imread函數
還在將空白信息寫入文件夾,所以會出現報錯,因此,只要在 cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)
代碼前一行加入判斷條件,判斷分幀結束后,停止寫入即可。加入判斷條件:
if frame is None:break
else:
就可以正確導入分幀后的圖片了
正確的完整代碼如下:
import cv2# 讀取視頻并分幀為圖片video = cv2.VideoCapture("python/video/video2.mp4")
save_path = "python/img2"
index = 0
if video.isOpened():f = int(video.get(cv2.CAP_PROP_FPS)) # 讀取視頻幀率print("The video's fps is ", f) # 顯示視頻幀率rval, frame = video.read() # 讀取視頻幀
else:rval = Falsewhile rval:print(index)rval,frame = video.read()if frame is None:breakelse:cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)index += 1
正確輸出分幀后的圖片,并保存在文件夾中:
提取視頻最后一幀存儲圖片
完整代碼:
import cv2# 打開視頻文件
cap = cv2.VideoCapture('python/video/video2.mp4')# 讀取視頻文件中的所有幀
frames = []
while cap.isOpened():ret, frame = cap.read()if not ret:breakframes.append(frame)# 檢查是否有幀可用
if len(frames) > 0:# 提取最后一幀并將其保存為圖像last_frame = frames[-1]cv2.imwrite('python/img/last.jpg', last_frame)print("last picture over")
else:print("錯誤:無法提取任何幀")# 釋放視頻文件句柄
cap.release()
在這個代碼中,我們首先讀取視頻文件中的所有幀,并將它們存儲在一個列表中。然后,我們檢查列表中是否有任何幀可用。如果有,則提取最后一幀并將其保存為圖像。否則,我們打印錯誤消息。
這里要注意,在這個代碼中,我們沒有使用while循環來遍歷所有幀,而是將所有幀讀取到一個列表中。這樣可以確保我們正確地獲取了最后一幀,而不會錯過任何幀。
如果仍然無法提取最后一幀,請確保視頻文件存在并且可讀,并嘗試使用其他視頻文件進行測試。