def ocr_local(self, x1, y1, x2, y2, screen_shot=None, size=1.0): if screen_shot is None: screen_shot = self.getscreen() try: if screen_shot.shape[0] > screen_shot.shape[1]: if anticlockwise_rotation_times >= 1: for _ in range(anticlockwise_rotation_times): screen_shot = UIMatcher.AutoRotateClockWise90( screen_shot) screen_shot = UIMatcher.AutoRotateClockWise90(screen_shot) part = screen_shot[y1:y2, x1:x2] # 对角线点坐标 part = cv2.resize(part, None, fx=size, fy=size, interpolation=cv2.INTER_LINEAR) # 利用resize调整图片大小 img_binary = cv2.imencode('.png', part)[1].tobytes() files = {'file': ('tmp.png', img_binary, 'image/png')} local_ocr_text = requests.post( url="http://127.0.0.1:5000/ocr/local_ocr/", files=files) pcr_log(self.account).write_log(level='info', message='本地OCR识别结果:%s' % local_ocr_text.text) return local_ocr_text.text except Exception as ocr_error: pcr_log(self.account).write_log(level='error', message='本地OCR识别失败,原因:%s' % ocr_error) return -1
def baidu_ocr(self, x1, y1, x2, y2, size=1.0, screen_shot=None): # size表示相对原图的放大/缩小倍率,1.0为原图大小,2.0表示放大两倍,0.5表示缩小两倍 # 默认原图大小(1.0) if len(baidu_apiKey) == 0 or len(baidu_secretKey) == 0: pcr_log(self.account).write_log(level='error', message='读取SecretKey或apiKey失败!') return -1 # 强制size为1.0,避免百度无法识图 size = 1.0 if screen_shot is None: screen_shot = self.getscreen() # from numpy import rot90 # screen_shot_ = rot90(screen_shot_) # 旋转90° if baidu_ocr_img: cv2.imwrite('baidu_ocr.bmp', screen_shot) if screen_shot.shape[0] > screen_shot.shape[1]: if anticlockwise_rotation_times >= 1: for _ in range(anticlockwise_rotation_times): screen_shot = UIMatcher.AutoRotateClockWise90(screen_shot) screen_shot = UIMatcher.AutoRotateClockWise90(screen_shot) # cv2.imwrite('fuck_rot90_test.bmp', screen_shot_) # screen_shot_ = rot90(screen_shot_) # 旋转90° pass part = screen_shot[y1:y2, x1:x2] # 对角线点坐标 part = cv2.resize(part, None, fx=size, fy=size, interpolation=cv2.INTER_LINEAR) # 利用resize调整图片大小 partbin = cv2.imencode('.jpg', part)[1] # 转成base64编码(误) try: files = {'file': ('tmp.png', partbin, 'image/png')} result = requests.post(url="http://127.0.0.1:5000/ocr/baidu_ocr/", files=files) # 原生输出有助于开发者 result = result.json().get('words_result')[0].get('words') return result except: pcr_log(self.account).write_log( level='error', message='百度云识别失败!请检查apikey和secretkey以及截图范围返回结果' '是否有误!') return -1
def getscreen(self, filename=None): """ 包装了self.d.screenshot 如果self.debug_screen为None,则 :return: 截图的opencv格式 """ # 如果debug_screen为None,则正常截图; # 否则,getscreen函数使用debug_screen作为读取的screen if self.debug_screen is None: if fast_screencut and self.fastscreencut_retry < 3: try: data = self.receive_minicap.receive_img() if data is None: raise Exception("读取数据超过最大尝试次数") # 改用内存缓存 self.last_screen = data # 如果传入了文件路径参数,则保存文件 if filename is not None: cv2.imwrite(filename, self.last_screen) self.fastscreencut_retry = 0 except Exception as e: if force_fast_screencut: raise FastScreencutException(*e.args) else: self.log.write_log("warning", f"快速截图出错 {e}, 使用低速截图") self.fastscreencut_retry += 1 if self.fastscreencut_retry == 3: self.log.write_log("error", f"快速截图连续出错3次,关闭快速截图。") self.receive_minicap.stop() self.last_screen = self.d.screenshot(filename, format="opencv") else: if filename is None: self.last_screen = self.d.screenshot(filename, format="opencv") else: self.d.screenshot(filename, format="opencv") self.last_screen = cv2.imread(filename) self.last_screen_time = time.time() output_screen = UIMatcher.AutoRotateClockWise90(self.last_screen) if debug: if output_screen is None: print("ERROR!截图为空!") if output_screen is not None and output_screen.shape != (540, 960, 3): print("Warning: 截屏大小为", output_screen.shape, "应为 (540,960,3), 可能模拟器分辨率没有被正确设置!") return output_screen else: if isinstance(self.debug_screen, str): return cv2.imread(self.debug_screen) else: return self.debug_screen
def getscreen(self, filename=None): """ 包装了self.d.screenshot 如果self.debug_screen为None,则 :return: 截图的opencv格式 """ # 如果debug_screen为None,则正常截图; # 否则,getscreen函数使用debug_screen作为读取的screen if self.debug_screen is None: if fast_screencut and self.fastscreencut_retry < 3: try: data = self.receive_minicap.receive_img() if data is None: raise Exception("读取数据超过最大尝试次数") # 改用内存缓存 self.last_screen = data # 如果传入了文件路径参数,则保存文件 if filename is not None: cv2.imwrite(filename, self.last_screen) self.fastscreencut_retry = 0 except Exception as e: self.log.write_log("warning", f"快速截图出错 {e},采用低速截图") self.fastscreencut_retry += 1 if self.fastscreencut_retry == 3: if force_fast_screencut: raise FastScreencutException(*e.args) else: self.log.write_log("error", f"快速截图连续出错3次,关闭快速截图。") self.receive_minicap.stop() self.last_screen = self.d.screenshot(filename, format="opencv") else: self.last_screen = self.d.screenshot(filename, format="opencv") self.last_screen_time = time.time() return UIMatcher.AutoRotateClockWise90(self.last_screen) else: if isinstance(self.debug_screen, str): return cv2.imread(self.debug_screen) else: return self.debug_screen