from api.model.model import PicoDet import time import cv2 import json import datetime import os import sys from utils.utils import send_notifycation def getFile(ruleFile): if getattr(sys, 'frozen', False): absPath = os.path.dirname(os.path.abspath(sys.executable)) elif __file__: absPath = os.path.dirname(os.path.abspath(__file__)) else: absPath = '' return os.path.join(absPath,ruleFile) def get_settings_status_name(data, settings,setting_name): # 访问指定 "setting" 的信息 for setting in data[settings]: if setting["name"] == setting_name: # 使用 filter() 和 map() 函数提取信息 names = list(map(lambda x: x["name"], filter(lambda x: x["status"], setting["status"]))) return names[0] def get_setting_status(data, settings,setting_name): # 使用 filter() 和 map() 函数提取信息 status = list(map(lambda x: x["status"], filter(lambda x: x["name"] == setting_name, data[settings]))) return status[0] def get_photo(cap): # cap = cv2.VideoCapture(0) # 开启摄像头 f, frame = cap.read() # 将摄像头中的一帧图片数据保存 return frame # print('开始咯!') # while cv2.waitKey(1)==-1: # #计时 def get_photo_detect(cap,net): ''' 输入{图像,网络模型},输出[预测时间,预测结果] ''' result = net.detect_img(get_photo(cap),show_result=False) return result def get_photo_detect_img(cap,net): ''' 输入{图像,网络模型},输出[预测时间,预测图片] ''' start = time.time() [result,img] = net.detect_img(get_photo(cap),show_result=True) # cv2.imshow('Video Cam', result) # # print(result) end = time.time() # print('time:',end-start) # cap.release() # 关闭摄像头 # # cv2.destroyAllWindows() return [end-start,result,img] def get_photo_base64(cap): import base64 # import numpy as np img = get_photo(cap) image = cv2.imencode('.jpg',img)[1] image_code = str(base64.b64encode(image))[2:-1] return image_code def mat2base64(frame): import base64 # import numpy as np image = cv2.imencode('.jpg',frame)[1] image_code = str(base64.b64encode(image))[2:-1] return image_code class API: '''本地API,供前端JS调用''' window = None net = None cap = None args = None def __init__(self): with open(getFile("config.json"),'r',encoding='utf8')as fp: self.args = json.load(fp) self.net = PicoDet( get_settings_status_name(self.args,"ModelSetting","模型版本设置"), self.args['classfile'], prob_threshold=float(get_setting_status(self.args,"ModelSetting",'confThreshold')), iou_threshold=float(get_setting_status(self.args,"ModelSetting",'nmsThreshold'))) # net.detect_folder(args['img_fold'], args['result_fold']) # 调用摄像头拍摄照片 self.cap = cv2.VideoCapture(0) # 开启摄像头 # cv2.namedWindow('Video Cam', cv2.WINDOW_NORMAL) if(self.args['toggle'] and self.args['tip']): send_notifycation("功能触发:鼠标悬停","EMC[嘴控]") def getPrimaryImg(self,type="不裁剪"): # 三种处理图片的方式:不裁剪、居中裁剪成224*224、居中裁剪成320*320。 if(type=="不裁剪"): return get_photo_base64(self.cap) elif(type=="居中裁剪成224*224"): img = get_photo(self.cap) height=len(img) width=len(img[0]) if(height>224 and width>224): y0 = height//2 x0 = width//2 x1 = x0-112 y1 = y0-112 x2 = x0+112 y2 = y0+112 img = img[y1:y2, x1:x2] return mat2base64(img) elif(type=="居中裁剪成320*320"): img = get_photo(self.cap) height=len(img) width=len(img[0]) if(height>320 and width>320): y0 = height//2 x0 = width//2 x1 = x0-160 y1 = y0-160 x2 = x0+160 y2 = y0+160 img = img[y1:y2, x1:x2] return mat2base64(img) def getDetectImg(self): [time,result,img] = get_photo_detect_img(self.cap,self.net) return [time,result,mat2base64(img)]#AttributeError: 'InferenceSession' object has no attribute 'detect' def getIndexSetting(self): toggle = self.args['toggle'] tip = self.args['tip'] control = self.args['control'] return [toggle,tip,control] def getAdvanceSetting(self): return [self.args['ControlSetting'], self.args['ModelSetting'], self.args['otherSetting']] def changeSetting(self,data): self.args.update(data) with open(getFile("config.json"),'w',encoding='utf8')as fp: json.dump(self.args,fp,ensure_ascii=False,indent=4) def getPersonalizationPrimaryImg(self): #判断是否存在"primary_img"文件夹 if(os.path.exists(getFile("primary_img"))==False): #不存在则创建 os.mkdir(getFile("primary_img")) #返回该文件夹下jpg文件的数量和列表 return [len(os.listdir(getFile("primary_img"))),os.listdir(getFile("primary_img"))] def setPersonalizationPrimaryImg(self,type="不裁剪"): #判断是否存在"primary_img"文件夹 if(os.path.exists(getFile("primary_img"))==False): #不存在则创建 os.mkdir(getFile("primary_img")) #保存图片 # 图片名字是当前时间 # 三种处理图片的方式:不裁剪、居中裁剪成224*224、居中裁剪成320*320。 if(type=="不裁剪"): cv2.imwrite(getFile("primary_img")+"/"+time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())+".jpg",get_photo(self.cap)) elif(type=="居中裁剪成224*224"): img = get_photo(self.cap) height=len(img) width=len(img[0]) if(height>224 and width>224): y0 = height//2 x0 = width//2 x1 = x0-112 y1 = y0-112 x2 = x0+112 y2 = y0+112 img = img[y1:y2, x1:x2] cv2.imwrite(getFile("primary_img")+"/"+time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())+".jpg",img) elif(type=="居中裁剪成320*320"): img = get_photo(self.cap) height=len(img) width=len(img[0]) if(height>320 and width>320): y0 = height//2 x0 = width//2 x1 = x0-160 y1 = y0-160 x2 = x0+160 y2 = y0+160 img = img[y1:y2, x1:x2] cv2.imwrite(getFile("primary_img")+"/"+time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())+".jpg",img) #返回该文件夹下jpg文件的数量和列表 return [len(os.listdir(getFile("primary_img"))),os.listdir(getFile("primary_img"))] def openPrimaryImgFiles(self): #判断是否存在"primary_img"文件夹 if(os.path.exists(getFile("primary_img"))==False): #不存在则创建 os.mkdir(getFile("primary_img")) #打开文件夹 os.startfile(getFile("primary_img")) def getPrimaryListImg(self,img_name): #判断是否存在"primary_img"文件夹 if(os.path.exists(getFile("primary_img"))==False): #不存在则创建 os.mkdir(getFile("primary_img")) #读取图片 img = cv2.imread(getFile("primary_img")+"/"+img_name) #返回图片 return mat2base64(img) def saveAnnotationData(self,data,dataset): #判断是否存在"annotation_data"文件夹 if(os.path.exists(getFile("annotation_data"))==False): #不存在则创建 os.mkdir(getFile("annotation_data")) #保存COCO数据集 with open(getFile("annotation_data")+"/"+"dataset.json",'w',encoding='utf8')as fp: json.dump(dataset,fp,ensure_ascii=False,indent=4) #保存标注数据 with open(getFile("annotation_data")+"/"+"data.json",'w',encoding='utf8')as fp: json.dump(data,fp,ensure_ascii=False,indent=4) def getAnnotationData(self): #判断是否存在"annotation_data"文件夹 if(os.path.exists(getFile("annotation_data"))==False): #不存在则创建 os.mkdir(getFile("annotation_data")) #判断是否存在"dataset.json"文件 if(os.path.exists(getFile("annotation_data")+"/"+"dataset.json")): #存在则读取 with open(getFile("annotation_data")+"/"+"dataset.json",'r',encoding='utf8')as fp: dataset = json.load(fp) else: #不存在则创建 return {} #判断是否存在"data.json"文件 if(os.path.exists(getFile("annotation_data")+"/"+"data.json")): #存在则读取 with open(getFile("annotation_data")+"/"+"data.json",'r',encoding='utf8')as fp: data = json.load(fp) else: #不存在则创建 return {} #返回数据 return {"mergeData":dataset,"annotationData":data}