又是文件传输

import time
import cv2
import sys
import os
import queue
import PWMServo
from camera import *
from get_data import *
from cv_ImgAddText import *
from cv_funtion import *
import mjpg_server as mjpg

mode = -1  # 模式切换标识
emoji = 0 #默认表情
running = 1 #运行标志标志

# 人脸检测发送图片的信息
send_email = ''#发送邮箱
recv_email = ''#接收邮箱
passwd = ''#授权码
def get_email_data():
    global send_email, passwd, recv_email

    send_email, passwd, recv_email = read_data()

cap = '' #cv2摄像头对象

def camera_open():
    global cap, mode
    
    try:
        if cap != '':
            try:
                cap.release()
            except Exception as e:
                print(e)
        cap = cv2.VideoCapture(-1)
        cap.set(12, 45)
        time.sleep(0.01)
        mode = 0
    except BaseException as e:
        print('open camera error:',e)

def camera_close():
    global cap, mode
    
    try:
        mode = -1
        time.sleep(0.1)
        cap.release()
        time.sleep(0.01)
    except BaseException as e:
        print('close camera error:', e)
        
last_mode = 0
frame_copy = image = None

def connectInit():
    global mode
    frame_copy = 0
    setServoInit()
    if mode == 1 or mode == 0:
        PWMServo.setServo(1, 1500, 500)
        PWMServo.setServo(2, 1500, 500)
    elif mode == 4:
        PWMServo.setServo(1, 1200, 500)
        PWMServo.setServo(2, 1500, 500)
    else:
        pass
    time.sleep(0.55)

def disconnectInit():
    setServoInit()
    pass
    time.sleep(0.55)

# 示玩法的字体参数
text_x = 20 # 位置的x
text_y = 20 # 位置的y
textsize = 30 # 大小
textcolor = (255, 0, 0) # 颜色


#调用颜色追踪
def calling_color_track(isRunning, org):
    ret = None
    if isRunning: #据序号转为颜色名称的字符串
        if isRunning == 1:
            color = 'red'
        elif running == 2:
            color = 'green'
        elif running == 3:
            color = 'blue'
        return cv_color_track(org, 320, 240, target_color = color)
    else:
        return org

#调用人脸检测
last_face_reg_time = 0 #最后一次检测到邮件发送结果时间戳
last_face_reg_result = 'detect_ok' #做后一次检测到人脸的邮件发送结果
def calling_face_reg(isRunning, org):
    global send_email, passwd, recv_email
    global last_face_reg_time, last_face_reg_result
    ret = org
    t = time.time()
    result = 'detect_ok'
    if running == 3:
        if (t - last_face_reg_time) < 3: #两次间隔小于3秒,显示上次结果
            img_tmp, result= detectFaceOpenCVDnn(org , '', '', '')
            result = last_face_reg_result
        else: 
            img_tmp, result= detectFaceOpenCVDnn(org , send_email, passwd, recv_email)
            last_face_reg_result = result
            if result != 'detect_ok':
                last_face_reg_time = time.time()

        if result == 'send_fail':
            ret = cv2ImgAddText(img_tmp, "发送图片失败,请检查填写信息是否正确,\n或者网络是否连接",
                                10, 200, textColor=textcolor, textSize=textsize)
        elif result == 'send_ok':
            ret = cv2ImgAddText(img_tmp, "发送成功,可在邮箱查看结果",
                                10, 200, textColor=textcolor, textSize=textsize)
        elif result == 'detect_ok':
            pass
        else:
            ret = cv2ImgAddText(img_tmp, result, 10, 200, textColor=textcolor, textSize=textsize)

    elif running == 2 or running == 1:
        ret, result= detectFaceOpenCVDnn(frame_copy , '', '', '')
        last_face_reg_time = 0
    else:
        pass
    return ret

