日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视频到图片(每隔几帧保存一张图片)opencv实现

發布時間:2024/1/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频到图片(每隔几帧保存一张图片)opencv实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果想要自動截取一個視頻的圖片,又不想手動暫停截取,那可以試試用opencv自動截取(比如想要自動截取喜歡電影的經典臺詞與圖片)。

背景說明:一個小意外,錄屏視頻沒有聲音,想著把視頻里的PPT截取出來,1個小時的視頻,自己挨個截取太慢了,靈機一動用opencv試試吧。

問題1:剛開始代碼將每幀都進行了截取,發現一共42798幀,太多了,而且截取圖片有很多重復的。

解決:隔幀截取保存,隔多少,暫時是默認了80,效果不錯(可以根據自己的視頻以及效果改動)。(代碼如下)

問題2:能不能讓代碼自己根據圖片差異判斷保存?只留下變化的圖片,

解決:解決見第二個程序。程序最核心的代碼? skimage.measure.compare_ssim(X,Y,...) ?計算兩幅圖像之間的平均結構相似性指數,可參考我的另一個博客https://mp.csdn.net/console/editor/html/109428505

注意:

  • 想要嘗試代碼,配置opencv,pip install -i https://mirrors.aliyun.com/pypi/simple opencv-python==4.1.0.25
    詳情見:https://blog.csdn.net/dujuancao11/article/details/107468687
  • cap = cv2.VideoCapture('2.mp4')??2.mp4改為你的視頻名字
  • 以下代碼只嘗試了MP4類型文件,別的暫時沒有嘗試,有需要再來更新改進吧。
# 視頻分解圖片 # 1 load 2 info 3 parse 4 imshow imwrite import cv2 import os # 獲取一個視頻打開cap 參數1 file name #cap = cv2.VideoCapture("1.mp4") #cv2.VideoCapture(0, cv2.CAP_DSHOW) # 攝像頭截取 cap = cv2.VideoCapture('2.mp4') isOpened = cap.isOpened # 判斷是否打開‘ print(isOpened) # 獲取信息 寬高 n_frame = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) print('總幀數:',n_frame) # 整個視頻的總幀數 fps = cap.get(cv2.CAP_PROP_FPS) # 幀率 每秒展示多少張圖片 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # w height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # h print('幀數、寬度、高度分別為:',fps,width,height) # 幀率 寬 高 i = 0 # 記錄讀取多少幀 frameFrequency = 80 # 每frameFrequency保存一張圖片 while(isOpened):# 結束標志是否讀取到最后一幀if i == n_frame:breakelse:i = i+1(flag,frame) = cap.read() # read方法 讀取每一張 flag是否讀取成功 frame 讀取內容fileName = 'image'+str(i)+'.jpg' # 名字累加# True表示讀取成功 進行·寫入# if 判斷需要有冒號#if flag == True:outPutDirName = './d/' # 設置保存路徑if not os.path.exists(outPutDirName):# 如果文件目錄不存在則創建目錄os.makedirs(outPutDirName)if i % frameFrequency == 0:print(fileName)cv2.imwrite(outPutDirName+fileName,frame,[cv2.IMWRITE_JPEG_QUALITY,100])# 質量控制 100最高 print('end!')

代碼運行結果?

import os import cv2 from skimage.measure import compare_ssim '''相鄰兩個文件比較相似度,相似就把第二個加到新列表(刪除列表)里,然后進行新列表去重,統一刪除。例如:有文件1-10,首先1和2相比較,若相似,則把2加入到新列表里,再接著2和3相比較,若不相似,則繼續進行3和4比較...一直比到最后,然后刪除新列表里的圖片只對于連續圖片(例一個視頻里截下的圖片)準確率也較高,其效率高''' def delete(filename1):os.remove(filename1) if __name__ == '__main__':path = r'./E/' # 文件所在路徑img_path = pathimgs_n = [] # 新建的刪除列表i = 0 # 用來統計刪了第幾張圖片img_files = [os.path.join(rootdir, file) for rootdir, _, files in os.walk(path) for file in files if(file.endswith('.jpg'))]for currIndex, filename in enumerate(img_files):if not os.path.exists(img_files[currIndex]):print('not exist', img_files[currIndex])breakimg = cv2.imread(img_files[currIndex])img1 = cv2.imread(img_files[currIndex + 1])# https://cloud.tencent.com/developer/section/1414961 開發者手冊鏈接# 本程序最核心的代碼# skimage.measure.compare_ssim(X,Y,...)# 計算兩幅圖像之間的平均結構相似性指數ssim = compare_ssim(img, img1, multichannel=True)# 相似度大于0.9就加入刪除列表if ssim > 0.9:imgs_n.append(img_files[currIndex + 1]) # 加入新建刪除列表i = i+1 # 每加入一個就會刪除print(img_files[currIndex], img_files[currIndex + 1], ssim)print('刪除次數', i)# 否則不刪除,給出兩圖片的相似度else:print('small_ssim',img_files[currIndex], img_files[currIndex + 1], ssim)currIndex += 1if currIndex >= len(img_files)-1:breakfor image in imgs_n:delete(image)
  • 運行結果

?可發現共刪除294張圖片

處理前文件夾情況(共403):

?

?

處理后文件夾情況(剩下109)點開檢查發現相似圖片基本刪除,達到目標:

總結

以上是生活随笔為你收集整理的视频到图片(每隔几帧保存一张图片)opencv实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。