re.findall с отрицательными числами, мой код работает только на положительных числах - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь получить номер из программы на моем экране, используя OpenCV. У меня есть точная точка на экране, в которой находится значение, и я могу использовать изображение для распознавания текста, чтобы превратить живое обновление изображения в текст. текст, который я получаю, представляет собой строку следующим образом (прибыль: 12,34, что бы то ни было в то время), я по какой-то причине не могу просто получить число, поэтому я использую re.findall, чтобы получить число в строке. это работает как горячая черта, пока значение> = 0. Я получаю возвращаемое значение в виде числа с плавающей запятой. работает отлично. но после того, как число становится отрицательным, я получаю это сообщение об ошибке

  File "C:/Users/austi/.spyder-py3/OpenCV_Files/Closest_workingCV.py", line 55, in <module>
    price = re.findall("\d+", text)[0]

IndexError: list index out of range

вот мой код до сих пор



import numpy as np
from PIL import ImageGrab
import cv2
import time
import pytesseract
import re



pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

while True:
    def process_img(original_image):
        processed_img = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
        return processed_img

    def process_img1(original_image1):
        processed_img1 = cv2.cvtColor(original_image1, cv2.COLOR_BGR2GRAY)
        processed_img1 = cv2.Canny(processed_img1, threshold1=200, threshold2=300)
        return processed_img1


    coor1 = (20, 150, 950, 950)
    coor2 = (60, 550, 250, 590)
#    coor3 = (20, 150, 950, 950)


    #last_time = time.time()
    for i in range(2):
        if i == 0:
            x = coor1
            screen = np.array(ImageGrab.grab(bbox=(x)))
            new_screen = process_img(screen)
            #screen('Loop took {} seconds'.format(time.time()-last_time))
            #last_time = time.time() 
            cv2.imshow('window', new_screen)  
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break
        elif  i == 1:
            x = coor2
            screen1 = np.array(ImageGrab.grab(bbox=(x)))
            new_screen1 = process_img(screen1)
            cv2.imshow('window1', new_screen1)   
            text = pytesseract.image_to_string(new_screen1)
            #price = text.split(":")[1]
            price = re.findall("\d+", text)[0]
            #rint(repr(text))
            #price = re.findall("\d+","Foo -111 Bar 55", text)
            price = float(price)
            #text = [float(s) for s in re.findall(r'-?\d+\.?\d*', text)]
            #print(text)
            print(price)
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break         

, как я уже говорил, он обновляет это число несколько раз в секунду без ошибок как это не отрицательное число. У кого-нибудь есть какие-либо предложения о том, как это исправить? или какие-нибудь лучшие способы достичь моей конечной цели. Я искал и обнаруживал похожие проблемы, но когда я внедрял любые предложенные решения, которые, как я обнаружил, либо вычеркивали, не работали ни для какого числа, или у меня та же проблема, состоящая только из цифр 0 или больше. не уверен что делать пожалуйста помогите. Я включил фрагмент моего экрана, на который смотрит код. Спасибо enter image description here

1 Ответ

0 голосов
/ 18 февраля 2020

Не думаю, что проблема в самом регулярном выражении, за исключением того, что его можно расширить, чтобы поймать отрицательный знак. Я переработал ваш код для устранения ошибок:

        screen1 = np.array(ImageGrab.grab(bbox=(x)))
        new_screen1 = process_img(screen1)
        cv2.imshow('window1', new_screen1)   
        text = pytesseract.image_to_string(new_screen1)

        if text:
            # test code to show the text to scan     
            print("text to scan:", repr(text))
            try:
                price = re.findall("-?\d+", text)[0]
                print(price)
                if cv2.waitKey(25) & 0xFF == ord('q'):
                    cv2.destroyAllWindows()
                    break
                else:
                    pass
            except IndexError:
                print("No price found")
        else:
            print("No text to scan")
...