File size: 2,962 Bytes
f718ab7
 
 
 
 
114c669
 
 
f718ab7
 
 
 
 
 
 
 
 
 
 
 
da1350e
f718ab7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114c669
 
 
 
 
 
f718ab7
114c669
 
f718ab7
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#修改自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)