文档章节

python空货架系统

非著名魔兽解说
 非著名魔兽解说
发布于 2017/05/26 14:18
字数 1608
阅读 8
收藏 0
# -*- coding: UTF-8 -*-
import os
import time
import datetime
import threading
import tkinter #python3.5时
# import Tkinter #python2.7时
import shutil
import schedule
import tkinter.messagebox #python3.5时
# import tkMessageBox #python2.7时
import cv2
import re
import tkinter.filedialog #python3.5时
# import tkFileDialog #python2.7时
from pygame import mixer #python3.5时
# import mp3play #python2.7版本使用mp3play好用,但是python3.5时,使用mp3play时出错,为了保证python3.5能正常播放mp3,则python3.5时使用pygame模块的mixer

# import win32com

'''
功能:开启摄像头监控空货架,启动后点击"打开摄像头",自动开启摄像头,点击"关闭摄像头"则关闭摄像头.
      点击"上传视频"可以监测视频.
      摄像头每1秒截图一次,视频每10帧截图一次.
      点击"开始监测",每3秒检测一次当天是否有缺货的货架,有就播放提示音,没有则不提示,点击"停止监测"则终止监测。
'''


class mythread_check(threading.Thread):
    global vc
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        root.flag = True#启动标志,点击"开始"时变为True,点击"停止"时变为False
        root.stop = False#终止标志,点击"开始"时为False,点击"停止"时变为True
        while root.flag:
            # vedio_capture()
            check_null_dir(short_work_path)
            check_all_null_dir(short_work_path)
            schedule.run_pending()

