コード例 #1
0
    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
コード例 #2
0
    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
コード例 #3
0
 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
コード例 #4
0
 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