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)
被逼无奈的树莓派传输文件
于 2022-10-08 20:32:53 首次发布