# 玩法切换
def switch_play():
    global cap
    global mode, image, frame_copy,  debug
    global emoji, running

    while True:
        if mode != -1:
          if frame_copy is not None: #获取到图片
            if mode == 1: 
                #mode 1 颜色追踪
                image = calling_color_track(running, frame_copy)
            elif mode == 2:
                #mode 2 人脸识别
                image = calling_face_reg(running, frame_copy)
            elif mode == 3:
                #mode 3 移动检测
                image = moving_objiect_track(frame_copy, 320, 240) if running else frame_copy
            elif mode == 4:
                #mode 4 人脸追踪、眼镜表情
                image = cv_emoji(frame_copy, running, emoji, 160, 120, 640, 480)
            elif mode == 5: 
                #mode 5 二维码识别
                Frame, result = cv_qccode(frame_copy) if running else (frame_copy, '')
                Frame = cv2.rectangle(Frame, (0, 480 -40), (640 -1, 480 -1), (255, 255, 255), -1)
                image = cv2ImgAddText(Frame, "二维码内容:" + result, 5, 480 - 35, textColor=textcolor, textSize=textsize)
            elif mode == 6:
                #mode 6 手指识别
                if running:
                    binary = image_process(frame_copy, 320, 240)#处理图像
                    image, hand_num = get_hand_number(binary, 320, 240, frame_copy)#获取手指个数
                    cv2.putText(image, "Finger(s): " + str(hand_num), (10, image.shape[0] - 13), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2)
                else:
                    image = frame_copy
            else:
                image = frame_copy
            frame_copy = None
            time.sleep(0.01)
        else:
            time.sleep(0.01)

debug = False
def camera_task():
    global image, frame_copy, debug, mode, cap, ps_count
    while True:
        if mode != -1:
            try:
                ret, orgframe = cap.read()
                if ret:
                    frame_flip = cv2.flip(orgframe, 1)
                    frame_copy = frame_flip
                    if debug:
                        img_tmp = image if image is not None else frame_flip
                        cv2.imshow('image',img_tmp)
                        cv2.waitKey(1)
                    else:
                        img_tmp = image if image is not None else frame_flip
                        try:
                            mjpg.img_show = img_tmp
                        except:
                            pass
                    time.sleep(0.03)
                else:
                    cap = cv2.VideoCapture(-1)
                    time.sleep(0.01)
    
            except BaseException as e:
                print('主程序出错', e)
        else:
            time.sleep(0.01)
#mjpg流服务器
if __name__ != '__main__':
    threading.Thread(target = mjpg.create_mjpg_server, args=(), daemon=True).start()
#图像处理线程
threading.Thread(target=switch_play, daemon=True).start()
threading.Thread(target=camera_task, daemon=True).start()

if __name__ == '__main__':
    print('''
    **********************************************************
    *******功能:所有玩法的集合,可通过不同指令进行调用********
    **********************************************************
    ----------------------------------------------------------
    Official website:http://www.lobot-robot.com/pc/index/index
    Online mall:https://lobot-zone.taobao.com/
    ----------------------------------------------------------
    以下指令均需在LX终端使用,LX终端可通过ctrl+alt+t打开,或点
    击上栏的黑色LX终端图标。
    ----------------------------------------------------------
    Usage:
      -0 | --启动遥控云台玩法
      -1 | --启动颜色跟踪玩法
      -2 | --启动人脸检测玩法
      -3 | --启动人脸追踪玩法
      -4 | --启动移动检测玩法
      -5 | --启动二维码识别玩法
      -6 | --启动手指识别玩法
    ----------------------------------------------------------
    Example #1:
      显示图像,将识别到的人脸框起来
      python3 Transfer_Play.py -3
    ----------------------------------------------------------
    Version: --V2.0  2020/05/04
    ----------------------------------------------------------
    Tips:
     * 按下Ctrl+C可关闭此次程序运行,若失败请多次尝试!
    ----------------------------------------------------------
    ''')

    # 人脸检测发送图片:发送邮箱,接收邮箱,授权码
    send_email = ''
    recv_email = ''
    passwd = ''
    if len(sys.argv) > 1:
        camera_open()
        tmp_mode = 0
        try:
            tmp_mode = int(sys.argv[1][1:])
            if tmp_mode == 4:
                mode = 3
            elif tmp_mode == 3:
                mode = 4
            else:
                mode = tmp_mode
            if mode == 0:
                PWMServo.setServo(1, 1500, 1000)
                PWMServo.setServo(2, 1500, 1000)
        except:
            print('传入参数格式错误')
            sys.exit()

        if mode < 0 or mode > 6:
            print('未启动任何玩法')
        else:
            print('当前启动玩法:', str(tmp_mode))

        emoji = 1
        running = 1
        debug = True        
    else:
        print('请添加需要运行的玩法参数')
    
    interrupt = False
    def signal_handle(signal, frame): 
        global interrupt
        
        interrupt = True
        print('程序终止')

    while True:
        if interrupt:
            break
        else:
            time.sleep(1)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值