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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
PyQt5实现简易电子词典
Jun 25 Python
python文件及目录操作代码汇总
Jul 08 Python
带你学习Python如何实现回归树模型
Jul 16 Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
python关于集合的知识案例详解
May 30 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中curl_multi的应用
2013/07/17 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
用js遍历 table的脚本
2008/07/23 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python 连接sqlite及简单操作
2017/06/30 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
python实现对输入的密文加密
2019/03/20 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
百度JavaScript笔试题
2015/01/15 面试题
天鹅的故事教学反思
2014/02/04 职场文书
党员干部承诺书
2014/03/25 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
房展策划方案
2014/06/07 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