반응형

만들기전에 대체할수 있는 방법들


1.구글드라이버에서 이미지를 구글문서로 여는방법(굉장히 귀찮다)


2.EasyOCR 사용하기

https://swiftcam.tistory.com/198

Easy OCR을 이용하는방법(20회이상 사용시 라이센스가 필요-유료)

가격이 비싸지 않고 성능도 꽤 준수한편이기 때문에 많이 필요하다면 사는것도 좋은방법이다.


3.ABBYY FindReader

좀 비쌉니다... 30만원 정도 하는것으로 알고있습니다.

https://namu.wiki/w/OCR




저는 그냥 만들어 보기로 했습니다.



순서

선택영역 이미지 캡쳐 -> 이미지에서 텍스트 찾기(OCR)



선택영역 이미지 캡쳐


-필요한 모듈 설치하기(pycharm 기준)

terminal창에서 필요한 모듈 설치


1
2
pip install pillow
pip install opencv-contrib-python
cs



스크린샷을 찍고 필요한 영역추출


코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import cv2 as cv
from PIL import ImageGrab
 
 
isDragging = False
x1,y1,x2,y2 = -1,-1,-1,-1
blue,red = (255,0,0),(0,0,255)
 
#마우스 좌표받아서 처리하는 함수
def onMouse(event, x,y,flags, param):
    global isDragging,x1,y1,img
    if event ==cv.EVENT_LBUTTONDOWN:#왼쪽마우스버튼 눌렀을때
        isDragging=True
        x1=x
        y1=y
    elif event==cv.EVENT_MOUSEMOVE:#움직일때
        if isDragging:
            img_draw=img.copy()
            # 영역표시
            cv.rectangle(img_draw,(x1,y1),(x,y),blue,2)
            cv.imshow('img',img_draw)
    elif event== cv.EVENT_LBUTTONUP:#왼쪽 마우스버튼 땟을때
        if isDragging:
            isDragging=False
            x2=x
            y2=y
            print('x:%d, y%d,w:%d,h:%d'%(x1,y1,x2,y2))
 
            img_draw= img.copy()
            # 영역표시
            cv.rectangle(img_draw,(x1,y1),(x2,y2),red,2)
            cv.imshow('img',img_draw)
            #우->좌 ,하 ->상으로 드래그시 수정
            if x1>x2:
                x1,x2=x2,x1
            if y1>y2:
                y1,y2=y2,y1
 
            roi = img[y1:y2,x1:x2]
            #영역보여주기
            cv.imshow('capture',roi)
            # cv.moveWindow('cropped',0,0)
            #파일저장
            cv.imwrite('./save.jpg',roi)
            print('capture')
 
 #스크린샷 찍고저장
img=ImageGrab.grab()
img.save('./screenshot.jpg')
 
#찍은 스크린샷 불러오기
img=cv.imread('./screenshot.jpg',cv.IMREAD_COLOR)
 
cv.imshow('img',img)
cv.setMouseCallback('img',onMouse)
cv.waitKey()
cv.destroyAllWindows()
 
 

cs




tesseract를 이용한 이미지에서 텍스트 찾기


https://github.com/UB-Mannheim/tesseract/wiki

w64 다운


-테서렉트 설치

설치중 additional language data -> korean 체크


설치후 환경변수 설정

내pc 마우스 우클릭->속성->고급시스템 설정->환경변수 -> 시스템 변수창에  Path 더블클릭

->새로만들기 ->설치했던 Tesseract 경로 추가(ex ) C:\Program Files\Tesseract-OCR)


시스템변수의 새로만들기 클릭 ->변수이름 TESSDATA_PREFIX 변수값 C:\Program Files\Tesseract-OCR\tessdata 입력 후 확인



-이미지경로 테스트해보기

cmd창에서 이미지가 들어있는 폴더로 이동


영어 추출시

tesseract 원하는이미지파일 stdout 


한글 추출시

tesseract 원하는이미지파일 stdout -l kor





파이썬에서 tesseract 사용하기



성능이 생각만큼 나오지는 않지만 OCR자체가 어렵다고 한다...

표준형식의 문자들은 잘 읽는편이며 한글과 영어가 같이 있을경우 정확도가 떨어진다.

해상도와 글자의 색,크기도 중요한거 같다.

lang='eng+kor'로 바꾸면 한글 영어 모두 인식할수 있지만 정확도가 더욱 떨어집니다.

어떤조건에서는 잘되고 어떤조건에서는 잘되지않습니다.


1
2
3
4
import cv2 as cv
import pytesseract
 
print(pytesseract.image_to_string(cv.imread('./save.jpg'), lang='kor'))
cs




스크린샷을 찍고 특정영역의 텍스트를 찾아내보자




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import cv2 as cv
from PIL import ImageGrab
import pytesseract
 
 
isDragging = False
x1,y1,x2,y2 = -1,-1,-1,-1
blue,red = (255,0,0),(0,0,255)
 
#마우스 좌표받아서 처리하는 함수
def onMouse(event, x,y,flags, param):
    global isDragging,x1,y1,img
    if event ==cv.EVENT_LBUTTONDOWN:#왼쪽마우스버튼 눌렀을때
        isDragging=True
        x1=x
        y1=y
    elif event==cv.EVENT_MOUSEMOVE:#움직일때
        if isDragging:
            img_draw=img.copy()
            # 영역표시
            cv.rectangle(img_draw,(x1,y1),(x,y),blue,2)
            cv.imshow('img',img_draw)
    elif event== cv.EVENT_LBUTTONUP:#왼쪽 마우스버튼 땟을때
        if isDragging:
            isDragging=False
            x2=x
            y2=y
            print('x:%d, y%d,w:%d,h:%d'%(x1,y1,x2,y2))
 
            img_draw= img.copy()
            # 영역표시
            cv.rectangle(img_draw,(x1,y1),(x2,y2),red,2)
            cv.imshow('img',img_draw)
            #우->좌 ,하 ->상으로 드래그시 수정
            if x1>x2:
                x1,x2=x2,x1
            if y1>y2:
                y1,y2=y2,y1
 
            roi = img[y1:y2,x1:x2]
            #영역보여주기
            cv.imshow('capture',roi)
            # cv.moveWindow('cropped',0,0)
            #파일저장
            cv.imwrite('./save.jpg',roi)
            print('capture')
            #글자추출
            print(pytesseract.image_to_string(cv.imread('./save.jpg'), lang='kor'))
 
 #스크린샷 찍고저장
img=ImageGrab.grab()
img.save('./screenshot.jpg')
 
#찍은 스크린샷 불러오기
img=cv.imread('./screenshot.jpg',cv.IMREAD_COLOR)
 
cv.imshow('img',img)
cv.setMouseCallback('img',onMouse)
cv.waitKey()
cv.destroyAllWindows()
 
 

cs



성능이 만족스럽지 못합니다.

인식이 잘될때는 잘되지만 안될때는 형편없어집니다.

tesseract의 성능을 조금더 높일수 있는 방법을 찾아보아야 할 것 같습니다.

영어인식은 비교적 괜찮은 편입니다.


참고

https://bkshin.tistory.com/entry/OpenCV-6-dd

https://www.youtube.com/watch?v=STf1R-3rbco&t=190s



GUI로 만든 버전

https://github.com/shjune93/pythonOCR


반응형

'딥러닝' 카테고리의 다른 글

Yolo v5를 통해 원하는 물체 찾아보기(Object detection)  (1) 2020.11.26
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기