만들기전에 대체할수 있는 방법들
1.구글드라이버에서 이미지를 구글문서로 여는방법(굉장히 귀찮다)
2.EasyOCR 사용하기
https://swiftcam.tistory.com/198
Easy OCR을 이용하는방법(20회이상 사용시 라이센스가 필요-유료)
가격이 비싸지 않고 성능도 꽤 준수한편이기 때문에 많이 필요하다면 사는것도 좋은방법이다.
3.ABBYY FindReader
좀 비쌉니다... 30만원 정도 하는것으로 알고있습니다.
저는 그냥 만들어 보기로 했습니다.
순서
선택영역 이미지 캡쳐 -> 이미지에서 텍스트 찾기(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 |
---|
최근댓글