#修改自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)