opencv 分类白天与夜景视频的方法


Posted in Python onJune 05, 2021

简诉

最近有个数据需要分类处理,是一批含有白天跟夜晚的视频数据,需要进行区分开来,单个视频严格是只有一个场景的,比如说白天整个视频就一定是白天,因为数据量有些大,几千个视频,所以就使用代码简单区分下,最后运行结果还可以,准确率百分之80十多,当然本批数据不用太严格,所以代码区分完全够了。

逻辑

  •  opencv读取视频
  • 视频帧图片转为灰度值图片
  • 检测偏暗元素所占整张图片的比例,大于一定阈值就认为该视频为黑夜。
  • 选取一部分视频进行判断,并不是整个视频跑完。
  • 当这部分视频帧为黑夜占比选取全部视频帧的50%时认为该视频为黑夜环境,移动该视频文件到另外一个文件夹。

结果

最初先测试9个视频,100%分类正确。

opencv 分类白天与夜景视频的方法

opencv 分类白天与夜景视频的方法

opencv 分类白天与夜景视频的方法

在进行多次阈值预设后,选取一个比较合适的阈值进行处理,准确率大概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):
    #把图片转换为灰度图
    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 相关文章推荐
Python字符遍历的艺术
Sep 06 Python
Python translator使用实例
Sep 06 Python
python读取Android permission文件
Nov 01 Python
举例详解Python中threading模块的几个常用方法
Jun 18 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
详解Python之unittest单元测试代码
Jan 24 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python制作图片缩略图
Apr 30 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
python如何变换环境
Jul 21 Python
python如何利用traceback获取详细的异常信息
Jun 05 #Python
Python异常类型以及处理方法汇总
Jun 05 #Python
Python OpenCV 彩色与灰度图像的转换实现
Python深度学习之实现卷积神经网络
python opencv通过4坐标剪裁图片
Jun 05 #Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 #Python
拒绝盗图!教你怎么用python给图片加水印
You might like
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
php实现RSA加密类实例
2015/03/26 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
php7 list()、session及其他模块的修改实例分析
2020/05/25 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
JQuery 常用方法基础教程
2009/02/06 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
Python处理CSV与List的转换方法
2018/04/19 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
《开国大典》教学反思
2014/04/19 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
昆虫记读书笔记
2015/06/26 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
Java 定时任务技术趋势简介
2022/05/04 Java/Android