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常用内置模块之xml模块(详解)
May 23 Python
微信跳一跳自动运行python脚本
Jan 08 Python
python 重定向获取真实url的方法
May 11 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
Python中is和==的区别详解
Nov 15 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
python时间日期操作方法实例小结
Feb 06 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
Django显示可视化图表的实践
May 10 Python
python解析照片拍摄时间进行图片整理
Jul 23 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 和 MySQL 时区的一点总结
2008/03/26 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php实现的双色球算法示例
2017/06/20 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
js获取单选按钮的数据
2006/11/27 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
layui的select联动实现代码
2019/09/28 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
pandas数据处理进阶详解
2019/10/11 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
自我评价范文分享
2014/01/04 职场文书
网络管理员岗位职责
2014/03/17 职场文书
节约能源标语
2014/06/17 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
离婚协议书范本样本
2014/08/19 职场文书
高考1977观后感
2015/06/04 职场文书
干部培训简讯
2015/07/20 职场文书
安全教育的主题班会
2015/08/13 职场文书