远程视频监控与运动目标检测

本来是一次网络编程课的大作业,在做的过程中发现了蛮多问题,之后也一一调试完成,总的来说并不复杂,但也学到蛮多东西的,所以打算放上来

目的

随着图像处理技术和无线通信技术的发展,人们对视频监控的效果提出了更高的要求,智能监控以其实时性和智能性展现了其广阔的应用前景,越来越受到人们的重视。运动目标的检测是视频智能处理与分析的关键,也是其他后续处理的基础,本实验使用了背景减除法作为检测算法,设计了一个智能监控系统,利用OpenCv技术实现了系统各个模块的功能。新增的运动物体检测算法,给原来功能单一的监控系统带来了新的应用价值。如若推广到实际工作与生活中,会大大提高监控系统的安防性能,给用户带来最大限度的可靠性。

实现方法

python
平台:Jupyter Notebook
第三方库:cv2、numpy、socket等

目标检测模块BackgroundSubtractor

运动目标检测——OpenCV基于KNN的背景减除算法
背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。对于图像某个位置的新像素值:与该像素值历史信息(包括前几帧的像素值和像素点是前景还是背景的判断)比较,如果像素值之间的差别在指定阈值内,则认为新像素值与该历史信息是匹配的,是“潜在的”一类;所有历史信息比较完毕后,如果与历史信息匹配的次数超过了设定阈值,那么:(1)新像素点被归为“潜在背景点”(2)如果被匹配的历史信息中属于背景的点个数超过设定阈值,那么新的像素点就被归为背景点将新像素点根据一定规则保存到历史信息中。通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。

OpenCV中的的BackgroundSubtractor类提供了这些现代的背景分割算法,使得检测效果相比传统方法更为准确与灵活。将得到的图像逐帧进行处理,进行灰度化以及高斯模糊化。遍历每一帧并计算与历史帧的区别,进行二值化和膨胀等操作,查找轮廓并进行轮廓筛选,最后判定该区域是否为运动物体所在区域,若是在原图像上画出轮廓。

通信模块Socket

Socket支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

代码

服务器端import socketimport structimport threadingimport cv2import numpyimport pygameclass Server:def __init__(self):# 设置tcp服务端的socketself.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置重复使用self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定地址和端口self.server.bind(('127.0.0.1', 11000))self.server.listen(128)def run(self):while True:print('等待客户端连接')# 等待客户端连接client, addr = self.server.accept()ProcessClient(client).start()class ProcessClient(threading.Thread):def __init__(self, client):super().__init__()self.client = client# 创建一个窗口#self.screen = pygame.display.set_mode((640, 480), 0, 32)def run(self):       fourcc = cv2.VideoWriter_fourcc(*'XVID')out = cv2.VideoWriter('E:\output.avi',fourcc,30,(640,480))while True:data = self.client.recv(8)if not data:break# 图片的长度 图片的宽高length, width, height = struct.unpack('ihh', data)imgg = b''  # 存放最终的图片数据while length:# 接收图片temp_size = self.client.recv(length)length -= len(temp_size)  # 每次减去收到的数据大小imgg += temp_size  # 每次收到的数据存到img里# 把二进制数据还原data = numpy.fromstring(imgg, dtype='uint8')# 还原成矩阵数据image = cv2.imdecode(data, cv2.IMREAD_UNCHANGED)#cv2.imshow('win1', image) out.write(image)key = cv2.waitKey(60) & 0xffif key == 27:   # 按下ESC时,退出breakout.release()cv2.destroyAllWindows()if __name__ == '__main__':server = Server()server.run()

检测物体

import cv2
import numpy as npknn = cv2.createBackgroundSubtractorKNN(detectShadows = True) #创建KNN接口
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (20,12))
camera = cv2.VideoCapture("E:\output.avi")def drawCnt(fn, cnt):if cv2.contourArea(cnt) > 1400:(x, y, w, h) = cv2.boundingRect(cnt)cv2.rectangle(fn, (x, y), (x + w, y + h), (255, 255, 0), 2)
while True:ret, frame = camera.read()if not ret:breakfg = knn.apply(frame.copy()) #计算了前景掩码fg_bgr = cv2.cvtColor(fg, cv2.COLOR_GRAY2BGR)  #进行色彩转换bw_and = cv2.bitwise_and(fg_bgr, frame)draw = cv2.cvtColor(bw_and, cv2.COLOR_BGR2GRAY)draw = cv2.GaussianBlur(draw, (21, 21), 0)draw = cv2.threshold(draw, 20, 255, cv2.THRESH_BINARY)[1]  #二值化操作draw = cv2.dilate(draw, es, iterations = 2)contours, hierarchy = cv2.findContours(draw.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:drawCnt(frame, c)cv2.imshow("motion detection", frame)if cv2.waitKey(int(1000 / 12)) & 0xff == ord("q"):break
camera.release()
cv2.destroyAllWindows()

客户端
测试的时候只在自己的电脑上进行,所以用了回环接口127.0.0.1,如果有多台设备就把ip那里改掉

import socket
import struct
import time
import traceback
import cv2
import numpyclass Client(object):def __init__(self, addr_port=('127.0.0.1', 11000)):# 连接的服务器的地址# 连接的服务器的端口self.addr_port = addr_port# 创建套接字self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 地址端口可以复用self.client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 分辨率self.resolution = (640, 480)def connect(self):"""链接服务器"""try:self.client.connect(self.addr_port)return Trueexcept Exception as e:traceback.print_exc()  print('连接失败')return Falsedef send2server(self):"""读摄像头数据 发送给服务器"""#camera = cv2.VideoCapture('E:\\cut.avi')  # 读取本地视频camera = cv2.VideoCapture(0)  # 摄像头对象print('isOpened:', camera.isOpened())while camera.isOpened():try:# 获取摄像头数据ret, frame = camera.read()# 对每一帧图片做大小处理 和大小的压缩frame = cv2.resize(frame, self.resolution)# 参1图片后缀名 参2 原图片的数据 参3图片质量 0-100 越大越清晰ret, img = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 100])# img 是被压缩后的数据 无法正常显示#print(img)#print('-------------')#print(img.tostring())# 转换为numpy格式数据img_code = numpy.array(img)# 转为二进制数据img = img_code.tostring()# 获取数据长度length = len(img)# 发送的数据  大小 宽 高 图片数据# 数据打包变为二进制# pack方法参数1 指定打包数据的数据大小  i 4字节 h代表2字节all_data = struct.pack('ihh', length, self.resolution[0], self.resolution[1]) + imgself.client.send(all_data)time.sleep(0.01)except:camera.release()  # 释放摄像头traceback.print_exc()returnif __name__ == '__main__':client = Client()if client.connect():client.send2server()

拿了个监控视频来测试,效果还是可以的

总结

cv2中的函数还是非常好用的,但是在传输数据的格式那里,当时写代码的时候出现一些问题,尤其是numpy格式的数据,导致视频图像一直显示不出来,以后会在这部分多加注意。

OpenCV实现远程视频监控与运动目标检测相关推荐

  1. 树莓派:基于flask的远程视频监控

    个人用Django开发的博客已上线,欢迎访问:https://www.zhibibin.com 本文源码下载:https://download.csdn.net/download/bibinGee/1 ...

  2. 远程视频监控智能工业网关

    5G工业智能网关TG463,支持视频数据采集传输,同时具备字符叠加功能,支持5G/4G/wifi/以太网通信方式,丰富协议库实现协议转换数转发上云.4×LAN.1×WLAN.1×RS232(1×RS4 ...

  3. 【解决方案】SkeyeVSS加油站远程视频监控系统建设标准及推广应用方案

    加油站场所属于安全防范重点单位并且是一级防火单位,流动车辆多,人员来往复杂,稍有不慎,易燃易爆油品及作业过程中挥发的油气都可能因打火机.烟头.电气火花.静电等引起火灾.爆炸事故.为了提升人员管理效率, ...

  4. 转 基于H.264的远程视频监控

    基于H.264的远程视频监控  分类: 嵌入式   http://blog.chinaunix.net/uid-26851094-id-3276088.html 有兴趣的留言一起研究     开始做自 ...

  5. FFmpeg的远程视频监控系统编解码

    FFmpeg的远程视频监控系统编解码 2013-05-07 22:29:32|  分类: 默认分类|举报|字号 订阅 FFmpeg的远程视频监控系统编解码 FFmpeg的远程视频监控系统编解码 ? 0 ...

  6. 基于FFmpeg的远程视频监控系统编解码

    摘要:在远程视频监控系统中视频数据的编码传输以及解码显示是一个重要组成部分,通过对FFmpeg的研究学习,考虑采用FFmpeg来实现编解码的方法.远程监控系统由采集发送端和接收处理端组成,采集发送端使 ...

  7. 中小学、幼儿园远程视频监控系统技术方案

    中小学.幼儿园远程视频监控系统技术方案 行业背景 近年来,随着我国教育事业的发展.高校扩招以及中小学合并等趋势,学校规模的扩张伴随着安全防范需求增大,科技的发展也推动着教学手段的更新,除了视频监控防范 ...

  8. 海南关于推荐扬尘监控系统的通知_实时监管!定州对44家混凝土搅拌企业实施远程视频监控...

    点击蓝字关注定州论坛 [联系我们]0312-4173466/微信:dz4173466 [邮箱]kefu@idingzhou.cn 定州论坛:一切皆有定论 市住建局全面开展混凝土搅拌站扬尘治理工作 &q ...

  9. 树莓派使用排线摄像头和远程视频监控

    配置摄像头 更新树莓派的软件 $ sudo apt-get update $ sudo apt-get upgrade 让树莓派启用摄像头支持 1. 在命令行中输入以下命令,打开树莓派配置界面 $ s ...

最新文章

  1. idea缩写快捷键_IDEA快捷键大全 快速页面重构
  2. cpp中sizeof与指针
  3. 如何阻止子元素触发父元素的事件
  4. 如何优化网站结构才促使网站排名“节节高”?
  5. 【Matlab 图像】bwlabel() 连通域及图像分割
  6. 分布式系列文章——Paxos算法原理与推导
  7. vspython版本控制_Python 版本管理
  8. cmakelists语法_CMakeList语法知识
  9. loadrunner学习理论之一
  10. 内置函数与lambda匿名函数
  11. 解决nginx反向代理缓存不起作用的问题
  12. ubuntu linux修改ip地址命令,如何在ubuntu桌面通过命令行,更改ip地址
  13. 前端实现base64解码编码
  14. HDS NAS原理及Storage Pool方案
  15. IDEA添加oracle数据库时不显示数据表
  16. 《2022中国数据智能产业图谱2.0版》重磅发布
  17. python怎样快速下载库_Python如何急速下载第三方库详解
  18. setInterval()与setTimeout() 详细
  19. 消控监控系统 服务器,实验室监控系统设计
  20. pha-1 android,音质提升一劳永逸 体验索尼PHA-1耳放解码一体机

热门文章

  1. python网络爬虫快速下载4K高清壁纸
  2. Elasticsearch学习2 SpringBoot整合 测试复杂检索
  3. 19个相见恨晚的黑客技在线学习网站,你离黑客又近了一步
  4. Linux中的古老缩略语
  5. 【Linux编程】零拷贝之splice( )函数和tee( )函数
  6. python函数**什么意思_python中函数的参数是什么意思
  7. 教你实现windowsxp自动登录大法(转)
  8. 免费计算机网络同传系统,ghost网络同传系统.doc
  9. oracle更新右数第一位,Oracle数据库基本查询语句
  10. 学习C++编程的必备软件