You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

api.py 4.0 kB

2 years ago
2 years ago
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from api.model.model import PicoDet
  2. import time
  3. import cv2
  4. import json
  5. import datetime
  6. import os
  7. import sys
  8. def getFile(ruleFile):
  9. if getattr(sys, 'frozen', False):
  10. absPath = os.path.dirname(os.path.abspath(sys.executable))
  11. elif __file__:
  12. absPath = os.path.dirname(os.path.abspath(__file__))
  13. else:
  14. absPath = ''
  15. return os.path.join(absPath,ruleFile)
  16. def get_settings_status_name(data, settings,setting_name):
  17. # 访问指定 "setting" 的信息
  18. for setting in data[settings]:
  19. if setting["name"] == setting_name:
  20. # 使用 filter() 和 map() 函数提取信息
  21. names = list(map(lambda x: x["name"], filter(lambda x: x["status"], setting["status"])))
  22. return names[0]
  23. def get_setting_status(data, settings,setting_name):
  24. # 使用 filter() 和 map() 函数提取信息
  25. status = list(map(lambda x: x["status"], filter(lambda x: x["name"] == setting_name, data[settings])))
  26. return status[0]
  27. def get_photo(cap):
  28. # cap = cv2.VideoCapture(0) # 开启摄像头
  29. f, frame = cap.read() # 将摄像头中的一帧图片数据保存
  30. return frame
  31. # print('开始咯!')
  32. # while cv2.waitKey(1)==-1:
  33. # #计时
  34. def get_photo_detect(cap,net):
  35. '''
  36. 输入{图像,网络模型},输出[预测时间,预测结果]
  37. '''
  38. result = net.detect_img(get_photo(cap),show_result=False)
  39. return result
  40. def get_photo_detect_img(cap,net):
  41. '''
  42. 输入{图像,网络模型},输出[预测时间,预测图片]
  43. '''
  44. start = time.time()
  45. [result,img] = net.detect_img(get_photo(cap),show_result=True)
  46. # cv2.imshow('Video Cam', result)
  47. # # print(result)
  48. end = time.time()
  49. # print('time:',end-start)
  50. # cap.release() # 关闭摄像头
  51. # # cv2.destroyAllWindows()
  52. return [end-start,result,img]
  53. def get_photo_base64(cap):
  54. import base64
  55. # import numpy as np
  56. img = get_photo(cap)
  57. image = cv2.imencode('.jpg',img)[1]
  58. image_code = str(base64.b64encode(image))[2:-1]
  59. return image_code
  60. def mat2base64(frame):
  61. import base64
  62. # import numpy as np
  63. image = cv2.imencode('.jpg',frame)[1]
  64. image_code = str(base64.b64encode(image))[2:-1]
  65. return image_code
  66. class API:
  67. '''本地API,供前端JS调用'''
  68. window = None
  69. net = None
  70. cap = None
  71. args = None
  72. def __init__(self):
  73. with open(getFile("config.json"),'r',encoding='utf8')as fp:
  74. self.args = json.load(fp)
  75. self.net = PicoDet(
  76. get_settings_status_name(self.args,"ModelSetting","模型版本设置"),
  77. self.args['classfile'],
  78. prob_threshold=get_setting_status(self.args,"ModelSetting",'confThreshold'),
  79. iou_threshold=get_setting_status(self.args,"ModelSetting",'nmsThreshold'))
  80. # net.detect_folder(args['img_fold'], args['result_fold'])
  81. # 调用摄像头拍摄照片
  82. self.cap = cv2.VideoCapture(0) # 开启摄像头
  83. # cv2.namedWindow('Video Cam', cv2.WINDOW_NORMAL)
  84. def getPrimaryImg(self):
  85. self.window.evaluate_js('getPythonData()')
  86. return get_photo_base64(self.cap)
  87. def getDetectImg(self):
  88. [time,result,img] = get_photo_detect_img(self.cap,self.net)
  89. return [time,result,mat2base64(img)]#AttributeError: 'InferenceSession' object has no attribute 'detect'
  90. def getIndexSetting(self):
  91. toggle = self.args['toggle']
  92. tip = self.args['tip']
  93. control = self.args['control']
  94. return [toggle,tip,control]
  95. def getAdvanceSetting(self):
  96. return [self.args['ControlSetting'], self.args['ModelSetting'], self.args['otherSetting']]
  97. def changeSetting(self,data):
  98. self.args.update(data)
  99. with open(getFile("config.json"),'w',encoding='utf8')as fp:
  100. json.dump(self.args,fp,ensure_ascii=False,indent=4)