김재형 부장 / MDS테크놀로지㈜
jaei@mdstec.com

화려한 액션과 정교한 그래픽으로 충분히 실현 가능한 사건들을 영상으로 담은 공상과학영화들은 무료한 현대인들에게 신선한 자극제가 된다. 이것으로 새로운 시대를 갈망하는 인간의 무한한 상상력과 희망을 생산하고 있다. 이미 실현된 것들은 우리 삶의 중요한 부분이라는 것도 잘 알고 있다. 세포분열을 통한 생명연장과 새로운 탄생이 있다면, 임베디드 디바이스를 통한 꿈의 실현과 새로운 시대가 다가오고 있다.

 



<그림 1 :영화 '터미네이터 2'의 한 장면, 모터사이클을 인식한 장면>


공상과학 영화의 수많은 장면에는 다양한 디바이스들과 이 디바이스들이 처리하는 영상인식 기술들이 핵심 소재로 사용되고 있지만, 정작 이러한 기술은 현실적으로 매우 어렵고 고난도의 소프트웨어와 하드웨어 기술이 요구된다. 이미 충분히 많은 디바이스들이 영상인식을 통한 새로운 기능과 UX를 제공하고 있으며, 영상데이터 처리를 위한 GPU(Graphic Procession Unit)와 고품질 카메라 센서기술, 그리고 이들을 사용할 수 있도록 하는 기반 소프트웨어를 통해서 다양한 응용프로그램들이 개발되고 있다.

다양한 영상인식관련 소프트웨어 라이브러리가 있지만, 여기서는 누구나 쉽게 사용할 수 있는 ''OpenCV(Open Source Computer Vision)''를 이용한 간단한 사례를 소개해 보고자 한다.

OpenCV는 실시간 컴퓨터영상처리를 위한 프로그래밍 라이브러리(API)로서 'BSD라이선스'에 의거해 무료로 연구 및 상업용 목적으로 사용 가능하다. 다양한 OS플랫폼의 다양한 프로그래밍 언어로 개발가능하며 2500개 이상의 최적화된 영상처리관련 알고리즘, 샘플코드와 문서들을 제공한다. 기능을 개선하고 새로운 언어와 알고리즘을 반영하여 지금도 계속 업데이트되고 있다.

 



<그림 2 :OpenCV로고 >


간단하게 OpenCV가 제공하는 일부 주요 핵심 기능(function)을 살펴보면 아래와 같다.

 



<표1 : OpenCV 주요 기능>

 



<그림 3 :이진화 처리 영상>



<그림 4 :윤곽선 처리>


<그림 5 :자동차 번호판 인식을 위한 영상처리 과정>

OpenCV가 제공하는 수많은 함수들 중 핵심 함수만을 이용해서 간단한 영상데이터(정적 영상)를 어렵지 않게 가공할 수 있지만, 실시간으로 변화하는 Stream 영상데이터에서 원하는 목표물만 인식 또는 추출하기란 여간 쉽지 않은 기술이다.

카메라센서의 정밀도도 영향을 주겠지만 조도와 온도 등 기상조건에 의한 영향도 절대 무시할 수 없다. 이러한 다양한 조건 속에서 원하는 목표물을 높은 확률로 인식하기 위해서 OpenCV의 다양한 알고리즘들은 개발자에 의해서 확장 또는 수정이 용이하다.

수년 전 필자는 손과 손가락 인식을 위한 간단한 프로젝트를 진행한 적이 있었다. 일반 영상카메라를 사용할 수도 있었지만, 다양한 조건에서 인식률을 높이기 위한 방법으로 Kinect for Windows센서의 Depth Camera데이터만을 이용했다.

비교적 간단한 방법을 사용하였기 때문에 누구나 쉽게 구현할 수 있다고 생각되어 과정을 소개해 보려 한다. 참고로 해당 프로젝트는 Microsoft의 Kinect for Windows센서와 이에 대한 SDK 그리고OpenCV라이브러리를 사용하였다.

