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中用has_key()方法查找键是否存在的教程
May 21 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
python中的 zip函数详解及用法举例
Feb 16 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
Python类class参数self原理解析
Nov 19 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php防止sql注入代码实例
2013/12/18 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
PHP pear安装配置教程
2016/05/14 PHP
实现PHP搜索加分页
2016/10/12 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JavaScript多线程详解
2015/08/12 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python探索之Metaclass初步了解
2017/10/28 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
元旦寄语大全
2014/04/10 职场文书
小学教师读书活动总结
2014/07/08 职场文书
八一建军节演讲稿
2014/09/10 职场文书
生日答谢词
2015/01/05 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
python实现三阶魔方还原的示例代码
2021/04/28 Python
分享几个简单MySQL优化小妙招
2022/03/31 MySQL