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 内置函数complex详解
Oct 23 Python
python基础之入门必看操作
Jul 26 Python
Python装饰器原理与用法分析
Apr 30 Python
详解python之协程gevent模块
Jun 14 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
linux中如何使用python3获取ip地址
Jul 15 Python
Django获取应用下的所有models的例子
Aug 30 Python
python3中numpy函数tile的用法详解
Dec 04 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
PHP7 新增常量
2021/03/09 PHP
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python 内置函数汇总详解
2019/09/16 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
优秀通讯员事迹材料
2014/01/28 职场文书
关于孝道的演讲稿
2014/05/21 职场文书
营销团队口号
2014/06/06 职场文书
2014年团支书工作总结
2014/11/14 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
余世维讲座观后感
2015/06/11 职场文书
读书笔记怎么写
2015/07/01 职场文书
2016年学校招生广告语
2016/01/28 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python
SQL 聚合、分组和排序
2021/11/11 MySQL