Python基于OpenCV的异常行为检测系统[源码&部署教程]

1.项目背景

智能视频监控(Intelligent Video Surveillance , IVS)[1.2·3.4是计算机视觉技术5l在安防领域的应用,实现了由“被动监控”到“主动监控”的转变。计算机视觉技术是人工智能系统的一个分支方向,利用摄像机和计算机代替人眼,实现视觉图像信息处理,从而达到识别和理解视频图像内容的目的。智能视频监控借助借助于计算机强大的数据处理功能,依靠计算机视觉等技术,对图像或者监控视频中的内容提取关键信息并快速分析,根据分析的结果对视频监控系统进行反馈处理,从而达到智能识别、理解和处理的效果。总之,智能视频监控以数字化、网络化、智能化为发展方向,实现及时报警,能够大大减轻监控中人工劳动强度,同时可以降低漏报率和误报率,从而使视频监控系统具有较高层次的智能化水平。

2.图片演示

1.png

2.png

3.视频演示

Python基于OpenCV的异常行为检测系统[源码&部署教程]

4.人体行为检测

在医院、公园、广场等儿童和老年人经常出现的监控场景中,人体跌倒检测具有重要的应用价值,可有效的保障监护人群的人身安全,并能够及时处理一些突发状况。本文的行人跌倒检测主要是针对监控人群由于突发情况跌倒后长时间无法站立的情况进行检测并报警处理,倘若行人跌倒后在较短的时间内自行站立,则将不进行报警处理。下图给出了人体正常行走和跌倒时的目标轮廓。
image.png
由可以看出,当监控人体发生跌倒时,最直观的特征是人体的轮廓发生改变并且重心下降。根据前面讲述的常用几何特征的方法,如果只是简单的比较运动目标的长和高,则会因为运动目标远离或靠近摄像头时长和高都会改变,而它们的比值则不会存在这种情况,参考该博客方法通过运动人体目标质心变化率和目标外界矩形框长高比的变化进行跌倒行为检测。具体判断标准如下:
1)运动人体外接矩形长高比P = Height / Width 。当人体跌倒时,提取目标的外接矩形也随之发生改变,最显著的表现是长高比的变化。
image.png
其中,T是阈值,根据实际情况,一般人体正常行走时,长高比P小于1,而跌倒时长高比大于1,所以T一般取值为1。
(2)运动目标质心变化。当人体跌倒时,重心会下移,在图像中以质心形式体现。由于孤立的对待某一个点值不能全面体现人体运动状态,本文采用质心差值分布β值表示运动状态。
image.png
其中,y,表示运动人体第n个质心纵坐标,(>y)/n表示前n个质心纵坐标的平均值,质心的具体计算过程见式(3-2)。当人体正常行走时,质心差值分布β值会处于较小的范围当跌倒时,由于瞬间质心发生突变,β值将会变大。
image.png
如果运动人体满足M和M,均为1的条件,即目标外接矩形框的长高比和质心差值分布β值均小于阈值,则认为发生了跌倒行为。此时,记录产生变化时时的时间t,倘若在At时间内,矩形框的长高比和质心差值分布β值始终小于阈值时,则认为人体无法站立,系统将在t+△t时刻进行报警提示处理。检测算法主要步骤:
⑴利用背景减法提取前景目标,并对其进行二值化和形态学处理。
(2)提取并记录前景目标的运动信息,包括目标长高比和质心坐标。
(3)判断前景目标的长高比是否满足M为1,如果满足,则可继续进行步骤(4)判断,否则,返回步骤(1)。
(4)对前景目标计算质心差值分布β值,如果满足条件M,为1,则判断人体跌倒,否则返回步骤(1)。
(5)记录人体跌倒时间,如果长时间满足条件M为 1,则进行报警提示;如果在较短的时间内人体自行站立,则不进行处理。

5.人体徘徊检测

在实际监控场景中,通常人体徘徊行为属于异常行为,因为现在的监控场合对安全需求较高,例如国家机关、学校、银行和停车场等场合,需要能够对破坏、偷窃等违法行为进行预警处理,而这些违法行为通常与前期徘徊行为有关,因为徘徊行为体现了一个人彷徨犹豫不决、焦灼心理。所以,人体徘徊检测是智能视频监控系统中的关注热点。
参考该博客的方法,人体徘徊的特点可总结为以下几条:
(1)人体运动轨迹在垂直和水平方向上发生多次方向改变。
(2)当前运动人体位置与进入场景时的起始位置的距离不会一直增大或减小,始终存在由
大变小和由小变大的循环变化过程。
(3)运动人体处于场景的时间较长。

6.算法流程图

image.png

7.代码实现

# 执行以下命令:
# python activity_recognition_demo.py --model resnet-34_kinetics.onnx --classes action_recognition_kinetics.txt --input videos/activities.mp4
 
 
from collections import deque
import numpy as np
import argparse
import imutils
import cv2
 
# 构造参数
ap = argparse.ArgumentParser()
ap.add_argument(
    "-m",
    "--model",
    required=True,
    help="path to trained human activity recognition model")
ap.add_argument(
    "-c", "--classes", required=True, help="path to class labels file")
ap.add_argument(
    "-i", "--input", type=str, default="", help="optional path to video file")
args = vars(ap.parse_args())
 
# 类别,样本持续时间(帧数),样本大小(空间尺寸)
CLASSES = open(args["classes"]).read().strip().split("\n")
SAMPLE_DURATION = 16
SAMPLE_SIZE = 112
print("处理中...")
# 创建帧队列
frames = deque(maxlen=SAMPLE_DURATION)
 
