opencv 分類白天與夜景視頻的方法
簡(jiǎn)訴
最近有個(gè)數(shù)據(jù)需要分類處理,是一批含有白天跟夜晚的視頻數(shù)據(jù),需要進(jìn)行區(qū)分開(kāi)來(lái),單個(gè)視頻嚴(yán)格是只有一個(gè)場(chǎng)景的,比如說(shuō)白天整個(gè)視頻就一定是白天,因?yàn)閿?shù)據(jù)量有些大,幾千個(gè)視頻,所以就使用代碼簡(jiǎn)單區(qū)分下,最后運(yùn)行結(jié)果還可以,準(zhǔn)確率百分之80十多,當(dāng)然本批數(shù)據(jù)不用太嚴(yán)格,所以代碼區(qū)分完全夠了。
邏輯
- opencv讀取視頻
- 視頻幀圖片轉(zhuǎn)為灰度值圖片
- 檢測(cè)偏暗元素所占整張圖片的比例,大于一定閾值就認(rèn)為該視頻為黑夜。
- 選取一部分視頻進(jìn)行判斷,并不是整個(gè)視頻跑完。
- 當(dāng)這部分視頻幀為黑夜占比選取全部視頻幀的50%時(shí)認(rèn)為該視頻為黑夜環(huán)境,移動(dòng)該視頻文件到另外一個(gè)文件夾。
結(jié)果
最初先測(cè)試9個(gè)視頻,100%分類正確。



在進(jìn)行多次閾值預(yù)設(shè)后,選取一個(gè)比較合適的閾值進(jìn)行處理,準(zhǔn)確率大概86%左右。
源碼
import cv2
import numpy as np
import os,time
import shutil
def GetImgNameByEveryDir(file_dir,videoProperty):
FileNameWithPath = []
FileName = []
FileDir = []
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] in videoProperty:
FileNameWithPath.append(os.path.join(root, file)) # 保存圖片路徑
FileName.append(file) # 保存圖片名稱
FileDir.append(root[len(file_dir):]) # 保存圖片所在文件夾
return FileName,FileNameWithPath,FileDir
def img_to_GRAY(img,pic_path):
#把圖片轉(zhuǎn)換為灰度圖
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#獲取灰度圖矩陣的行數(shù)和列數(shù)
r,c = gray_img.shape[:2]
piexs_sum=r*c #整個(gè)圖的像素個(gè)數(shù)
#遍歷灰度圖的所有像素
#灰度值小于60被認(rèn)為是黑
dark_points = (gray_img < 60)
target_array = gray_img[dark_points]
dark_sum = target_array.size #偏暗的像素
dark_prop=dark_sum/(piexs_sum) #偏暗像素所占比例
if dark_prop >=0.60: #若偏暗像素所占比例超過(guò)0.6,認(rèn)為為整體環(huán)境黑暗的圖片
return 1
else:
return 0
if __name__ =='__main__':
path="C:\\Users\\Administrator\\Desktop\\cut_video"
new_path=path+"\\DarkNight"
if not os.path.exists(new_path):
os.mkdir(new_path)
FileName,FileNameWithPath,FileDir=GetImgNameByEveryDir(path,'.mp4')
for i in range(len(FileNameWithPath)):
video_capture = cv2.VideoCapture(FileNameWithPath[i])
video_size = (int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
total_frames = int(video_capture.get(cv2.CAP_PROP_FRAME_COUNT))
video_fps = int(video_capture.get(5))
start_fps=2*video_fps #從2秒開(kāi)始篩選
end_fps=6*video_fps #6秒結(jié)束
avg_fps=end_fps-start_fps #總共fps
video_capture.set(cv2.CAP_PROP_POS_FRAMES, start_fps) #設(shè)置視頻起點(diǎn)
new_paths=new_path+"\\"+FileName[i]
j=0
count=0
while True:
success,frame = video_capture.read()
if success:
j += 1
if(j>=start_fps and j <= end_fps):
flag=img_to_GRAY(frame,FileNameWithPath[i])
if flag==1:
count+=1
elif(j>end_fps):
break
else:
break
print('%s,%s'%(count,avg_fps))
if count>int(avg_fps*0.48): #大于fps50%為黑夜
print("%s,該視頻為黑夜"%FileNameWithPath[i])
video_capture.release() #釋放讀取的視頻,不占用視頻文件
time.sleep(0.2)
shutil.move(FileNameWithPath[i],new_paths)
else:
print("%s,該視頻為白天"%FileNameWithPath[i])
到此這篇關(guān)于opencv 分類白天與夜景視頻的方法的文章就介紹到這了,更多相關(guān)opencv 分類白天與夜景視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python使用opencv按一定間隔截取視頻幀
- opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法
- Python OpenCV獲取視頻的方法
- 使用Python opencv實(shí)現(xiàn)視頻與圖片的相互轉(zhuǎn)換
- 對(duì)Python+opencv將圖片生成視頻的實(shí)例詳解
- python opencv讀mp4視頻的實(shí)例
- Python OpenCV讀取顯示視頻的方法示例
- Java使用OpenCV3.2實(shí)現(xiàn)視頻讀取與播放
- Opencv實(shí)現(xiàn)讀取攝像頭和視頻數(shù)據(jù)
- opencv實(shí)現(xiàn)讀取視頻保存視頻
- opencv3/C++實(shí)現(xiàn)視頻讀取、視頻寫入
相關(guān)文章
圖文詳解如何利用PyTorch實(shí)現(xiàn)圖像識(shí)別
這篇文章主要給大家介紹了關(guān)于如何利用PyTorch實(shí)現(xiàn)圖像識(shí)別的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PyTorch具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04
python計(jì)算書(shū)頁(yè)碼的統(tǒng)計(jì)數(shù)字問(wèn)題實(shí)例
這篇文章主要介紹了python計(jì)算書(shū)頁(yè)碼的統(tǒng)計(jì)數(shù)字問(wèn)題實(shí)例,對(duì)比2個(gè)實(shí)例講述了數(shù)字統(tǒng)計(jì)的技巧,非常實(shí)用,需要的朋友可以參考下2014-09-09
Python算法練習(xí)之二分查找算法的實(shí)現(xiàn)
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。本文將介紹python如何實(shí)現(xiàn)二分查找算法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2022-06-06
Python實(shí)用工具之實(shí)現(xiàn)PDF轉(zhuǎn)DOCX文檔
pdf2docx作為第三方包,提供了非常優(yōu)秀的功能,僅僅幾行代碼就可以完成PDF轉(zhuǎn)換為DOCX的工作,所以本文就來(lái)利用pdf2docx實(shí)現(xiàn)PDF轉(zhuǎn)DOCX文檔功能吧2023-12-12
python使用pyecharts庫(kù)畫(huà)地圖數(shù)據(jù)可視化的實(shí)現(xiàn)
這篇文章主要介紹了python使用pyecharts庫(kù)畫(huà)地圖數(shù)據(jù)可視化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python使用socket進(jìn)行簡(jiǎn)單網(wǎng)絡(luò)連接的方法
這篇文章主要介紹了python使用socket進(jìn)行簡(jiǎn)單網(wǎng)絡(luò)連接的方法,實(shí)例分析了Python使用socket的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
python kmeans聚類簡(jiǎn)單介紹和實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了python kmeans聚類簡(jiǎn)單介紹和實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02

