프로젝트 결과물 소개 (영상처리 관련 프로젝트)
목차 1. 영상인식을 이용한 게임 자동사냥 2. 스마트폰용 골프 스코어카드 OCR 시스템 ㈜아이소프트 (2007.12 ~ 2010.01) MMORPG “데카론” 게임 자동사냥 예로 설명 2. 스마트폰용 골프 스코어카드 OCR 시스템 경북대학교 산업대학원 석사 졸업 논문(2014.03 ~ 2014.06)
1. 영상인식을 이용한 게임 자동사냥 정의 : 게임 자동사냥은 유저가 몬스터를 사냥하고, 아이템을 줍고, HP가 떨어지면 HP를 회복시키는 반복적인 과정을 영상인식과 키보드, 마우스 제어를 프로그래밍적으로 하여 자동으로 하여 레벨업을 도와주는 프로그램 자동사냥에 쓰인 영상처리 주요 기술 1. 차영상 – 하나의 영상을 화소 단위로 다른 영상에서 뺀 결과 영상 (자동사냥에서의 활용 : 몬스터 인식) 2. 템플릿 매칭 - 원본 이미지에서 템플릿으로 주어진 이미지에 해당 되는 영역을 찾는 기술 (자동사냥에서의 활용 : HP, MP, 스킬창, 아이템창 등의 대부분의 인식)
1. 영상인식을 이용한 게임 자동사냥 – MMORPG “데카론” 차영상 템플릿 매칭
1. 영상인식을 이용한 게임 자동사냥 - 데카론자동사냥프로그램 게임 유저가 이 프로그램을 이용하여 설정하여 게임 내에서 실행을 하게 되면 영상인식을 통하여 키보드, 마우스를 적절히 제어를 하여 자동사냥이 진행된다
2. 스마트폰용 골프 스코어카드 OCR 시스템 - 정의 정의 : 본 시스템은 스마트폰 카메라를 이용하여 골프 스코어카드의 인식을 할수 있도록 해주는 부분시스템(SubSystem)이다. [ Golf ScoreCard OCR Server ] 1) 스마트폰에서 이미지 파일 받음 2) 받은 이미지 파일 OCR 인식 작업 [ 스마트폰 ] 스코어카드 촬영 이미지 파일로 저장 영상 이미지 파일 전송 인식 결과 데이터 전송 스마트폰에서의 영상 촬영 전송만하고 고사양 PC 에서 실질적인 영상처리를 하여 Output값을 스마트폰으로 전달
2. 스마트폰용 골프 스코어카드 OCR 시스템– 사용예시1 2013. 11월 런칭 서비스 중 2014. 03월 런칭 서비스 중
2. 스마트폰용 골프 스코어카드 OCR 시스템 - 사용예시2 Golf ScoreCard OCR System [스마트폰] 영상분석 결과값을 받은 상황 [ Golf ScoreCard OCR Server ] 1) 스마트폰에서 이미지 파일 받음 2) 받은 이미지 파일 OCR 인식 작업 영상 이미지 파일 전송 인식 결과 데이터 전송 하나지 앱 구조 Send(Json) DB Server Recv(Json) 장점 : 입출력 데이터를 통신으로 송수신하기 때문에 멀티플랫폼에서 사용가능 Web 중계서버 Chating Server FTP Server
2. 스마트폰용 골프 스코어카드 OCR 시스템 – 기능 리스트 네트워크 영상처리 서버는 IOCP 모델로 구성 파일 전송 프로토콜 숫자를 인식한 값을 전달하는 프로토콜 제일 큰 사각형 찾기 제일 큰 사각형의 모서리 4개 찾기 Wapring 스코어카드 인지 판별(템플릿 매칭) 손 글씨 숫자 영역 추출(사각형 검출) 손 글씨 숫자 인식 클라이언트로 인식된 결과 전송
2. 스마트폰용 골프 스코어카드 OCR 시스템– SuDoKu Solver 표(Grid:격자)를 추출하고 표의 꼭지점를 이용하여 Warping를 시키는것은 스코어카드와 흡사하여 관련 문헌을 참고하여 차용한 상태 참고문헌) http://www.aishack.in/2010/08/sudoku-grabber-with-opencv/
2. 스마트폰용 골프 스코어카드 OCR 시스템– SuDoKu Solver 인식과정 1 2 3 촬영 및 이미지 획득 이진화, 침식연산 FloodFill함수로 이웃하는 픽셀 최대값 4 5 6 허프변환 SuDoKu의 꼭지점 찾음 Warpping를 한 후 숫자 OCR 수행
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) 추출 조건 : 모든 사각형을 검색하면서 Player1를 인식하는 템플릿 매칭을 수행하고 그 이후에 연속되는 9개의 사각형은 1~9홀이라고 가정한다 1~9홀
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) [기존의 OpenCV findSquares 함수] 밝기 값 46부터 23씩 증감하여 10번 loop 사각형 검출 전체 10번을 화면을 스캔하여 사각형을 검출하기때문에 같은 격자에 중복 검출 되어진다. 배열에 저장된 4개의 꼭지점도 특정한 규칙으로 저장되어지지 않는다. 적절한 가공이 필요. 목표 : 사각형 저장좌표를 규칙적으로 재정렬
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) 2) OpenCV findSquares 함수 수정 – 1(꼭지점 재정렬) [가공 전 배열의 사각형 꼭지점의 값 예] 사각형 배열1- 꼭지점0(14,21), 꼭지점1(285,17), 꼭지점2(286,123), 꼭지점3(15,125) 사각형 배열2- 꼭지점0(15,18), 꼭지점1(14,125), 꼭지점2(286,124), 꼭지점3(286,17) 문제점 – 사각형의 꼭지점의 값이 불규칙적으로 배열에 저장 정렬 꼭지점2(285,17) 꼭지점2(286,17) …… 꼭지점0(14,21) 꼭지점0(15,18) …… 꼭지점3(286,123) 꼭지점3(286,124) …… 꼭지점1(15,125) 꼭지점1(14,125) …… 꼭지점 재정렬 [정렬된 배열의 값] 사각형 배열1 - 꼭지점0(14,21), 꼭지점1(15,125), 꼭지점2(285,17), 꼭지점3(286,123) 사각형 배열2 - 꼭지점0(15,18), 꼭지점1(14,125), 꼭지점2(286,17), 꼭지점3(286,124) ......
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) 2) OpenCV findSquares 함수 수정 – 2(중복되는 사각형 필터링) for(int i=0;i<squares.size();i++) { iHave = 0; iAbsX1 = (abs(squares[i][0].x-approx[0].x)+ abs(squares[i][1].x-approx[1].x)+ abs(squares[i][2].x-approx[2].x)+ abs(squares[i][3].x-approx[3].x))/4; iAbsY1 = (abs(squares[i][0].y-approx[0].y)+ abs(squares[i][1].y-approx[1].y)+ abs(squares[i][2].y-approx[2].y)+ abs(squares[i][3].y-approx[3].y))/4; if( ((iAbsX1+iAbsY1)/2) <4) iHave = 1; break; } if(iHave == 0) squares.push_back(approx); (기존검색되어진 사각형 배열의 꼭지점 – 현재검색되어진 사각형의 꼭지점) = 절대값 두개의 절대값을 ½ 하여 4미만의 값이면 기존에 사각형과 동일 => 기존 배열(squares)에 저장 안함 x, y의 두 직선으로 또 다시 하나의 직선으로 만들어서 절대값이 4이하 이면 기존의 사각형과 같다는 가정 (중복되는 사각형 필터링) squares : 기존검색 되어진 사각형 배열 approx : 현재 검색되어진 사각형 배열
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) 2) OpenCV findSquares 함수 수정 – 3(오름차순으로 다시 저장) cv::Size s = image.size(); int CountHeight=0; for(CountHeight=0;CountHeight<s.height;CountHeight++) { for(int j=0;j<s.width;j++) for(int k=0;k<squares.size();k++) { // x 좌표를 중심으로 사각형 꼭지점0번째의 y값의 범위 +50 범위의 값의 배열을 재정렬한다 if( ((squares[k][0].y>=CountHeight) && (squares[k][0].y<=(CountHeight+50) )) && (j==squares[k][0].x)) moguwai.push_back(squares[k]); squares.erase(squares.begin()+k); continue; } CountHeight +=50; Y좌표 50씩의 증감값으로 x좌표를 순차 검색하여 오름차순으로 배열을 재정렬한다 31번째 배열의 꼭지점0(20,10) 27번째 배열의 꼭지점0(50,15) 1번째 배열의 꼭지점0(20,10) 2번째 배열의 꼭지점0(50,15) Sorting
2. 스마트폰용 골프 스코어카드 OCR 시스템– 구현 (4. 손글씨 숫자 영역 추출) 2) OpenCV findSquares 함수 수정 - 4 Player1 탬플릿 매칭 이후 2~10 배열 => 1~9홀 Player2 탬플릿 매칭 이후 13~21 배열 => 1~9홀
2. 스마트폰용 골프 스코어카드 OCR 시스템– 실험 전체 10장의 스코어카드 실험 안드로이드 갤럭시S4에서 OpenCV 라이브러리를 이용하여 1054x864 해상도의 png파일(1.04mb)을 서버로 전송 하여 테스트 실험 환경은 2가지로 분류 하였다 (1) 골프 스코어카드 OCR 시스템 정상 처리 성공율 스마트폰에서 사진을 촬영후 서버의 OCR인식 처리 한후 클라이언트인 스마트폰으로 절차상의 오류 없이 정상적으로 전달된 경우의 성공율 2가지 시점에서 각각 시점 10번 수행 (2) 표안에 손글씨 숫자 인식율 KNN과 MNIST Database의 직접적인 연관성이 있으므로 독립적으로 실험 10명 0~9 숫자를 표안에 숫자로 강제로 추출하여 인식을 진행한 인식율 TopDownView DownView
2. 스마트폰용 골프 스코어카드 OCR 시스템– 실험 [TopDownView] 성공율 70% 실패한 경우 특정 부분이 상대적으로 어두울 때 특정 부분이 상대적으로 밝을 때
2. 스마트폰용 골프 스코어카드 OCR 시스템– 실험 [DownView] 성공율 60% 실패한 경우 밝기가 일정하지 않은 경우
2. 스마트폰용 골프 스코어카드 OCR 시스템– 실험결과 TopDownView(70%)와 DownView(60%)의 실험 결과 TopDownView에서는 비교적 높은 성공율을 보였으나 DownView에서는 스코어카드를 찾는 부분에서 꼭지점을 잘못 찾는 오류로 인해서 그 이후로 진행 하지 못하였다. (2) 표 안에 손 글씨 숫자 인식율 결과 10명의 손 글씨 숫자 인식 0~9까지 테스트에서 평균 66%의 인식율을 보였다. 오류가 나는 부분은 스코어카드의 칸 안에 숫자를 경계선과 겹칠 경우에 오류가 발생하였고 특정 숫자에 국한되어서 오인식이 발생하지 않고 0~9 전체적으로 특정하게 오류가 발생한다.
6. 결론 본 논문에서는 스마트 폰 카메라로 스코어카드 사진을 찍으면 서버에서 OCR 작업을 수행하여 스마트 폰으로 인식한 숫자를 전송하는 SubSystem를 제안하였다. 골프 스코어카드 OCR 시스템 정상 처리 성공율은 평균 65%, 손글씨 숫자 인식율은 평균 66%로 만족스러운 결과를 얻지 못하였다. 정상 처리 성공율은 스코어카드의 4개의 꼭지점을 오인식하고 사각형 찾는부분에 노이즈와 손실이 발생하여 정확한 사각형 찾는것을 방해하여 그부분은 보충할수 있는 연구가 필요 할거 같다. 손글씨 숫자 인식율은 KNN과 MNIST Database를 사용하였는데 인식을 하는 알고리즘과 트레이닝 데이터를 다양화해서 인식율을 높이는 방향으로 연구가 필요 할것 같다.
감사합니다.