class mythread_vedio(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        vedio_capture()

root = tkinter.Tk()
root.title('监测空货架系统')
root.geometry('440x250+400+200')
root.resizable(False, False)

# today_path =time.strftime('%Y-%m-%d')
disk_short_supply_path = 'C:\\short_supply_pictures'
disk_normal_supply_path = 'C:\\normal_supply_pictures'
short_work_path = 'C:\\short_supply_pictures\\' + time.strftime('%Y-%m-%d')
normal_work_path = 'C:\\normal_supply_pictures\\' + time.strftime('%Y-%m-%d')
short_monitor_path = short_work_path+'\\'+'monitor'
normal_monitor_path = normal_work_path+'\\'+'monitor'

#检测空目录
def check_all_null_dir(dir):
    i=0
    num=0
    if os.path.isdir(dir):
        for p in os.listdir(dir):
            d = os.path.join(dir, p)
            if (os.path.isdir(d) == True):
                i+=1
                if not os.listdir(d):
                    num+=1
        if i ==num and root.stop == False:
            lbl['text'] = '监测已开始!'


#开启摄像头捕捉关键帧
def vedio_capture():
    btn_openVideo['state'] = 'disabled'
    btn_closeVideo['state'] = 'normal'
    lbl['text'] = '摄像头已开启!'
    create_dirs()
    vc = cv2.VideoCapture(0)  # 读入摄像头
    # vc = cv2.VideoCapture('short_supply1.avi')  # 读入视频文件
    pic = 1
    c = 1
    timeF = 10  # 视频帧计数间隔频率
    openFlag=False #摄像头正常打开时,此标志变为True
    if vc.isOpened():#判断是否正常打开
        rval, frame = vc.read()
        openFlag = True
    else:
        rval = False
        lbl['text'] = '摄像头打开失败!'
    while openFlag:  # 循环读取摄像头
    # while rval:  # 循环读取视频帧
        rval, frame = vc.read()
        if (pic % timeF == 5):
            body_cascade = cv2.CascadeClassifier(
                'C:\\OpenCV2.4.9\\opencv\\sources\\data\\haarcascades\\test_short_supply.xml')
            if len(frame.shape) == 3 or len(frame.shape) == 4:
                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            else:
                gray = frame
            bodys = body_cascade.detectMultiScale(gray, 1.1, 20, cv2.CASCADE_SCALE_IMAGE, (55, 55))
            flag = False
            for (x, y, w, h) in bodys:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                flag = True
            if flag == True:
                if not os.path.exists(short_monitor_path):
                    os.makedirs(short_monitor_path)
                cv2.imwrite(short_monitor_path + '\\' + datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S')+'_'+str(c) + '.jpg', frame)  # 保存
            else:
                if not os.path.exists(normal_monitor_path):
                    os.makedirs(normal_monitor_path)
                cv2.imwrite(normal_monitor_path + '\\' +datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S')+'_'+ str(c) + '.jpg',frame)  # 保存
            c += 1
        pic = pic + 1
        time.sleep(1)
        # cv2.imshow('Video', frame)
        # if cv2.waitKey(1) & 0xFF == ord('q'): #按q键关闭摄像头
            # break
        # vc.release()

def close_video():#关闭摄像头
    btn_closeVideo['state'] = 'disabled'
    btn_openVideo['state'] = 'normal'
    lbl['text'] = '摄像头已关闭!'
    cv2.VideoCapture(0).release()  # 读入摄像头
    # cv2.VideoCapture('short_supply1.avi').release()# 读入视频文件

def create_dirs(): #创建文件夹
    if not os.path.exists(short_monitor_path):
        os.makedirs(short_monitor_path)
    if not os.path.exists(normal_monitor_path):
        os.makedirs(normal_monitor_path)

def check_null_dir(dirr): #扫描文件夹
    # root.flag = True
    if root.stop == True:
        return

    global pic_path
    pic_path=''

    if not os.path.exists(dirr):
        # pass
        lbl['text'] = '路径' + dirr + '不存在!'
        btn_startCheck['state'] = 'normal'
        btn_stopCheck['state'] = 'disabled'
        root.flag = False
    else:
        if os.path.isdir(dirr):
            for p in os.listdir(dirr):
                d  = os.path.join(dirr,p)
                if (os.path.isdir(d) == True):
                    check_null_dir(d)
        if  os.listdir(dirr):
            if dirr.count('\\')==3:
                filename = 'C:\\message.mp3'
                # mp3 = mp3play.load(filename) #python2.7时使用mp3play
                # mp3.play()
                # len = mp3.seconds()
                # time.sleep(len)
                # mp3.stop()
                mixer.init()  # python3.5时使用mixer
                mixer.music.load(filename)
                mixer.music.play()
                pic_path = dirr
                if root.stop == False:
                    lbl['text'] = '路径' + pic_path + '\n货架缺货,请及时确认!'
                else:
                    lbl['text'] = '监测已停止!'
        time.sleep(3) #3秒检查一次

def remove_threedaysago_files():
    today = datetime.date.today()
    threedaysago = today - datetime.timedelta(days=3)
    for file in os.listdir(disk_short_supply_path):
        if os.path.isdir(os.path.join(disk_short_supply_path, file)):
            if file <= str(threedaysago):
                shutil.rmtree(os.path.join(disk_short_supply_path, file))
    for file in os.listdir(disk_normal_supply_path):
        if os.path.isdir(os.path.join(disk_normal_supply_path, file)):
            if file <= str(threedaysago):
                shutil.rmtree(os.path.join(disk_normal_supply_path, file))

schedule.every().day.at("12:00").do(remove_threedaysago_files)

# 关闭程序时执行的函数代码
def closeWindow():
    root.flag = False
    root.destroy()

# root.protocol('关闭窗口', closeWindow)

def openVideo():
    t = mythread_vedio()
    t.start()

# btn_openVideo = Tkinter.Button(root, text='打开摄像头',command=openVideo)
# btn_openVideo.place(x=10, y=10, width=80, height=20)



# btn_closeVideo = Tkinter.Button(root, text='关闭摄像头',command=close_video)
# btn_closeVideo.place(x=110, y=10, width=80, height=20)

def btn_startCheck_Click():
    # 每次单击“开始”按钮启动新线程
    lbl['text'] = '监测已开始!'
    create_dirs()
    t = mythread_check()
    t.start()
    btn_startCheck['state'] = 'disabled'
    btn_stopCheck['state'] = 'normal'

# btn_startCheck = Tkinter.Button(root, text='开始监测',command=btn_startCheck_Click)
# btn_startCheck.place(x=210, y=10, width=80, height=20)

def btn_stopCkeck_Click():
    # 单击“停止”按钮结束
    # lbl['text'] = ''
    btn_startCheck['state'] = 'normal'
    btn_stopCheck['state'] = 'disabled'
    # root.update()
    root.flag = False
    root.stop = True
    lbl['text'] = '监测已停止!'

def get_file():
    today_path = time.strftime('%Y-%m-%d')
    filename = tkinter.filedialog.askopenfilename(title="选择视频",filetypes = [('视频', 'MPEG'),('视频', 'AVI'),('视频', 'FLV'),('视频', 'RMVB'),('视频', 'MP4')])
    CN_Pattern = re.compile(u'[\u4E00-\u9FBF]+')
    JP_Pattern = re.compile(u'[\u3040-\u31fe]+')
    if filename:
        newFile = filename.split('/')[-1].split('.')[0]
        if not os.path.exists(short_work_path+'\\'+ newFile):
            os.makedirs(short_work_path+'\\'+ newFile)
        if not os.path.exists(normal_work_path+'\\'+ newFile):
            os.makedirs(normal_work_path+'\\'+ newFile)
        CN_Match = CN_Pattern.search(filename)
        JP_Match = JP_Pattern.search(filename)
        if CN_Match:
            # print u'有中文:%s' % (CN_Match.group(0),)
            lbl['text'] = '文件路径或文件名不能含有中文,请修改!'
            return
        elif JP_Match:
            # print u'有日文:%s' % (JP_Match.group(0),)
            lbl['text'] = '文件路径或文件名不能含有日文,请修改!'
            return

        vc = cv2.VideoCapture(filename)  # 读入视频文件
        pic = 1
        c = 1
        timeF = 10  # 视频帧计数间隔频率
        openFlag = False  # 视频正常打开时,此标志变为True
        if vc.isOpened():  # 判断视频是否正常打开
            rval, frame = vc.read()
            openFlag = True
        else:
            rval = False
            lbl['text'] = '视频打开失败!'
        while rval:  # 循环读取视频帧
            rval, frame = vc.read()
            if (pic % timeF == 5):
                body_cascade = cv2.CascadeClassifier('C:\\OpenCV2.4.9\\opencv\\sources\\data\\haarcascades\\test_short_supply.xml')
                if len(frame.shape) == 3 or len(frame.shape) == 4:
                    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                else:
                    gray = frame
                bodys = body_cascade.detectMultiScale(gray,1.1,20,cv2.CASCADE_SCALE_IMAGE, (55, 55))
                flag = False
                for (x, y, w, h) in bodys:
                    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                    flag = True
                if flag == True:
                    cv2.imwrite(short_work_path  + '\\' + newFile + '\\' + datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S') + '_' + str(c) + '.jpg', frame)  # 保存
                else:
                    cv2.imwrite(normal_work_path + '\\' + newFile + '\\' + datetime.datetime.now().strftime('%Y-%m-%d %H_%M_%S') + '_' + str(c) + '.jpg', frame)  # 保存
                c += 1
            pic = pic + 1
        lbl['text'] = '视频已上传完成!'
    else:
        return

# btn_stopCheck = Tkinter.Button(root,text='停止监测',command=btn_stopCkeck_Click)
# btn_stopCheck['state'] = 'disabled'
# btn_stopCheck.place(x=310, y=10, width=80, height=20)

lbl = tkinter.Label(root, text='',font = ("Arial, 10"))
lbl.place(x=40, y=120, width=350, height=50)

#
realTimeSet = tkinter.LabelFrame(root, text='实时监控')
btn_openVideo=tkinter.Button(realTimeSet, text='打开摄像头',command=openVideo)
btn_openVideo.grid(row=0, column=0, padx=2, pady=2)
btn_closeVideo = tkinter.Button(realTimeSet, text='关闭摄像头',command=close_video)
btn_closeVideo.grid(row=0, column=1, padx=2, pady=2)
realTimeSet.grid(row=0, column=0, padx=(10), pady=(5),ipadx=(5), ipady=(5))

uploadVedioSet = tkinter.LabelFrame(root,text='视频监控')
btn_uploadVedio=tkinter.Button(uploadVedioSet, text='上传视频',command=get_file)
btn_uploadVedio.grid(row=0, column=0, padx=2, pady=2)
uploadVedioSet.grid(row=0, column=1, padx=(10), pady=(5),ipadx=(3), ipady=(5))

monitorSet = tkinter.LabelFrame(root, text='监测')
btn_startCheck = tkinter.Button(monitorSet, text='开始监测',command=btn_startCheck_Click)
btn_startCheck.grid(row=0, column=0, padx=2, pady=2)
btn_stopCheck = tkinter.Button(monitorSet,text='停止监测',command=btn_stopCkeck_Click)
btn_stopCheck['state'] = 'disabled'
btn_stopCheck.grid(row=0, column=1, padx=2, pady=2)
monitorSet.grid(row=0, column=2, padx=(10), pady=(5),ipadx=(5), ipady=(5))
#


# 启动Tkinter主程序
root.mainloop()

 

© 著作权归作者所有

非著名魔兽解说
粉丝 2
博文 216
码字总数 56947
作品 0
烟台
程序员
私信 提问
5.1、竞品数据如何找?数据产品经理的威力

竞品数据如何找? 小奈:表哥,竞品分析、竞品数据如何找? 大仁:你可以找你们的数据产品经理啊,常见数据来源如下: 搜索指数 TBI腾讯指数 http://tbi.tencent.com/ 微信指数 360指数 http...

产品经理的技术课堂
2018/05/07
0
0
Python Tutorial 实践(1)

之前已经对Python有过简单的应用,近日决定重新对Python进行一个系统全面的学习,因此最好的办法就是把自己当成对Python一无所知,开始Tutorial的“旅行”。 关于Python 2.x和Python 3.x之间...

鄂世嘉
2013/04/14
213
2
Python3快速入门——(1)python变量和输入输出函数

1、Python语言 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式...

飞天小橘子
2018/03/14
0
0
Linux 安装python3.7.0

我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 python --version 查看系统自带的python版本 有一些系统命令时需要...

宿夜孤妖
2018/07/28
0
0
Python 获取当前路径的方法

Python2.7 中获取路径的各种方法 模块搜索路径的字符串列表。由环境变量PYTHONPATH初始化得到。 sys.path[0]是调用Python解释器的当前脚本所在的目录。 一个传给Python脚本的指令参数列表。 ...

rustfisher
2017/08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部