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 25 Python
浅谈Python单向链表的实现
Dec 24 Python
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
Python装饰器基础概念与用法详解
Dec 22 Python
python实现图片转字符小工具
Apr 30 Python
使用python动态生成波形曲线的实现
Dec 04 Python
Python二次规划和线性规划使用实例
Dec 09 Python
python next()和iter()函数原理解析
Feb 07 Python
keras用auc做metrics以及早停实例
Jul 02 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
JAVA/JSP学习系列之二
2006/10/09 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
php读取目录所有文件信息dir示例
2014/03/18 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
小程序实现自定义导航栏适配完美版
2019/04/02 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
Python随机数random模块使用指南
2016/09/09 Python
pandas中Timestamp类用法详解
2017/12/11 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
pygame实现非图片按钮效果
2019/10/29 Python
Python如何解除一个装饰器
2020/08/07 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
服装厂厂长职责
2013/12/16 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
关于工作经历的证明书
2014/10/11 职场文书
租房协议书范例
2014/10/14 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
python语言中pandas字符串分割str.split()函数
2022/08/05 Python