먼저 Kinect for Windows센서를 depth stream data만 출력하도록 초기화 한다. 초당 약 30프레임의 depth data가 전달되면 이들 data중 적절한 인식거리의 data만을 수용하도록 추출했다. 이렇게 추출한 depth data를 OpenCV가 인식할 수 있는 이진화 영상 데이터로 변환한다. 이 과정에서 흔들림이 심한 depth data를 보완하기 위해 OpenCV가 제공하는 Dilate와 Erode필터링 기능을 활용했다.

더불어 이진화된 depth data중 가장 거리가 가까운 부분만 별도로 표시하도록 하면 <그림6>과 같은 결과물이 출력된다.

 



<그림 6 : depth stream data중 특정 거리의 data만을 추출하여 이진화>

참고로 Dilate와 Erode필터링 기능은 주어진 영상 데이터를 확장하거나, 축소하기 위한 용도로 사용하며 이들 기능을 적절히 사용하면 불필요한 성분(noise)을 제거하는데 효율적이다.

영상처리에서 빼놓을 수 없는 또 하나의 핵심 포인트는 '레이블링(Labeling)'이다.

 



 <그림 7 : 레이블링이란?, '마틴의블로그'에서 발췌, http://martinblog.tistory.com>

다양한 사물 추출 방법과 기능들이 있겠지만, 레이블링은 주어진 이진화된 영상데이터에서 다양한 위치로 분산된 각각의 pixel들의 근접여부를 계산하여 하나의 사물(덩어리)인지 판별할 수 있는 알고리즘이다. 이를 이용해서 불필요한 성분(noise)을 제거하는 것은 물론, 특정 사물에 대한 판별 조건으로 사물을 인식하기 위한 기반 기능으로 활용된다.

이진화된 depth데이터에서 손을 추출하기 위한 기본 레이블링을 완료하고, 이를 관심영역(ROI : Region Of Interest)으로 지정하면 <그림 8>과 같은 결과가 출력된다.

 


<그림 8 :레이블링과 ROI처리 결과>

지금까지 추출된 영상데이터만으로는 사물이 확실히 손인지 파악할 수가 없다.

다만 손으로 인식하기 위해 불필요한 성분들을 제거한 것뿐이다. 손으로 인식하기 위한 가장 좋은 방법은 손으로 예측되는 ROI 영상데이터에서 손가락 부분을 추출하는 것이다. 앞에서 언급한 것처럼 가장 기본적이고 간단한 방법으로 손가락 추출 방법을 사용해 보았다.

추출된 영상에서 pixel기반으로 중심점을 우선 찾는다. 그리고 중심점과 가장 먼 pixel(x축으로)과의 거리를 계산하고 그 사이에서 Line을 그리면 <그림 9>와 같은 출력물이 나타난다.
 


<그림 9 :손가락 추출을 위한 중심점 찾기>


그려진 Line길이의 절반에서 약 1.5배 값을 지름으로, 앞에서 찾았던 중심점으로부터 원을 그리면 손가락 인식을 위한 기본 패턴이 생성된다. 출력물은 <그림 10>와 같다.


 

<그림 10 :손가락 추출을 위한 기본 패턴>

여기서 다시 손가락 추출을 위한 원과 추출된 손 영역의 영상데이터를 AND연산하면 손가락인식을 위한 이미지가 생성된다. 이렇게 얻어진 결과는 <그림 11>과 같으며, 이 영상을 다시 레이블링 하면 손가락 개수가 파악된다.

 


< 그림 11 : 손가락 개수 인식을 위한 추출 패턴 >

이와 유사한 방법으로 손목 부분을 제거하여 불필요한 성분을 제거할 수 있으며 이렇게 나타난 최종 결과물은 <그림 12>와 같다.

 

<그림 12 :최종 손가락 인식 패턴 >


