opencv 分类白天与夜景视频的方法
opencv 分类白天与夜景视频的方法
最近有个数据需要分类处理,是一批含有白天跟夜晚的视频数据,需要进行区分开来,本文就来实现,感兴趣的可以了解一下
简诉
最近有个数据需要分类处理,是一批含有白天跟夜晚的视频数据,需要进行区分开来,单个视频严格是只有一个场景的,比如说白天整个视频就一定是白天,因为数据量有些大,几千个视频,所以就使用代码简单区分下,最后运行结果还可以,准确率百分之80十多,当然本批数据不用太严格,所以代码区分完全够了。
逻辑
opencv读取视频
视频帧图片转为灰度值图片
检测偏暗元素所占整张图片的比例,大于一定阈值就认为该视频为黑夜。
选取一部分视频进行判断,并不是整个视频跑完。
当这部分视频帧为黑夜占比选取全部视频帧的50%时认为该视频为黑夜环境,移动该视频文件到另外一个文件夹。
结果
最初先测试9个视频,100%分类正确。
在进行多次阈值预设后,选取一个比较合适的阈值进行处理,准确率大概86%左右。
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 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): #把图片转换为灰度图 gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #获取灰度图矩阵的行数和列数 r,c = gray_img.shape[: 2 ] piexs_sum = r * c #整个图的像素个数 #遍历灰度图的所有像素 #灰度值小于60被认为是黑 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 : #若偏暗像素所占比例超过0.6,认为为整体环境黑暗的图片 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秒开始筛选 end_fps = 6 * video_fps #6秒结束 avg_fps = end_fps - start_fps #总共fps video_capture. set (cv2.CAP_PROP_POS_FRAMES, start_fps) #设置视频起点 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]) |
到此这篇关于opencv 分类白天与夜景视频的方法的文章就介绍到这了,更多相关opencv 分类白天与夜景视频内容请搜索脚本之家以前的文章
您可能感兴趣的文章:
python使用opencv按一定间隔截取视频帧
opencv 获取rtsp流媒体视频的实现方法
Python OpenCV获取视频的方法
使用Python opencv实现视频与图片的相互转换
对Python+opencv将图片生成视频的实例详解
python opencv读mp4视频的实例
Python OpenCV读取显示视频的方法示例
Java使用OpenCV3.2实现视频读取与播放
Opencv实现读取摄像头和视频数据
opencv实现读取视频保存视频
opencv3/C++实现视频读取、视频写入
原文链接:https://blog.csdn.net/Cxk___/article/details/111647910