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