# 读取模型
net = cv2.dnn.readNet(args["model"])
# 待检测视频
vs = cv2.VideoCapture(args["input"] if args["input"] else 0)
 
writer = None
# 循环处理视频流
while True:
    # 读取每帧
    (grabbed, frame) = vs.read()
    # 判断视频是否结束
    if not grabbed:
        print("无视频读取...")
        break
    # 调整大小,放入队列中
    frame = imutils.resize(frame, width=640)
    frames.append(frame)
    # 判断是否填充到最大帧数
    if len(frames) < SAMPLE_DURATION:
        continue
    # 队列填充满后继续处理
    blob = cv2.dnn.blobFromImages(
        frames,
        1.0, (SAMPLE_SIZE, SAMPLE_SIZE), (114.7748, 107.7354, 99.4750),
        swapRB=True,
        crop=True)
    blob = np.transpose(blob, (1, 0, 2, 3))
    blob = np.expand_dims(blob, axis=0)
    # 识别预测
    net.setInput(blob)
    outputs = net.forward()
    label = CLASSES[np.argmax(outputs)]
    # 绘制框
    cv2.rectangle(frame, (0, 0), (300, 40), (255, 0, 0), -1)
    cv2.putText(frame, label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                (0, 0, 255), 2)
 
    # cv2.imshow("Activity Recognition", frame)
 
    # 检测是否保存
    if writer is None:
        # 初始化视频写入器
        # fourcc = cv2.VideoWriter_fourcc(*"MJPG")
        fourcc = cv2.VideoWriter_fourcc(*"mp4v")
        writer = cv2.VideoWriter(
            "videos\\test.mp4",
            fourcc, 30, (frame.shape[1], frame.shape[0]), True)
 
    writer.write(frame)
 
    # 按 q 键退出
# key = cv2.waitKey(1) & 0xFF
# if key == ord("q"):
#     break
print("结束...")
writer.release()
vs.release()

8.系统整合

下图完整源码&环境部署视频教程&自定义UI界面
3.png
参考博客《Python基于OpenCV的异常行为检测系统[源码&部署教程]》

9.参考文献

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python基于OpenCV的人脸表情识别系统是一种基于计算机视觉技术的应用,能够自动识别人脸表情并输出对应的情感,具有非常广泛的应用前景。 该系统的核心代码基于Python编程语言,并利用OpenCV图像处理库来实现人脸识别和表情识别的功能。实现流程包括人脸检测、关键点检测、表情分类和输出等步骤。 具体实现过程包括:首先通过OpenCV中的Haar级联检测算法来进行人检测,然后利用dlib库中的68点关键点检测方法,精确地获取人脸中的关键特征点,包括眼睛、鼻子、嘴巴等位置。接下来,使用基于支持向量机(SVM)分类器的机器学习算法,对获取到的人脸表情数据进行训练,比如快乐、悲伤、惊讶等表情。最后,根据输入的图像和识别结果,将对应的情感输出给使用者。 该系统源码很复杂,需要先熟悉Python编程语言、OpenCV图像处理等技术,才能进行有效的开发和维护。此外,由于人脸的复杂性和表情多样性,该系统还需要定期进行模型训练、算法调优和数据更新等工作。 总之,Python基于OpenCV的人脸表情识别系统是一项非常有技术含量和实用价值的应用,能够为很多场景提供智能化解决方案。 ### 回答2: Python基于OpenCV的人脸表情识别系统源码是用于人脸表情识别的程序代码。该程序使用Python编程语言和OpenCV计算机视觉库来构建,可以运行在Windows、Mac OS和Linux等操作系统上。 该程序先通过OpenCV库中的人脸检测算法,以及Haar特征进行人检测,然后将检测到的人脸图像进行处理,提取出图像中的特征点。随后采用深度学习技术中的卷积神经网络(CNN)进行表情分类,将信息传递到卷积神经网络中,由CNN分类器对表情进行判断,并将预测结果进行输出。 该程序源码包括多个文件,其中主要的源码文件是用于实现人脸表情识别的图像处理和分类器模型的文件。同时,还包括一些辅助性文件,用于读取图像、显示结果、测试模型精度等。 该程序可作为实际项目的基础,可以为人脸识别应用提供支持,让系统更加人性化,并且能够识别人脸的情感状态,用户体验更佳。同时,也有助于人工智能领域的深度学习网络的训练和推广,逐步完善人脸识别领域的表情识别技术。 ### 回答3: Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,高度参与人们在现代世界中表达自己的情感,非常适合当前社交媒体以及各种在线活动。这个项目的主要功能是对人脸的表情进行识别和分类,帮助用户了解被拍摄者的情感状态。 从技术角度来说,这个项目主要依靠OpenCV这个强大的开源计算机视觉库。它提供了很多人脸识别以及情感识别的算法和模型,使得这个项目的功能十分强大。用户可通过使用系统的GUI界面,使用电脑自带的摄像头,拍摄照片后可以马上得出照片中的人的表情状态以及预测可能的下一秒表情等。 在实现这个项目之前,需要熟悉Python语言以及 OpenCV库的基本用法。还要具备一定的机器学习和模式识别知识。将各个算法和模型组合在一起,满足各种不同的情况,进行快速且准确的表情识别。最终目的是提供一个高效的、精确率较高的表情识别系统,以支持广大人们的日常活动。 总而言之,Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,它提供的高效、准确、精细的表情识别功能,将深刻影响我们的日常活动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值