Answer4.py-20170920

# -*- coding: utf-8 -*-
import cv2
import csv
import statistics as sts
import numpy as np
from PIL import  Image

#设计一个类,进行异常值检测
class Detect:
    def __init__(self):
        self.path_read = ''
        self.path_write = ''
        self.filename = ''
        self.dynamic_dataset = []
        self.dynamic_volume = 1000
        self.save_style = 'Orig'#'New'
        self.threshold = 0
        self.safe = 'y'
        self.video_type = 'avi'
        self.process_type = 'KNN'

    def setup(self,path_read,filename,path_write,video_type='avi',process_type='KNN',save_style='Orig',dynamic_volume=1000):
        self.path_read = path_read
        self.path_write = path_write
        self.filename = filename
        self.video_type = video_type
        self.process_type = process_type
        self.save_style = save_style
        self.dynamic_volume = dynamic_volume

    def outlier(self,observ_data):
        if len(self.dynamic_dataset) > 20:
            Upper = max(sts.quantile(self.dynamic_dataset, 0.9),0.0)
            Lower = max(sts.quantile(self.dynamic_dataset, 0.1),0.0)
            Index1 = []
            for data in self.dynamic_dataset:
                if data <= Upper and data >= Lower:
                    Index1.append(0)
                else:
                    Index1.append(1)
            # 数据集中的异常值检测——拉依达法则
            DATA = []
            Count = 0
            for ind in Index1:
                if ind == 0:
                    DATA.append(self.dynamic_dataset[Count])
                Count += 1
            MEAN_ALL = np.mean(DATA)
            Resid = []
            Resid_Square = []
            N = 0
            N1 = 0
            for data in self.dynamic_dataset:
                Resid.append(np.abs(data - MEAN_ALL))
                if Index1[N] == 0:
                    Resid_Square.append((data - MEAN_ALL) * (data - MEAN_ALL))
                    N1 += 1
                N += 1
            SUM = np.sum(Resid_Square)
            S = np.sqrt(SUM / (N1 - 1))
            ##注意,这是本程序中,唯一在程序内部进行调整的参数,可以使用3*S,S/4
            if np.abs(observ_data-MEAN_ALL) >  S/2 :
                #print(3 * S, observ_data, '---------------------')
                self.safe = 'n'
            else:
                self.safe = 'y'
            #判定是否将数据添加进来
            Length_Dataset = len(self.dynamic_dataset)
            if Length_Dataset < self.dynamic_volume:
                self.dynamic_dataset.append(observ_data)
            else:
                self.dynamic_dataset.append(observ_data)
                del self.dynamic_dataset[0]
        else:
            self.dynamic_dataset.append(observ_data)

    def MatrixToImage(self,data):
        data = data
        new_im = Image.fromarray(data.astype(np.uint8))
        return new_im

    def video_process(self):
        Filename_Read = self.path_read + '\\' + self.filename + '.' + self.video_type
        cap = cv2.VideoCapture(Filename_Read)
        # 创建一个5*5的椭圆核
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
        # 创建BackgroundSubtractorMOG2
        if self.process_type == 'KNN':
            fgbg = cv2.createBackgroundSubtractorKNN()
        else:
            fgbg = cv2.createBackgroundSubtractorMOG2()

        # Define the codec and create VideoWriter object
        Filename_Write = self.path_write + '\\' + self.filename + '.avi'
        print(Filename_Write)
        fps = cap.get(cv2.CAP_PROP_FPS)
        size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        out = cv2.VideoWriter(Filename_Write, cv2.VideoWriter_fourcc('I','4','2','0'), fps, size)
        Filename_Write_csv = self.path_write + '\\' + self.filename + '.csv'
        zh_count_write = csv.writer(open(Filename_Write_csv, 'w', newline=''), dialect='excel')
        Process_Order = 0
        ZH_Count = 1
        #处理视频
        while (1):
            ret, frame = cap.read(0)
            if ret == True:
                img_new = frame
                fgmask = fgbg.apply(img_new)
                # 形态学开运算去噪点
                fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
                # 平滑方式去除噪声,
                blured1 = cv2.bilateralFilter(fgmask, 10, 5, 5)
                blured2 = cv2.GaussianBlur(fgmask, (3, 3), 0)
                blured3 = cv2.blur(fgmask, (5, 5))
                blured4 = cv2.medianBlur(fgmask, 5)
                fgmask = blured2
                # 闭运算去噪点
                fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_CLOSE, kernel)
                # 寻找视频中的轮廓
                im, contours, hierarchy = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
                Count_Contour = 0
                Whether_Write = False
                for c in contours:
                    # 计算各轮廓的周长
                    perimeter = cv2.arcLength(c, True)
                    Count_Contour += 1
                    self.outlier(perimeter)
                    if self.safe == 'n':
                        # 找到一个直矩形(不会旋转)
                        x, y, w, h = cv2.boundingRect(c)
                        # 画出这个矩形
                        # cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),-1)#作出填充的矩形
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 1)  # 做矩形框
                        Whether_Write = True
                #截取图片保存
                if Whether_Write == True:
                    Save_Filename = self.path_write + '\\截图\\' + self.filename + '\\' + str(ZH_Count) + '.jpg'
                    Img = self.MatrixToImage(frame)
                    Img.save(Save_Filename)
                    zh_count_write.writerow([ZH_Count])
                print(Count_Contour)
                if self.save_style == 'Orig':
                    out.write(frame)
                else:
                    out.write(fgmask)
                    # 保存截图
                cv2.imshow('frame', frame)
                cv2.imshow('fgmask', fgmask)
                Process_Order += 1
            else:
                break

            ZH_Count += 1
            if cv2.waitKey(25) & 0xFF == ord('q'):
                break
        cap.release()
        cv2.destroyAllWindows()

#-------------------------------------类的调用-----------------------------
ANS = Detect()
ANS.setup(path_read='/Users/vicky/Desktop/附件3-检测前景视频/campus',path_write='/Users/vicky/Desktop/附件3-检测前景视频/campus',filename='Campus',video_type='avi',process_type='MOG2',save_style='Orig',
          dynamic_volume=10000)
ANS.video_process()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值