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分治法定义与应用实例详解
Jul 28 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
python实现按关键字筛选日志文件
Dec 24 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
python将dict中的unicode打印成中文实例
May 11 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
python for循环赋值问题
Jun 03 Python
Python爬取某拍短视频
Jun 11 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代码
2010/07/17 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
Yii快速入门经典教程
2015/12/28 PHP
Yii使用技巧大汇总
2015/12/29 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
php版微信自定义回复功能示例
2016/12/05 PHP
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
针对JavaScript中this指向的简单理解
2016/08/26 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
Python中有几个关键字
2020/06/04 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
小学班主任工作总结2015
2015/04/07 职场文书