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的GIL
Jan 12 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
python查询mysql,返回json的实例
Mar 26 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
python实现猜单词小游戏
May 22 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
基于python爬取有道翻译过程图解
Mar 31 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
python map比for循环快在哪
Sep 21 Python
Python学习之异常中的finally使用详解
Mar 16 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 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php array的学习笔记
2012/05/16 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
jQuery cdn使用介绍
2013/05/08 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
python中类的一些方法分析
2014/09/25 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
python占位符输入方式实例
2019/05/27 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Python爬虫爬取杭州24时温度并展示操作示例
2020/03/27 Python
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
公司人力资源的自我评价
2014/01/02 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
企业业务员岗位职责
2014/03/14 职场文书
工作分析计划书
2014/04/30 职场文书
鼓舞士气的口号
2014/06/16 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
装修安全责任协议书
2016/03/22 职场文书
python创建字典及相关管理操作
2022/04/13 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers