我們手機錄制的視頻一般都是1秒30幀的影像,也有24幀和60幀的,
有時候需要做資料集,需要進行錄制視頻,對影像提取出來,
那么如何提取呢,

我們可以看到一個每秒30幀的小豬佩奇視頻,總時長不到3秒,最后被抽幀圖片數量是74張,
看代碼前,先來提示一下可能出現的錯誤,
當遇到以下報錯:
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-z4706ql7\opencv\modules\highgui\src\window.cpp:1274: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
這個估計是版本沒下載好,刪了重來
pip uninstall opencv-python
然后下載
pip3 install opencv-contrib-python
當然報錯還有可能是路徑帶有中文或空格有時也會報錯,
還有的保存是函式的版本不同,老版本回傳的是三個引數,新版本卻只有兩個引數
比如
contours,heriachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
那么直接上本期代碼
import cv2
import os
if __name__ == "__main__":
vc = cv2.VideoCapture('小豬佩奇.mp4') #讀取需要處理的視頻
if vc.isOpened(): #判讀視頻是否正常打開
print("打開ok")
else:
print("打開失敗,程式退出")
exit(-1) #如果不能正常打開則自動結束程式
savedpath = 'result/' #將生成的圖片保存在result檔案夾下面
isExists = os.path.exists(savedpath) #判斷該存盤圖片的檔案夾是否存在
if not isExists: #如果路徑不存在則創建檔案夾,否則提示檔案夾已存在
os.makedirs(savedpath)
print("創建存盤路徑")
else:
print("路徑已經存在")
c = 1 #設定抽幀圖片的名稱
while True:
ok, frame = vc.read() #按幀讀取視頻,回傳兩個數值,第一個布林值,False為讀取到結尾,第二個是每幀影像
if ok: #如果能正常讀取
cv2.imwrite(savedpath + str(c) + '.jpg', frame) # 保存影像,路徑 加影像
print('完成第'+str(c)+'張圖片的保存') #列印已保存的圖片數量
c = c + 1 #每次命名加1
else:
print("讀取完成") #否則讀取失敗
break
print("結束") #結束視頻處理
vc.release() #需要釋放
如果不想把每一幀都抽出來,比如只想一秒抽一幀的話,可以用以下代碼,加個條件判斷每隔30幀才進行影像抽幀
import cv2
import os
if __name__ == "__main__":
vc = cv2.VideoCapture('小豬佩奇.mp4') #讀取需要處理的視頻
if vc.isOpened(): #判讀視頻是否正常打開
print("打開ok")
else:
print("打開失敗,程式退出")
exit(-1) #如果不能正常打開則自動結束程式
savedpath = 'result/' #將生成的圖片保存在result檔案夾下面
isExists = os.path.exists(savedpath) #判斷該存盤圖片的檔案夾是否存在
if not isExists: #如果路徑不存在則創建檔案夾,否則提示檔案夾已存在
os.makedirs(savedpath)
print("創建存盤路徑")
else:
print("路徑已經存在")
c = 1 #設定抽幀圖片的名稱
i = 1 #設定第幾幀影像
while True:
ok, frame = vc.read() #按幀讀取視頻,回傳兩個數值,第一個布林值,False為讀取到結尾,第二個是每幀影像
if ok: #如果能正常讀取
if i%30 == 0: #判斷是否被30幀取余為0,來計算每隔一秒提取1幀影像
cv2.imwrite(savedpath + str(c) + '.jpg', frame) # 保存影像,路徑 加影像
print('完成第'+str(c)+'張圖片的保存') #列印已保存的圖片數量
c = c + 1 #每次命名加1
i += 1
else:
print("讀取完成") #否則讀取失敗
break
print("結束") #結束視頻處理
vc.release() #需要釋放
最后這個2秒多的視頻只被抽出了兩幀,
有需要寫代碼,或其他需求的可以加扣:334542894
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292278.html
標籤:其他
