首页 > 编程语言 >python 检测视频区域是否有变化

python 检测视频区域是否有变化

时间:2023-04-07 09:56:46浏览次数:36  
标签:视频 gray python 检测 frame cv2 datetime fname lwpCV

#!/usr/bin/env python
# coding: utf-8
# @author: sSWans
# @file: main.py
# @time: 2018/1/11 15:54
 
import os
import random
from _datetime import datetime
 
import cv2
 
path = 'd:\\C理论\\ti'
 
 
# 遍历目录下的视频文件
def get_files(fpath):
    files_list = []
    for i in os.listdir(fpath):
        files_list.append(os.path.join(fpath, i))
    return files_list
 
 
# 视频处理
def process(file, fname):
    # camera = cv2.VideoCapture(0)  # 参数0表示第一个摄像头
    camera = cv2.VideoCapture(file)
    # 参数设置,监测矩形区域
    rectangleX = 750  # 矩形最左点x坐标
    rectangleXCols = 340  # 矩形x轴上的长度
    rectangleY = 320  # 矩形最上点y坐标
    rectangleYCols = 30  # 矩形y轴上的长度
    KeyFrame = 17  # 取关键帧的间隔数,根据视频的帧率设置,我的视频是16FPS
    counter = 1  # 取帧计数器
    pre_frame = None  # 总是取视频流前一帧做为背景相对下一帧进行比较
 
    # 判断视频是否打开
    if not camera.isOpened():
        print('视频文件打开失败!')
 
    width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
    print('视频尺寸(高,宽):', height, width)
 
    if rectangleXCols == 0:
        rectangleXCols = width - rectangleX
    if rectangleYCols == 0:
        rectangleYCols = height - rectangleY
    start_time = datetime.now()
    print('{} 开始处理文件: {}'.format(start_time.strftime('%H:%M:%S'), fname))
    while True:
        grabbed, frame_lwpCV = camera.read()  # 读取视频流
        if grabbed:
            if counter % KeyFrame == 0:
                # if not grabbed:
                #     print('{} 完成处理文件: {} 。。。  '.format(datetime.now().strftime('%H:%M:%S'),fname))
                #     break
                gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)  # 转灰度图
                gray_lwpCV = gray_lwpCV[rectangleY:rectangleY + rectangleYCols, rectangleX:rectangleX + rectangleXCols]
                lwpCV_box = cv2.rectangle(frame_lwpCV, (rectangleX, rectangleY),
                                          (rectangleX + rectangleXCols, rectangleY + rectangleYCols), (0, 255, 0),
                                          2)  # 用绿色矩形框显示监测区域
                # cv2.imshow('lwpCVWindow', frame_lwpCV)  # 显示视频播放窗口,开启消耗时间大概是3倍
                gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
                if pre_frame is None:
                    pre_frame = gray_lwpCV
                else:
                    img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
                    thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
                    thresh = cv2.dilate(thresh, None, iterations=2)
                    #image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
                    contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
                    for x in contours:
                        if cv2.contourArea(x) < 1000:  # 设置敏感度
                            continue
                        else:
                            cv2.imwrite(
                                'image/' + fname + '_' + datetime.now().strftime('%H%M%S') + '_' + str(
                                    random.randrange(0, 9999)) + '.jpg',
                                frame_lwpCV)
                            # print("监测到移动物体。。。  ", datetime.now().strftime('%H:%M:%S'))
                            break
                    pre_frame = gray_lwpCV
            counter += 1
            key = cv2.waitKey(1) & 0xFF
            if key == ord('q'):
                break
        else:
            end_time = datetime.now()
            print('{} 完成处理文件: {}  耗时:{}'.format(end_time.strftime('%H:%M:%S'), fname, end_time - start_time))
            break
    camera.release()
    # cv2.destroyAllWindows() #  与上面的imshow对应
 
 
for file in get_files(path):
    fname = file.split('\\')[-1].replace('.mp4', '')
    process(file, fname)

 

标签:视频,gray,python,检测,frame,cv2,datetime,fname,lwpCV
From: https://www.cnblogs.com/xkdn/p/17295009.html

相关文章

  • python中sys模块常用的一些方法
    一、sys模块sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。 sys.argv命令行参数List,第一个元素是程序本身路径sys.modules.keys()返回所有已经导入的模块列表sys.exc_info()获取当前正在处理的异常类,exc_type、exc_value......
  • python-argparse
    argparse模块是Python内置的用于命令项选项与参数解析的模块,argparse模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。使用argparse配置命令行参数时,需要三步:创建命令行解析器对象argparse.ArgumentParser()对象给解析器添加命令行参数add_ar......
  • Qt音视频开发35-左右通道音量计算和音量不同范围值的转换
    一、前言视频文件一般会有两个声音通道及左右声道,值有时候一样有时候不一样,很多场景下我们需要对其分开计算不同的音量值,在QAudioFormat中可以获取具体有几个通道,如果是一个通道,则左右通道值设定一样,计算通道的音量值一般是对所有音量数据转换后累加后进行一个换算即可,在Qt的示例......
  • python_PIL图片拼接,符合需求但不完美!!
    仅能符合需求的图片拼接工具。。。使用第三方包为:importtkinterastkfromtkinterimportEntry,ButtonfromtkinterimportfiledialogfromPILimportImage工具的样子:图片拼接示例首先选择多个需要拼接的图片,然后回自动调整图片的宽度比,纵向拼接 拼接后就是这个样子......
  • Python 异步: 常见问题 Part_1(23)
    动动发财的小手,点个赞吧!本节回答开发人员在Python中使用asyncio时提出的常见问题。1.如何停止任务?我们可以通过asyncio.Task对象上的cancel()方法取消任务。如果任务被取消,cancel()方法返回True,否则返回False。...#cancelthetaskwas_cancelled=task.cancel......
  • M3U8流视频数据爬虫
    HLS技术介绍现在大部分视频客户端都采用HTTPLiveStreaming,而不是直接播放MP4等视频文件(HLS,Apple为了提高流播效率开发的技术)。HLS技术的特点是将流媒体切分为若干【TS片段】(比如几秒一段),然后通过一个【M3U8列表文件】将这些TS片段批量下载供客户端播放器实现实时流式播放。......
  • 每日总结2023/4/6(python实现分型图形设计)
    importrandomimportturtleturtle.speed(100)defke_line(line_,n):ifn==0:turtle.fd(line_)else:line_len=line_//3foriin[0,60,-120,60]:turtle.left(i)ke_line(line_len,n-1)#原始线......
  • Python + edge-tts:一行代码,让你的文本轻松变成语音!
    大家好,我是树先生!今天给大家介绍一个Python库edge-tts,可以在本地轻松将文本转换成语音,非常方便,并且完全免费!先来听一下效果:https://www.bilibili.com/audio/au3843189?type=1怎么样?是不是很熟悉,影视解说中常用开头:这个女人叫小美。。。 edge-tts介绍edge-tts是一个Py......
  • Python ORM Pony SQLite数据库 常用操作
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中SQLite数据库常用操作,及数据增加、删除、修......
  • VideoView简单视频播放
    只是上上手而已的例子。packagecom.chenchen.app;importjava.io.File;importjava.io.FilenameFilter;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importandroid.app.Activity;importandroid.content.Context......