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中实现参数类型检查的简单方法
Apr 21 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python 文件操作删除某行的实例
Sep 04 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
基于matplotlib xticks用法详解
Apr 16 Python
django创建超级用户时指定添加其它字段方式
May 14 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
jquery随意添加移除html的实现代码
2011/06/21 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
会话Bean的种类
2013/11/07 面试题
本科毕业生的求职信范文
2013/11/20 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
工作决心书
2014/03/11 职场文书
安全责任书范本
2014/04/15 职场文书
大学生新学期计划书
2014/04/28 职场文书
环保公益策划方案
2014/08/15 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
财务整改报告范文
2014/11/05 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
五年级作文之劳动作文
2019/11/12 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL