硬件:
安卓手机,windows电脑
功能:
*实时监控及预览
*实时实时录像
*实时移动物体监测及预警(支持调整移动物体大小)
*实时移动物体监测拍照(支持调整移动物体大小)
系统结构图
技术拆解图
1 图像采集及推流
Android + yasea app推流
https://github.com/begeekmyfriend/yasea
2 视频流转发服务搭建
nginx服务+RTMP转发插件
http://nginx-win.ecsds.eu/download/
https://github.com/arut/nginx-rtmp-module
3拉流预览
VLC客户端直接拉流
电脑端直接输入rtmp://127.0.0.1:1935/live/stream
手机端输入时换成同局域网的电脑ip地址: rtmp://192.168.0.4:1935/live/stream
4 视频拉流及移动监控拍照,
python IDE PyCharm+Python 3.8.5+ opencv
下载社区版本PyCharm
https://www.jetbrains.com/pycharm/download/?section=windows
Pycharm社区版导入OpenCV(超详细)
https://blog.csdn.net/qq_41998917/article/details/134124685
拉流监控及监控实现:python
Jiankong.py
import os
import cv2
import time
# # 初始化摄像头
# cap = cv2.VideoCapture(0)
# 读取视频
cap = cv2.VideoCapture('rtmp://192.168.30.211:1935/live/stream')
# 读取第一帧
ret, frame1 = cap.read()
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
# 定义矩形结构元素
rectangle_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
while True:
# 读取下一帧
ret, frame2 = cap.read()
if not ret:
break # 如果视频结束,跳出循环
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# 计算两帧的差异
diff = cv2.absdiff(gray1, gray2)
# 二值化以突出差异
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
thresh = cv2.dilate(thresh, rectangle_kernel, iterations=2) # 膨胀操作,使轮廓更清晰
# 找出轮廓
contours,hie= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 识别面积最大的轮廓
for c in contours:
if cv2.contourArea(c) < 1000: # 移动区域侦测,可以调节识别灵敏度
print("移动区域大小1 : " + str(cv2.contourArea(c)))
continue
else:
if contours:
largest_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(largest_contour)
cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2) # 用绿色矩形框出
print("发现移动物体" + str(cv2.contourArea(c)))
#保存照片
# 画出矩形框架,返回值x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
(x, y, w, h) = cv2.boundingRect(c)
# rectangle(原图,(x,y)是矩阵的左上点坐标,(x+w,y+h)是矩阵的右下点坐标,(0,255,0)是画线对应的rgb颜色,2是所画的线的宽度)
cv2.rectangle(frame2, (x, y), (x + w, y + h), (0, 255, 0), 2)
# putText 图片中加入文字
cv2.putText(frame2, "now time: {}".format(str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) ), (10, 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
print("出现目标物,请求核实")
# 保存图像
save_path = 'd:/photos'
if not os.path.exists(save_path):
os.makedirs(save_path)
timeArray = time.localtime()
timeStr = time.strftime("%Y-%m-%d-%H-%M-%S", timeArray)
print("time stamp : "+timeStr)
filename = "d:/photos/" +str(timeStr) + ".jpg"
cv2.imwrite(filename, frame2)
print("saved : "+filename)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 显示结果
thresh_img = cv2.merge([thresh, thresh, thresh])
cv2.imshow('Difference', cv2.hconcat([frame2, thresh_img]))
# 准备下一次迭代
gray1 = gray2
# 按'q'退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
5 视频实时录像
Ffmpeg拉流,定时10秒录像一个
ffmpeg -i rtmp://127.0.0.1:1935/live/stream -c:v copy -f segment -segment_time 10 -reset_timestamps 1 -strftime 1 output_%%Y-%%m-%%d_%%H-%%M-%%S.mp4