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的Django框架中获取单个对象数据的简单方法
Jul 17 Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
Python中整数的缓存机制讲解
Feb 16 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
如何查看python关键字
Jan 17 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python实现批量自动整理文件
Mar 16 Python
python实现双链表
May 25 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防止post重复提交数据的简单例子
2014/06/07 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
js word表格动态添加代码
2010/06/07 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
python中学习K-Means和图片压缩
2017/11/20 Python
python实现词法分析器
2019/01/31 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
django云端留言板实例详解
2019/07/22 Python
Python如何输出警告信息
2020/07/30 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
公司道歉信范文
2014/01/09 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
体育课课后反思
2014/04/24 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL