Passenger_Reconization / detectMotion.py
sino72's picture
Update detectMotion.py
da1350e
#修改自https://blog.csdn.net/qq_29367075/article/details/122933407
import cv2
import numpy as np
import tempfile
import os
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('Agg')
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mog = cv2.createBackgroundSubtractorMOG2() # 创建混合高斯模型来用于北京建模
def motionDetection(inputPath):
cap = cv2.VideoCapture(inputPath)#从inputPath读入视频
fps = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#获取视频的大小
output_viedo_frame = cv2.VideoWriter()#初始化视频写入
output_viedo_fmask = cv2.VideoWriter()#初始化视频写入
outputPath=tempfile.mkdtemp()#创建输出视频的临时文件夹的路径
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')#视频编码:h264,只有h264格式的mp4文件才能在浏览器直接播放
video_save_path_frame = os.path.join(outputPath,"frame.mp4")#创建输出视频路径
video_save_path_fmask = os.path.join(outputPath,"fmask.mp4")#创建输出视频路径
output_viedo_frame.open(video_save_path_frame , fourcc, fps, size, True)
output_viedo_fmask.open(video_save_path_fmask , fourcc, fps, size, True)
#对每一帧图片进行读取和处理
while True:
ret, frame = cap.read()#将每一帧图片读取到img当中
if frame is None:
print("camera is over...")
break
fmask = mog.apply(frame) # 判断哪些是前景和背景
MORPH_OPEN_1 = cv2.morphologyEx(fmask, cv2.MORPH_OPEN, kernel1) # 开运算,去除噪声和毛刺
contours, _ = cv2.findContours(fmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 只检测外边框
for cont in contours:
# 计算各个轮廓的面积
len = cv2.arcLength(cont, True)
if len > 300: # 去除一些小的噪声点
# 找到一个轮廓
x,y,w,h = cv2.boundingRect(cont)
# 画出这个矩形
cv2.rectangle(frame, (x,y), (x+w, y+h), color=(0,255,0), thickness=3)
fmask=cv2.cvtColor(fmask,cv2.COLOR_BGR2RGB)
#print(fmask)
#image_np = np.squeeze(img.render())#用np.squeeze将输出结果降维
output_viedo_frame.write(frame)#将处理后的图像写入视频
output_viedo_fmask.write(fmask)#将处理后的图像写入视频
output_viedo_frame.release()#释放
output_viedo_fmask.release()#释放
cap.release()#释放
return video_save_path_frame,video_save_path_fmask,video_save_path_frame,video_save_path_fmask
#下面是直方图相关
def image_histogram(img):
plt.close()
fig = plt.figure(figsize=(15,12))
plt.hist(img.ravel(),256, [0, 255]);
return fig
#img = cv2.imread("C:\\Users\\sino\\Pictures\\fan.jpg")
#image_histogram(img)