문서 스캐너 구현
- 카메라로 촬영한 문서 영상을 똑바로 펴서 저장해주는 프로그램 구현
위와같이 바닥에 깔려있는 문서들을 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 를 그려준다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 영상의 특징 추출 _ 그래디언트와 엣지 검출 (0) | 2022.05.30 |
---|---|
[Open CV] 영상의 특징 추출 _ 영상의 미분과 소벨 필터 (0) | 2022.05.29 |
[Open CV] 기하학적 변환 _ 리매핑 (0) | 2022.05.27 |
[Open CV] 기하학적 변환 _ 어파인 변환과 투시변환 (0) | 2022.05.26 |
[Open CV] 기하학적 변환 _ 영상의 회전 (0) | 2022.05.25 |