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 yield 小结和实例
Apr 25 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
Python及PyCharm下载与安装教程
Nov 18 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
python实现随机漫步算法
Aug 27 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
python3 webp转gif格式的实现示例
Dec 10 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Python post请求实现代码实例
Feb 28 Python
用Python提取PDF表格的方法
Apr 11 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 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中uploaded_files函数使用方法详解
2011/03/09 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
JavaScript Sort 表格排序
2009/10/31 Javascript
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
2018/07/19 Javascript
vue+layui实现select动态加载后台数据的例子
2019/09/20 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
js制作提示框插件
2020/12/24 Javascript
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
python flask实现分页效果
2017/06/27 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
python实现彩色图转换成灰度图
2019/01/15 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
Python新手学习函数默认参数设置
2020/06/03 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
关于母亲节的感言
2014/02/04 职场文书
实验心得体会
2014/09/05 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
经验交流材料格式
2014/12/30 职场文书
端午节寄语2015
2015/03/23 职场文书
导游词之河北白洋淀
2020/01/15 职场文书