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 01 Python
Python获取邮件地址的方法
Jul 10 Python
python杀死一个线程的方法
Sep 06 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
python用插值法绘制平滑曲线
Feb 19 Python
python使用requests.session模拟登录
Aug 09 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
如何解决pycharm调试报错的问题
Aug 06 Python
python包的导入方式总结
Mar 02 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php实现文件下载代码分享
2014/08/19 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
js实现文字滚动效果
2016/03/03 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
JavaScript字符串对象
2017/01/14 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
浅谈angular4生命周期钩子
2017/09/05 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python with用法实例
2015/04/14 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
详解python with 上下文管理器
2020/09/02 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
创先争优宣传标语
2014/10/08 职场文书
维稳承诺书
2015/01/20 职场文书
售后服务承诺函格式
2015/01/21 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js