Program/OPEN_CV

[Open CV] 기하학적 변환 _ 실전코딩 ( 문서 스캐너 )

사막여유 2022. 5. 28. 15:21
728x90

 

문서 스캐너 구현

 - 카메라로 촬영한 문서 영상을 똑바로 펴서 저장해주는 프로그램 구현

 

 

위와같이 바닥에 깔려있는 문서들을 affine 또는 perspective 변환을 통해 알아보기 쉽게 펴주는 변환을 구현한다.

 

구현 할 기능

 - 마우스로 문서 모서리 선택 & 이동하기

 - 키보드 ENTER 키 인식

 - 왜곡된 문서 영상을 직사각형 형태로 똑바로 펴기 ( 투시변환 ( Perspective ) )

 

일단 위와같은 기능을 구현하기 전 Open cv C++ 기반으로 만들어 본 투시변환 예제를 사용하여 나름대로의 

기능을 만들어보고 강의에 나오는 코드와 얼마나 다른지 비교해볼 예정이다.

 

내 코딩

내 코딩은 4개의 라인들로 이루어져 변환시키는게 아닌 

마우스 이벤트로 발생한 4개의 좌표값을 받아와 해당 좌표값을 Perspective 변환시켜 영상을 똑바로 펴주도록 구현했다.

 

클릭 - 자세히

 

위와같이 마우스 이벤트에 따라 현재 클릭한 부분을 빨간 원을 만들어 표시해주고 해당 좌표값을 SrcQuad 에 저장시켜

dstQuad 에 Perspective 변환시킨다.

 

 

 

 

강의 코딩

 

 마우스로 문서 모서리 선택 & 이동하기

  - 마우스 왼쪽 버튼이 눌린 좌표가 네 개의 모서리와 근접해 있는지를 검사

  - 특정 모서리를 선택했다면 마우스 드래그를 검사

  - 마우스 드래그 시 좌표 이동 & 화면 표시

  - 마우스 왼쪽 버튼이 떼어졌을 때의 좌표를 기록 

 

 왜곡된 문서 영상을 직사각형 형태로 똑바로 펴기 ( 투시 변환 )

  - 네 개의 모서리 좌표를 순서대로 srcQuad 배열에 추가

  - dstQuad 배열에는 미리 정의한 A4용지 크기의 네 모서리 좌표를 저장

  - srcQuad 점들로부터 dstQuad 점들로 이동하는 투시 변환 계산

  - 계산된 투시 변환 행렬을 이요하여 영상을 투시 변환하여 화면 출력

 

 

 * def drawRoi 

   Roi 박스를 그려줘야할 때 마다 호출해주는 함수로 corner 에 저장되어있는 좌표값을 

   4개의 라인으로 구성된 박스로 입력시켜주어 실시간으로 Roi를 그려줄 수 있게 표시함

   disp 변수를 보게되면 addWighted 함수를 사용한 것을 볼 수 있는데 

   실제로 사용하고자 할 때 기존 이미지를 가리지 않기 위해서 가중치 계산을 한 것이다.

   하지만 가중치 계산은 모든 픽셀을 대상으로 하기때문에 연산속도가 느려질 수 있는 점은 감안해야한다.

 

 * def on_mouse

   마우스를 클릭,드래그했을때의 이벤트 핸들러 함수로 현재 그려져있는 사각형의 모서리와의 거리를 계산하고

   계산 한 값이 원을 만들었을때의 지름 안으로 들어온다면 현재 원을 클릭했다는 것으로 인식한다.

   이후 드래그를 하면 현재 들어오는 마우스의 x,y 좌표값과 이 전 좌표값을 계산하여 drawRoi를 호출하여

   실시간으로 Roi 를 그려준다.

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90