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对Csv文件操作实例代码
May 12 Python
Python列表生成式与生成器操作示例
Aug 01 Python
python语言基本语句用法总结
Jun 11 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
解决在keras中使用model.save()函数保存模型失败的问题
May 21 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
Python使用scapy模块发包收包
May 07 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
Admin generator, filters and I18n
2011/10/06 PHP
yii分页组件用法实例分析
2015/12/28 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
js实现最短的XML格式化工具实例
2015/03/12 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
2016/04/01 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
使用 bootstrap modal遇到的问题小结
2016/11/09 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
Node学习记录之cluster模块
2017/05/31 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
python处理大数字的方法
2015/05/27 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
tensorflow识别自己手写数字
2018/03/14 Python
python编写微信公众号首图思路详解
2019/12/13 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
python二维图制作的实例代码
2020/12/03 Python
行政部总经理岗位职责
2014/01/04 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
技术支持岗位职责
2015/02/13 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android