지금까지 기본적인 방법으로 손과 손가락을 인식하는 방법을 소개했다. 하지만 실제로는 단순히 손가락의 개수를 파악하는 것이 아닌 손 모양과 손가락의 제스처를 인식하기 위한 다양한 알고리즘이 사용되고 있다.

얻어진 손 영상데이터에서 손과 손가락에 대한 외곽선(Convex Hull)을 구한다음 중심점으로부터 멀리 떨어진 pixel과 Convex Hull point를 참조로 손가락의 위치를 구한다. 이 외에도 미리 입력된 손 모양의 패턴을 통해서 이를 비교 분석하여 손가락 제스처를 인식할 수도 있다. 

 


<그림 13 :손과 손가락 제스처 인식을 위한 다양한 인식 기술>


손과 손가락 인식은 영상인식 부문에서 가장 기본적인기술이라고 감히 말하고 싶다.
지금도 수화 인식을 위한 높은 인식률의 소프트웨어가 개발 중이고, 이미 상용화 된 제품도 많다. 차 번호판 인식 기술은 이미 보편화 되어 주위에서 쉽게 찾아 볼 수 있으며, 차선 이탈 방지를 위한 기술들이 내비게이션에 보급된 채 현재 판매 중이다. 이와 더불어 차선을 가로지르는 행인들과 신호체계를 인식해 운전자에게 통보하는 시스템도 일부 상용화된 상태다.
 


<그림 14 :차량용 보행자 인식 기술 >            출처 : www.mobileye.com

영상인식 처리 프로그래밍에서 가장 중요한 요소는 소프트웨어 알고리즘임을 짐작했을 것이다. 원하는 알고리즘의 결과를 얻기 위해서 다양하고 복잡한 수학 공식이 사용된다. 이들 수학공식을 교과서의 수학적 사고방식으로 이해하려면 굉장히 어렵고 복잡하다. 하지만 개발자 입장에서 프로그래밍으로 코드로 이해하는 것이 한결 편안함을 알 수 있다.

OpenCV는 개발자의 입장에서 다양한 수학공식을 프로그래밍 코드로 제공하기 때문에 영상처리 부분에 대해 보다 쉽게 소프트웨어 개발을 가능하게 한다. 실제로 다양한 영상인식 소프트웨어들을 스마트폰 app에서 쉽게 찾아볼 수 있으며 '증강현실'이라는 새로운 단어로 더 잘 알려져 있다.

스마트폰에 포함된 다양한 센서들의 정보와 카메라 영상데이터를 처리하여 가상의 새로운 공간을 보여주거나 경험하게 한다. 최근에는 광고 매체로도 많이 활용되고 있다.

 


< 그림 15 :증강현실 사례, 가상 드레스 >

국내에서는 사례를 찾아보기 힘들지만, '가상 드레스'기술은 몇몇 국가에서는 이미 대중화된 상태다. 새로운 상품을 고르는 소비자들에게 호기심을 유발하고 실제 판매로까지 연결되는 등 그 효과가 입증되고 있다.
 

 


<그림 16 :증강현실 사례, 동영상광고 Green Screen >

우리는 영화나 인터넷 등을 통해 앞으로 다가올 미래에 어떠한 기술과 디바이스들이 사용될지 점쳐 보기도 하고 더 앞선 기술의 탄생과 새로운 세상에 대한 꿈을 꾸기도 한다.

오래 전부터 상상해오던 기술들이 점점 현실화 되고 있는 가운데, 앞서 설명한 영상인식 솔루션도 머지않아 다양한 임베디드 디바이스에 적용되며 우리의 일상생활을 자연스럽게 변화시키고 혁신시킬 것이다. 이러한 첨단 기술에 대한 호기심과 도전이 있는 이상, 우리 인간 생활에 산재되어 있는 임베디드 디바이스 역시 끊임없이 진화할 것이다.


MDS테크놀로지 홈페이지: www.mdstec.com
윈도우임베디드 솔루션: www.embedsolution.com
윈도우임베디드 개발자 커뮤니티: www.iwecom.co.kr


회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지