임베디드소프트웨어 공모대전 수상작



임베디드소프트웨어 공모대전 수상작2  최우수상
Dancer Robo: 악보를 인식하여 춤을 추고 노래하는 지능형 감성 로봇


지난 호부터 시작한 제 7회 임베디드소프트웨어 공모대전 입상작 소개 두 번째로 최우수상을 받은 로보사피엔스팀의  Dancer Robo를 소개한다.

글: 로보사피엔스(박도현 외 4명)
자료제공: 임베디드소프트웨어선업협의회
www.kwsic.or.kr


Software 개요


·지능형 휴머노이드가 주어진 악보를 인식하여 분석하여 데이터화 한다.
·전체 곡의 박자와 멜로디 정보를 시스템이 이해할 수 있는 데이터로 바꾸어 저장해 놓는다.
·저장된 악보 정보 데이터를 통하여 소리를 낸다.
·분석된 멜로디와 박자대로 음과 시간을 맞추어 노래를 한다.
·저장된 악보 정보 데이터를 통하여 동작한다.
·각 멜로디와 박자에 해당하는 동작을 설정하여 저장된 악보 데이터대로 각 동작을 호출하여 춤을 춘다.

2기의 휴머노이드가 동기화하여 같은 동작의 춤을 춘다. 한 기의 로봇이 악보를 보고 춤을 추고 있을 때, 다른 한기의 로봇이 악보 데이터를 블루투스를 통해 전달받아 앞서 춤을 추던 로봇의 동작에 맞춰 같은 춤을 춘다.

개발 목적


카메라를 이용하여 악보를 촬영하고, 촬영된 이미지를 분석하여 악보의 멜로디, 박자 등의 정보를 얻을 수 있다.
음의 길이(박자)와 음의 높낮이에 맞은 음을 내고 지정된 춤을 동작할 수 있다. 블루투스 네트워크 전송을 통하여 2기의 로봇이 같은 춤과 노래를 하도록 동기화 할 수 있다.
악보인식 기술의 연구는 로봇에서뿐만 아니라 자동 연주 시스템 등의 다양한 소프트웨어의 모듈로써 활용될 수 있다.
로봇에게 필수적인 다양한 영상처리 기술을 다루어 봄으로써 단순한 개체 인식 수준을 넘어서 인쇄물을 읽고, 반응하는 분야에 대한 연구를 촉진시킬 수 있다.

Software 내용


그림 2. 시스템 구조

구성
시스템 구조

휴머노이드의 시스템은 ARM9을 기반으로 Qplus 운영체제 상에서 동작된다. 그림 2는 개발한 시스템의 전체적인 구조도다. 오픈 소스로 공개되어있는 openCV 라이브러리를 Qplus 위에 올려 로봇의 악보 영상처리를 위한 다양한 모듈을 사용하였다. Qplus에서 제공하는 블루투스는 두 로봇간의 무선 통신을 수행하여 로봇 동기화 모듈의 구현을 위해서 사용하도록 하였다. 로봇의 동작과 소리들은 Qplus내에 있어서 동작, 소리 제어 모듈에 의해서 호출된다.

소프트웨어 구조
그림 3. 소프트웨어 구조
메인 모듈에서는 각 모듈을 순서대로 호출하여 단계별로 수행하게 된다. 또한 모든 모듈에서 필요로 되는 이미지의 로딩이나 각 모듈의 인자들을 만드는 일들을 수행하게 된다.
Initial Processing Module은 로봇의 초기 동작을 위한 모듈이다. 로봇의 외부로부터의 어떤 입력에 따라서 악보를 촬영하고 촬영된 영상을 가지고 나머지 모듈들을 호출하여 모든 작업을 시작하게 된다.
Image Recognition Module은 촬영된 악보 영상을 분석하여 뒤에서 사용할 수 있도록 추상화와 데이터화 하는 역할을 하는 모듈이다. 악보의 음계와 박자 등에 대한 정보들이 메모리 상에 저장되고, 뒤의 모듈은 이 데이터를 바탕으로 동작하게 된다.
Dance Movement Synchronization Module은 현재의 로봇이 춤과 노래를 시작하기 전에 호출되어 저장되어있는 악보 데이터를 다른 로봇에 전송한다. 전송은 로봇 간의 블루투스 네트워크를 통하여 전송되며, 데이터를 받은 로봇은 해당 데이터를 이용하여 Dance & Music Generation Module의 프로세스를 수행하게 된다.
Dance & Music Generation Module은 저장된 악보에 대한 데이터를 가지고 음원과 동작을 호출하게 된다. 모든 데이터가 소비될 때까지 각 음원과 동작을 반복호출 한다.


제어 시스템 구조


그림 4. 제어 시스템 구조
그림 4는 주제어 보드인 MF-AI2와 휴머노이드의 컨트롤을 담당하는 MR-C3024F 사이의 구조를 나타낸다. 자세한 내용은 다음과 같다.

·MF-AI2: 적외선 센서(ADC) 모듈, UART 모듈, 카메라(CMOS) 모듈, 오디오 모듈, WIRELESS LAN 모듈, 블루투스 등을 제공하고 있는 주제어 보드 MF-AI2는 시리얼을 통해서 MR-C3024F와 통신을 한다. 또한 개발의 용이성을 위해서 무선 AP와 통신이 가능한 Wireless Lan이 있고, 휴머노이드의 위치와 주변 상황을 인식하기 위한 세 개의 ADC 적외선 센서를 탑재하고 있다.
·MR-C3024F: 휴머노이드의 동작을 제어하기 위해 휴머노이드의 각 관절을 제어한다. MR-C3024F는 주제어 보드에서 보내준 동작 명령 코드를 수행하기 위해 휴머노이드의 17개 서보모터를 효율적으로 제어하여 휴머노이드의 동작을 수행하게 된다.


기능

초기 수행시작


그림 5. 초기 수행 프로세스

시작: 휴머노이드 동작 전에는 미리 제작된 스튜디오 내에서 해야만 한다. 그 이유는 빛이나 악보영상과의 거리, 등의 다양한 예측하기 어려운 환경적인 문제가 발생하였을 때 정상적으로 동작하지 않을 수 있기 때문이다.

그림 6. 악보영상 촬영용 스튜디오 전경

그림 6과 같이 스튜디오는 세트와 뒷부분의 조명을 이용해서 악보에 빛이 고르게 비추고 있는 상황에서 촬영하도록 한다.
사진을 가장 크게 찍기 위한 위치는 30cm 이다. 촬영된 영상의 크기와 질을 최고로 하지 않으면 올바르지 못한 입력이 들어올 수 있기 때문에 촬영하는 거리를 일정하게 하였다.
·외부 입력: 휴머노이드는 거리 센서를 이용하여 오른쪽 센서에 거리 감지 값이 일정 수준이상 작아지면 수행을 시작하도록 하였다.
·영상 촬영: 프로세스 시작과 함께 로봇은 CMOS 카메라를 이용하여 정면의 악보를 촬영한다.
·파일 변환: 카메라를 통하여 촬영된 이미지는 yuv파일로 만들어진다. 오픈 소스인 'openCV'를 기반으로 이미지를 처리하기 위해 이후의 모듈들이 사용할 bmp파일로 변환한다.
스튜디오 내에서는 춤 동작을 하기에는 비좁기 때문에 스튜디오 밖으로 뒷걸음 친다.

악보영상 인식 및 분석

그림 7. 악보영상 인식 프로세스

시스템의 핵심적인 부분이라고 할 수 있는 악보 영상을 분석하는 기능이다. 초기 수행에서 들어온 영상을 수치화하여 구조체로 저장해 놓는다. 각 단계에 대한 세부적인 순서도는 뒷부분에서 다시 설명하도록 할 것이다. 각 단계에 대한 간략한 기능설명은 다음과 같다.

·전처리 단계: 전처리 단계에서는 각 음표의 음계와 박자의 데이터를 추출하기 위한 준비 단계를 하는 곳이다. 입력된 악보영상의 상태에 따라서 명암 조정과 기울임 보정 단계를 거친 후에 악보 분석에서 불필요한 문자들과 기호들을 삭제하고 마지막으로 오선을 삭제한다.
·인식 단계: 인식 단계에서는 음자리표, 조표, 음표와 쉼표들을 개체화 하여 악보에 대한 데이터를 추출해내는 기능을 한다. 모든 악보에 대한 정보들은 integer형이나 double형으로 수치화 하여 저장하며, 값의 의미하는 것에 대한 프로토콜은 다음과 같이 정하였다.

음자리표

조표

- 장조를 나타낼 때는 샵이나 플랫의 개수 * 조표값을 구분하고 다장조는 0으로 하였다.

음표의 종류

음표의 음계

- 옥타브 정보는 구조체의 속성으로 따로 지정하였다.
쉼표

후처리 단계
후처리 단계에서는 악보에 대한 데이터의 마지막 작업을 하는 단계이다. 조표에 따른 음계 정보 변경과 같은 과정을 수행한다.

악보상의 박자에 맞추어 춤추기(모션 제어)
주제어 보드(MF-AI2)와 컨트롤 보드(MR-C3024F)의 통신


그림 8. MF-AI2와 MR-C3024F의 명령 코드 송수신

그림 8은 주제어보드인 MF-AI2에서 컨트롤 보드인 MR-C3024F로의 명령코드 전달 과정을 보여준다. MF-AI2에서 휴머노이드를 움직이고자 하는 동작 명령 코드를 MR-C3024F에 전송하면, MR-C3024F는 수신한 명령 코드에 대한 확인 작업을 한다. 그 후에 수신한 코드가 정상 확인되면 수신 코드의 수행을 하고, 수행이 완료되었을 경우 종료코드를 MF-AI2에 전송하고, MF-AI2는 종료 코드를 수신하여 휴머노이드의 움직임이 종료되었다는 것을 알 수 있다.
로봇의 기본 동작 제어 구조는 그림 9와 같다.


그림 9. 휴머노이드의 기본 동작 흐름


주 제어보드는 악보 데이터를 이용하여 모션 코드를 결정한다. 이 모션 코드는 차례대로 로봇제어보드로 전송되며, 실제 로봇이 연속적으로 해당 춤 동작을 춘다.그림 9에는 나타나있지 않지만 모션 코드의 호출과 동시에 음원을 호출하여 소리를 내게 된다. 악보를 춤 동작으로의 변환은 음계와 박자, 그리고 악보 전체에 박자정보를 이용한 동작 맵핑 방식으로 구현하였다. 그림 10은 4/4박자 악보에서 4분 음표에 음계가 미일 때의 코드 호출과정의 예이다.
그림 10과 같이 저장되어 있는 악보 데이터의 한 개의 음표로부터 위와 같은 과정으로 모션 코드를 선택하여 호출한다.

그림 10. 모션코드의 맵핑의 예

그러나 위와 같은 방식만 적용하여 모션을 결정할 경우에 로봇의 춤 동작은 동일한 음에 의한 반복이 많아진다. 이러한 춤 동작이 단조로워지는 것을 막기 위하여 마디마다 다른 음표를 선택하도록 하였다.

그림 11. 각 마디별 선택 음표


즉 첫 번째 마디에서는 1번째 음표를 기준으로 두 번 째 마디에서는 2번째 음표를 기준으로 음표를 선택하게 한다. 그리고 호출되는 춤 동작은 위의 경우 4/4박자 동안 연속동작이 된다. 로봇은 위와 같은 방식으로 춤 동작을 맵핑하게 되어 총 105가지의 춤 동작을 가지고 있고, 각각의 동작은 2박, 3박, 4박의 시간 동안의 연속 동작을 가진다.

악보상의 음악 연주하기
본래는 동작 제어 기능과 마찬가지로 로보베이직에서 제공하는 MUSIC 명령어를 이용하여 수행하려고 했지만 로보베이직에서 동시 동작을 지원하지 않아서 ALSA API를 이용하여 음을 만들고 각 음표와 박자에 따라 지정된 시간만큼 소리를 내도록 구현하였다. 그림 12은 음계와 박자에 따른 맵핑 방식을 보인다. 이 예에서는 '레' 음에 '4분음표'일 경우에 해당 코드를 호출하는 과정을 보여준다.

악보영상 분석 데이터 전송

그림 12. 음계와 박자에 따른 음원 호출 과정
-아직 구현되지 않은 미구현 모듈이다.
-데이터의 전송 및 수신 모듈을 블루투스를 이용하여 데이터를 전송하고, 소리와 동작 수행 중 로봇 간의 데이터 전송으로 동기화 수행을 할 예정이다

프로그램 사용법 (Interface)


그림 13. 인터페이스 구조

전체적인 인터페이스
사용자 시나리오
⑴ 입력되는 악보 이미지의 상태에 따라 인식이 불가능 할 수 있기 때문에 로봇은 스튜디오의 정해진 위치에서 촬영을 수행해야 한다.


그림 14. 수행 시작 전 시작위치

⑵ 로봇을 작동 시키는 방법으로 왼쪽 팔의 적외선 센서를 이용하였다.
⑶ 스튜디오 내는 좁기 때문에 촬영을 하고, 로봇은 뒷걸음으로 스튜디오를 빠져나간 후 춤과 노래를 시작한다.

개발환경

하드웨어

그림 15. 메탈 파이터
메탈 파이터는 MR-C3024F 휴머노이드 컨트롤러 보드를 탑재한 최신 2족 보행 휴머노이드다. 또한 이 MR-C3024F 휴머노이드 컨트롤러 보드는 장착 된 24개의 서버모터를 동시에 제어가 가능하며, 6옥타브 멀티미디어 연주음, 로보베이직을 이용한 직접 제어 및 프로그램을 작성할 수 있다. 다양한 외부장치의 연결이 가능하며 자이로 센서 및 초음파 입력 센서, 원격 조종기 수신 기능 등 다양한 기능을 포함하고 있다.


ATMEL RISC MCU CPU
64KB 플래시 프로그램 메모리
HMI(HITEC-MONOROBOT Multi-protocol Interface 탑재)
서버모터(24)개 동시 구동 및 파라미터 설정 가능
32개 디지털 입출력 (I/O) 포트
자이로 센서 4개 연결 포트
LCD모듈 출력기능 (mr-16202) 인터페이스 가능
적외선 리모콘 인터페이스
고속 직렬 통신(UART)기능
초음파 센서 모듈(SRF04)인터페이스 가능
3채널 PWM 출력
ROBOBASIC/ROBOSCRIPT/ROBOREMOCON 프로그램 사용
8채널 A/D 변환 포트
펌웨어 업데이트 가능
`6옥타브의 비에조 연주기능

표 1. MR-C3024F 제품사양

 

주 제어보드 (MF-AI2)


그림 16. 지능형 휴머노이드 주제어 보드(MF-AI2)


표 2. 주제어보드 사양(MF-AI2)

소프트웨어
운영체제(Qplus)

기술 개요
-Qplus는 지능형 휴머노이드나 셋탑박스 같은 다양한 임베디드 기기들을 지원하고 있는 리눅스 기반의 임베디드 운영체제이다.
-단일한 인터페이스 API를 지원을 목표로 하여 플랫폼에 관계없이 포팅이 가능하도록 개발을 수행하고 있다. 국제 표준규격인 POSIX와 호환 가능하다.
-정보 가전 기기의 국제표준 포럼인 CELF(Consumer Electronics Linux Forum)의 공식 릴리즈 패치를 지원한다.
-Qplus는 풍부한 응용 프로그램의 지원 및 빠른 업그레이드 등의 리눅스 시스템의 장점을 그대로 살리고 있다.
-또한 일반적인 리눅스 시스템의 취약한 기능들을 보완하여 임베디드 운영체제로서의 기능을 충실하게 제공한다.
-Qplus는 규모에 따라서 크게 표준형, 마이크로형, 나노형의 3가지 형태가 있다.
-표준형은 DTV 셋탑박스, 홈서버 등과 같은 내장형 시스템을 주 대상으로 하며, 마이크로형은 실시간성이 강화되는 지능형 휴머노이드나 텔레매틱스 단말, 스마트 폰과 같은 소형기기에 적합하다.
-나노형 Qplus는 유비쿼터스 컴퓨팅의 핵심인 스마트 센서 네트워크를 구성하는데 사용된다.
-표준형과 마이크로형의 경우는 정확한 분류를 하기 보다는 하드웨어 단말과 응용 분야의 특성에 맞춰서 권장 소프트웨어 스택이 존재하므로 각각에 특성에 알맞게 표준형 및 마이크로형 Qplus가 탑재될 수 있다.
-또한 Qplus는 사용 분야에 따라서 구성을 달리하여 크게 두 가지의 Edition으로 나뉜다.
-일반적인 정보 가전 기기들을 지원하는 것을 목표로 하는 CE(Consumer Electronics Edition)과 스마트폰, 텔레매틱스 단말 등을 지원하고자 하는 ME(Mobile Edition)의 두 가지 형태로 나누어, 임베디드 시스템 개발자들이 목적에 맞는 Edition을 사용하여 쉽고 편한 환경을 제공하고 있다.

오픈소스 (OpenCV)

OpenCV의 개요
-OpenCV는 인텔사에서 공개한 오픈소스 컴퓨터 비전 라이브러리이다.
-인텔의 주도 하에 실시간 컴퓨터 비전 라이브러리를 목표로 개발되었기 때문에 다른 오픈소스 라이브러리보다 더 체계화된 것이 장점이다.
-전 세계의 영상 처리, 컴퓨터 비전 개발자들이 지속적으로 개발하고 발전시키고 있다.

OpenCV의 특징
-C/C로 개발된 오픈소스 컴퓨터 비전 라이브러리이다.
-최적화한 관계로 시시간 애플리케이션에 적합하다.
-OS, 하드웨어, 창 관리에 독립적이다.
-Low-level과 High-level API를 지원한다.
-인텔의 특정 프로세서 전용 IPP(Integrated Perfor mance Primitives)의 인터페이스와 호환된다.

OpenCV의 요소
-영상 데이터의 간편한 조작 / 영상과 비디오 입출력 지원
-행렬과 벡터 조작, 선형 대수 루틴 지원
-다양한 동적 데이터 구조의 지원
-기본 영상처리, 컴퓨터 비전, 기계 학습 등의 관련 함수 -기본 GUI(영상/비디오 출력, 키보드와 마우스, 트랙바 제어)



그림 17. 파일 구성도


로보베이직(ROBOBASIG v2.8)

로봇의 동작 구성과 음원의 작성은 미니로봇에서 개발된 로보베이직의 동작제어 모듈과 음악제어 모듈에 의해서 작성 호출되었다.
로보베이직의 개요
-로보베이직은 기본적인 BASIC 언어의 문법에 로봇 제어를 위한 전용의 명령어가 추가되어 있으며, 다관절 로봇 제어를 위한 모터 실시간 제어 창을 제공하여 로봇 동작 프로그램을 쉽게 작성할 수 있게 한다.

로보베이직의 제공 명령어 및 기능
-선언 명령어 / 흐름 제어 명령어를 통하여 일반적인 프로그램 작성 가능
-디지털 신호 입출력(I/O) 명령어 제공
-메모리 관련 명령어 제공, 램과 롬에 대한 읽기/쓰기 가능
-LCD 모듈 제어 명령어 제공
-모터 제어 관련 명령어 제공
-음악 제어 명령어 제공
-외부통신 명령어 제공
-아날로그 신호처리 명령어 제공

프로그램 설명

파일구성

주요 함수의 흐름도

메인 모듈


그림 18. 메인 함수 기본 순서도

그림 18는 시스템의 대략적인 순서를 나타낸다. 크게 초기수행, 악보인식, 동작 및 소리 제어, 데이터 송수신 모듈로 나뉘고, 각각의 모듈은 메인 함수에서 순차적 또는 비순차적으로 수행된다. 
초기 수행에서 로봇의 작동 시작과 내부적인 파일 변환을 수행하고, 이미지 분석을 순차적으로 수행한다. 동작 및 소리 단계에서는 동시에 수행되며 서로간의 싱크를 맞추어야 하기 때문에 동시에 수행된다.
마지막 데이터 송수신 모듈은 동작 및 소리 단계의 수행 이전에 악보 정보 데이터를 다른 로봇에 전송하고, 동작 제어와 소리 제어 모듈 내에서 전송된다.

초기 수행 모듈
그림 19은 로봇의 초기 수행 시작에 관련된 순서도이다. 


동작 제어

⑴ 동작의 시작을 알리는 방법은 왼쪽 팔에 있는 적외선 센서를 이용하였다. 기존에는 리모콘을 이용한 방법과 소리를 이용한 방법을 선택했으나, 리모콘을 사용할 경우 내부에서 동작을 호출할 때 모드가 달라서 두 가지를 모두 사용할 수 없었다. 또한 소리는 로보베이직에서 명령어로 지원하지 않았다. 따라서 로봇은 왼쪽 팔의 적외선 센서의 거리 값이 일정 수준이상 작아졌을 때 행을 시작한다. 이것은 사람의 손이나 물체를 이용하여 할 수 있다.
⑵ 수행이 시작되면 로봇은 촬영을 하고, 내부적으로 파일을 변환하고, 악보 인식 모듈을 수행한다.
⑶ 춤을 추기 위하여 뒷걸음으로 스튜디오 밖으로 빠져 나간 후 이후의 동작들을 수행한다.
파일 변환
파일 변환은 영상 촬영 시에 yuv 포맷으로 저장되기 때문에 openCV를 이용하여 이미지를 프로세싱하기 위해 RGB 값을 변경하고, 디버깅을 용이하도록 하기 위해 bmp파일로 변환하였다.

악보 인식 모듈

입력으로 들어오는 악보 이미지 파일을 로봇이 인식할 수 있는 음계와 박자 정보로 데이터화 하는 역할을 수행한다.

⑴ 전처리 단계: 악보 이미지의 조표와 음표 등의 찾아서 분석하기 위한 사전 작업들을 수행한다.
⑵ 인식 단계: 데이터로 추출해야 하는 개체들로 구성된 이미지를 이용하여 각 개체에 접근하고 접근된 개체를 구분하여 데이터화 하는 일을 수행한다.
⑶ 후처리 단계: 최종적으로 데이터를 변환하는 일을 수행한다. 모든 데이터들이 인식된 이후에 반음을 올리거나 내리는 일들을 수행한다.

모든 단계가 종료되면 악보 전체가 데이터화 되어 저장된다. 각각의 단계에 대한 상세한 흐름 및 알고리즘은 아래에서 설명하겠다.

·전처리 단계(Level 1)

그림 20. 전처리 단계 순서도 및 산출물

그림 20는 전처리 단계에서의 순서도와 산출물을 보인다.
각 단계의 영상 처리를 통하여 데이터 추출을 위한 개체 이미지만을 남기고 모두 삭제하게 된다.
Level2에서는 각각의 단계에 대한 상세한 알고리즘을 설명한다. 

·이미지 보정(level 2)
이미지 보정 입력되는 영상이 카메라를 통하여 들어오기 때문에 명암이 일정치 않은 부분을 보완해 주는 것이다. 명암이 일정치 않은 영상은 이진화 과정에서 원하지 않는 부분이 검게 칠해는 문제가 생길 수 있기 때문에 올바른 결과를 얻기 위해 매우 중요한 부분이다.

- 1차 영상보정 알고리즘
⑴ 우선, 카메라를 통하여 들어오는 입력 영상의 RGB 값들의 패턴을 분석하여 이진화에서 문제가 생길 만한 RGB값들을 찾았다.
⑵ 내부에서 루프를 돌아 영상은 모든 RGB 값들을 각각 점검하여 해당 값들을 흰색이 혹은 검은 색으로 변환시킨다.

- 2차 영상보정 알고리즘
⑴ 1차 영상 보정만으로는 부족하기 때문에 Sharpening 기법을 이용하여 영상에 존재하는 Edge들을 좀더 뚜렷하게 부각시키는 작업을 수행한다.
⑵ 이 작업을 통하여 악보 영상의 가는 선들과 음표 등의 개체들이 이진화 시에 검색이 될 확률을 높인다.
⑶ Sharpening는 OpenCV에서 지원하는 cvMat() 함수와 cvFilter2D() 함수를 이용하여 수행한다.

·영상 이진화(level 2)
영상 이진화는 이후의 모든 영상 처리 작업을 쉽게 하기 위하여 값을 0과 255의 두 개의 값으로 변환하는 작업이다. 컬러 화소를 처리할 필요가 없는 작업이기 때문에 영상을 이진 영상으로 변환하여 이미지를 다루면 쉽게 작업할 수 있다.
이진화 작업은 openCV에서 제공하는 cvThreshhold() 함수를 이용하여 쉽게 변환 할 수 있었다.

·보표 검출 및 제거(level 2)
보표란 악보에서 오선 주위에 존재하는 음과 박자를 나타내는 기준이 되는 이미지들을 이야기한다. 실제로 악보의 데이터를 추출하기 위해서는 이러한 부분만을 필요로 하기 때문에 악보 분석에 방해가 되는 노래의 제목과 가사 등을 삭제 하는 부분이다. 또한 이곳에서 오선의 위치를 검출하여 위치를 기억해둔다. 대략적인 알고리즘은 다음과 같다.

⑴ 원영상 전체를 이용하여 히스토그램을 그린다.
히스토그램이란 X축 또는 Y축 방향으로 검은 화소 수를 세어 배열에 넣고, 이미지의 특성이나 패턴을 이용하여 다양한 영상처리를 하는 작업이다.
⑵ 히스토그램을 통하여 오선들의 위치를 알아낸다.
본 프로그램에서는 기존 영상의 가로 길이의 70% 이상을 차지할 경우에 오선으로 인식하도록 구현하였다. 오선의 위치는 처음 시작되는 위치의 y좌표 값만 가진다.
⑶ 오선에 대한 다양한 값들을 계산하여 저장한다.
오선들의 위치 값을 이용하여 오선간의 평균 간격과 보표의 개수, 평균 오선의 길이 한 개의 보표의 높이 등의 다양한 값을 계산한다. 이 값들은 나중에 할 영상처리에서 이용한다.
⑷ 오선들의 위치를 이용하여 보표의 상위와 하위의 불필요한 부분들을 삭제한다.

- 삭제 알고리즘
⑴ 이미지의 첫 점부터 첫 보표의 최상단점까지 모두 삭제한다.
⑵ 첫 보표의 최하단점을 구한다.
⑶ 두 번째 보표의 최상단점을 구한다.
⑷ 첫 보표의 최하단점부터 두 번째 보표의 최상단점까지 삭제한다.
⑸ ⑴~⑷를 보표의 개수만큼 반복한다.
⑹ 마지막 보표의 최하단점에서 전체 이미지의 끝점까지 삭제한다.

·오선 제거
많은 악보 인식에 관련된 논문에서 오선제거는 쉽지 않은 첫 번째 관문이다. 그러나 우리의 악보인식 알고리즘에서는 보표제거에서 저장된 오선의 위치와 두께를 이용하여 쉽게 오선을 제거하도록 구현하였다.

·인식 단계 (Level 1)
 개체를 박싱한 후의 단계는 각각의 개체하나를 가지고 정보를 추출하여 데이터화 시키고, 모든 개체의 정보를 가져올 때까지 같은 과정을 반복 수행한다.
입력으로 들어오는 악보 이미지의 크기가 각각 다르기 때문에, 일관된 인터페이스로 서로 다른 크기의 악보 이미지를 처리하기 위해서는 이미지 리사이징 작업이 반드시 필요하다. 우리는 이 리사이징의 기준으로 하나의 표준 오선 높이를 정하여서, 입력으로 들어온 악보의 오선 높이가 그 표준 오선 높이와 일치되도록 입력 이미지를 확대 또는 축소하도록 하였다. 이미 위의 전처리 단계에서 오선의 위치 정보와 간격 정보를 가지고 있기 때문에, 어렵지 않게 구현이 가능하였다. 이미지 확대나 축소를 위한 알고리즘은 openCV 에서 제공하는 cvResize() 함수를 이용하였다.

그림 21. 이미지 리사이징
·개체 박싱(level 2)
악보의 각 음표 및 쉼표와 같은 기호들을 인식하고 분석하기 위해서는 원본 악보 이미지 내에서 해당 악보 기호들을 찾아내고 이들을 각각 참조할 수 있어야 한다.
악보 기호들을 추출하기 위해서 openCV 에서 제공하는 cvFindContours() 라는 외곽선 추출 함수를 사용하였다. 그런데 입력이 카메라 영상이기 때문에 악보 기호에서 어떤 특정 픽셀의 값이 왜곡되어서 악보 기호가 끊어져 보인다던가 하는 현상이 발생하는 경우가 상당히 많았다.
심한 경우 높은음자리표 기호 하나가 수십 개의 개체로 분할되는 경우도 발생하였다. 따라서, 단지 외곽선 추출 함수만으로는 올바른 개체의 검출이 불가능하였다. 그래서 외곽선 추출로 얻어진 개체들의 정보를 이용하여 인접한 개체들을 통합하는 등의 추가적인 작업을 해 줄 필요가 있었다. 우리의 개체 박싱 알고리즘을 요약하면 다음과 같다.
⑴ cvFindContours() 함수를 이용하여 원본 이미지에서 모든 외곽선을 추출한다.
⑵ 추출된 외곽선 좌표를 이용하여, 각 외곽선 영역을 사각형 영역으로 변환한다.
⑶ 오선위치 정보를 참조하여 현재 변환된 영역이 몇 번째 오선 그룹의 영역인지를 판단하여, 해당 오선 그룹의 리스트에 집어넣는다.
⑷ 모든 외곽선 영역에 대하여 ⑵ ~ ⑶의 과정을 반복한다.
⑸ 각 오선 그룹 리스트를 X좌표의 오름차순으로 정렬한다.
⑹ 각 오선 그룹 리스트의 항목들을 순차적으로 돌면서, 서로 인접한 영역을 하나의 영역으로 통합한다.

·음자리표, 조표 구분 (level 3)

그림 22. 개체 박싱 알고리즘

 새로운 악보의 시작에는 항상 음자리표가 존재한다. 각각의 보표는 배열로 구분되어 있기 때문에 새로운 보표를 인식하는 루프의 첫 단계에서는 음자리표를 구분한다.
- 높은 음자리표와 낮은 음자리표의 구분 방법
높은 음자리표는 악보 상에 나오는 모든 개체 중에서 가장 높이가 높다. 박싱 된 이미지의 높이가 한 개의 보표의 높이보다 더 클 경우에는 높은음자리표로 더 작을 경우에는 낮은음자리표로 인식한다.

- 조표 구분
조표의 인식은 보기와는 다르게 매우 복잡하다. 조표는 각각의 샵과 플랫으로 박싱 되어 들어오지 않고, 한꺼번에 입력으로 들어오게 된다. 조표를 인식하는 방법은 그림 26의 순서도와 같다.

⑴ 조표의 구분은 기본적으로 조표가 가질 수 없는 조표 개체 크기의 기준을 설정하여 구한다.
⑵ 개체의 높이, 넓이와 오선의 평균 간격, 보표의 높이를 이용하여 범위를 좁혀 나간다.
⑶ 히스토그램을 그린다.
⑷ 플랫은 기둥이 1개, 샵은 기둥이 2개임을 이용하여 히스토그램으로 이미지의 높이 대비 화소 수의 비율을 구한다.
⑸ 비율이 이미지의 높이의 90% 이상일 때 기둥으로 인식하여 개수를 센다.
⑹ 조표일 경우에 이미지의 넓이에서 나올 수 없는 기둥의 개수가 인식 될 경우 조표가 아닌 것으로 판단한다.
⑺ 조표의 구성요소 한 개만이 존재할 정도의 넓이를 오선의 간격으로 잡아 해당 공간에서만 기둥의 개수를 센다. 기둥의 개수가 1개이면 플랫 조표이고 2개이면 조표로 인식한다.
⑻ 모든 가능성에서 벗어난 이미지는 조표로 인식하고, 정해진 데이터로 변환한 후 함수를 종료한다.

·음표머리 인식 (level 3)

그림 23. 음표 인식 알고리즘
 음표 인식 단계는 박자를 기준으로 음표를 나눠 동작한다.
한 마디에 들어갈 수 있는 최대 음 길이는 온음표 이다. 이 온음표로부터 2분, 4분 8분, 16분 등으로 나눠지기 때문에 음표 인식은 온음표로부터 출발하여 결과를 산출한다. 여기서 다뤄야 할 중요한 문제는 연음과 비연음을 구분하는 것이다.
음표들을 인식할 때에 연음과 비연음이 다른 형태로 boxing 되는 것을 볼 수 있다. 음표 인식은 boxing 개체 단위로 행해지기 때문에, 연음과 같이 boxing이 되면 별도의 처리를 해주어야 한다. 때문에, 본래의 구조는 박자를 기준으로 음표 인식 단계가 이루어지지만 연음, 비연음은 별도의 상황으로 보아 처리한다.
음표 인식 단계의 내부적인 프로세스는 좀 더 다양한 과정이 필요하다. 다음은 그것들에 대한 설명이다.

머리 위치 인식
머리 위치 인식은 기둥을 기준으로 한다. 음표는 보통 두 가지 형태를 갖는다.
머리 위치는 위와 아래 두 가지 경우가 있는데 기둥을 주의하여 보면 기둥이 음표 머리 기준으로 하여 오른쪽에 있으면 음표 머리는 아래 위치하고 왼쪽에 있으면 음표 머리는 위에 있는 것을 알 수 있다.
이 사실에 근거하여 이진화된 boxing 이미지에서 기둥이 먼저 나오면 머리 위치는 '위'로 인식, 그렇지 않다면, 머리 위치는 '아래'로 인식하였다.
머리 위치 인식은 음계 인식, 박자 인식 과정에서 쓰이게 된다.

머리 중점 좌표 인식

그림 24. 머리 y 축 중점 인식 과정

 머리 중점 좌표는 음계를 확정 짓는데 사용된다. 중점 좌표 찾는 작업은 x축의 중점, y축의 중점 두 가지로 나누어 이루어진다.
y축의 중점을 구할 때에 중요한 가정은 음표의 머리 크기는 5선의 간격을 넘지 않는다는데 있다.

그림 25

위 그림과 같이 음표의 머리는 오선 사이 간격에 딱 맞게 되어 있다. 이것으로 알 수 있는 것은 y 축의 중점은 음표 머리 화소 시작점, 즉 그림 29에서 볼 수 있듯이 머리가 아래 있을 때 밑에서부터 탐색하여 검은 화소가 시작되는 부분을 기준으로 잡는다. 그 기준점에서 오선간격 x 0.5 한 위치를 y축의 중점으로 생각할 수 있다.
x축의 중점은 기둥을 기준으로 하여 탐색한다. 즉,  기둥의 위치를 한쪽의 끝으로 잡고 기둥의 반대편에서 머리가 있는 위치로 화소를 탐색하여 검은 화소가 시작하는 점을 기준으로 잡는다.

그림 26. 머리 x 축 중점 인식 과정

기둥 위치 인식
기둥의 위치 인식은 박자를 판별하는데 필요하다. 기둥 위치 인식은 매우 간단하다.
 그림 31에서 보듯이, 이진화된 음표를 검은 화소를 기준으로 히스토그램으로 그린다. 히스토그램으로 보면 기둥이 있는 위치는 매우 많은 검은 화소가 편중되어 있으므로 이 위치가 기둥이 있는 위치라는 것을 알 수 있다.

· 온음표 판별

음표 인식 단계에 오는 모든 boxing 개체는 '음표' 라고 가정하였기 때문에 온음표 판별은 매우 단순해진다. 단지 '기둥이 있다. 없다.'만 판별하면 되기 때문에 많은 작업을 필요로 하지 않는다.

· 연음, 비연음 판별
연음 비연음 판별은 boxing 개체의 기둥 개수를 세어 판별한다. 개체가 온음표가 아니라면 그것은 기둥이 있는 음표일 것이다. 여기서 비연음 음표는 기둥이 하나라는 것을 알고 있다. 그러므로 연음 음표는 기둥의 개수가 2개 이상인 것으로 인지한다.

· 음계 인식

음계 인식에서 중요한 것은 기준점이다. 본 프로젝트에선 오선 바로 아래에서 표현 할 수 있는 '낮은 도' 보다 한 옥타브 아래의 도를 기준 점으로 잡았다. 이 도의 값을 '0' 이라고 생각하여 한 음씩 올라 갈 때 값을 1 증가시켰다. 이 값을 통해 옥타브와 실제 음계 값을 구 할 수 있다.
음계 값은 앞에서 정의한대로 0~6을 도~시로 보고 옥타브는 0을 기준으로 해서 생성된 값을 나누기 연산을 하여 구하게 된다. 예를 들면,
그림에서 보는 음표는 '도' 이다. 이 '도'는 우리가 정의한 값으론 14라는 값을 갖는다. 2옥타브 아래의 기준 '도'로부터 14음을 올라 왔기 때문에 14라는 값을 갖는 것이다. 이때 각 음계 값(scale)과 옥타브(octave) 값을 구하면,

Octave = 음계값 / 7
Scale = 음계값 % 7

Octave는 정수 이므로 정수 값만 들어가게 되어 올바른 octave 값을 표현하고 scale 값 역시 '도~시' 범위의 값이 들어가게 된다. 7이란 값은 '도~시'의 범위 값을 말한다.
기준점은 앞에서와 같이 구하고 이제 실제 머리의 중점 좌표를 통해 음을 결정할 때다. 음의 결정은 y축 좌표가 어디에 위치해 있는지에 달려 있다. 이미 앞서 오선제거 과정에서 우리는 각 오선의 위치를 저장하였다.
오선의 위치를 알고 있다면 오선 사이의 있는 음은 금방 알 수 있다. 맨 위의 오선부터 탐색을 시작하여 그 선과 가까운 중점 좌표이면 그 선에 위치한 음인 것이다. 만약 우리가 인식하려는 음표의 중점 좌표가 '파'의 위치와 가깝다면, 탐색 과정에서 첫 번째 오선과 가깝다고 인지가 되므로 그 음이 '파'인 것을 알 수 있다.
오선 안의 다른 음계 역시 마찬가지로 판별이 가능하다. 다만, 여기서 생겨나는 문제는 오선이 그려진 외의 위치에 있는 음표이다.
그러한 경우는 오선의 평균 간격을 사용하게 된다. 음표는 오선의 간격에 맞춰 그려지기 때문에 오선의 평균 간격을 알아 두었다가 오선이 그려진 외의 부분에 오선 평균값을 더하면서 임의의 선이 있다고 생각하여 계산을 하는 것이다. 오선 위의 위치에 있는 음표는 '파'를 기준으로 하여 탐색하고, 오선 아래의 위치에 있는 음표는 '레'를 기준으로 하여 탐색한다. 여기서 탐색한다는 의미는 위로 탐색할 땐 파, 솔, 라, 시 순서로 증가하는 것을 의미하고 반대 역시 레, 도, 시 순서라는 것을 알 수 있다.
박자 인식
박자 인식에서 온음표는 이미 앞서 인식하였으므로 남은 것은 연음, 비연음에서의 2분, 4분, 8분, 16분 등의 음표들이다. 먼저, 비연음부터 살펴 보도록 하겠다.

⑴ 비연음 박자 인식
비연음에서 선행되어야 할 과제는 2분음표를 따로 구분하는 것이다. 이분음표는 머리가 비어있다. 이것을 인지하기 위해 머리의 검은 화소 개수를 세는 방법을 택했다. 일반적인 음표의 머리는 검은 화소로 가득 차있다. 반면에 2분음표의 머리엔 검은 화소가 전체 머리 크기의 60~70% 이하이다.

그림 29. 박자 인식하게 되는 음표

그림과 같이 영역을 지정하여 그 안에 있는 검은 화소의 개수를 센다. 그림으로 표기하기 위해 영역을 좀 넓게 설정 했지만, 실제로는 좀 더 정확한 영역을 설정하여 화소 개수를 센다. 전체 화소 개수가 기준점 보다 부족하다면, 2분음표로 간주한다.
2분음표가 구분되었다면, 다음은 4분음표이다. 4분음표는 2분음표가 구분되어 간단히 판별된다. 즉, 기둥 오른쪽에 꼬리가 없으면 4분음표가 되는 것이다. [그림 5.6.3.3-14]를 보면 알겠지만, 비연음의 꼬리는 항상 기둥 오른쪽에 위치한다. 때문에 기둥 오른쪽에 꼬리로 판별되는 화소가 없다면, 그것은 4분음표가 되는 것이다.
다음으론 8분 음표와 16분 음표다. 4분음표는 기둥 오른쪽에 꼬리가 없는 것으로 판별하였다면, 8분 음표와 16분 음표는 기둥 오른쪽에 꼬리가 몇 개인가를 판별하여 결정한다.
 꼬리 개수는 그림과 같은 형태로 인식한다. 기둥 오른쪽을 기준으로 음표 위에서부터 아래로 판별해가면서 검은색이 연속되다가 끊기는 것을 '꼬리 하나'로 인식한다.

그림 30. 꼬리 개수 인식

⑵ 연음 박자 인식
연음 박자 인식은 비연음 박자 인식만큼 간단하지 않지만 원리는 같다. 연음에서 중요한 것은 머리의 개수가 몇 개인가와 그 각각의 머리의 중점 위치를 아는 것이다. 머리의 중점 위치는 앞서 구현한 머리 인식 부분으로 대체 하고 실제 여기서 구현하게 되는 부분은 역시 꼬리 개수를 세는 것이다.
연음에서 꼬리 개수를 세는 것은 비연음에서와 약간 차이가 난다. 비연음에서는 단순히 음표 기둥 오른쪽의 꼬리만을 세면 됐는데 연음인 경우엔 기둥 왼쪽, 오른쪽을 둘 다 판별하여 결과값을 도출해야 된다. 다음은 그러한 상황을 나타내고 있다. 그림과 같이 한쪽에선 꼬리가 2개로 인식이 되는데 다른 한쪽에선 꼬리가 하나로 인식이 된다. 이러한 경우, 꼬리 개수가 많은 것을 올바른 값이라고 판단한다.

후처리 단계
후처리 단계에서 모든 데이터화 과정이 종료된 후에 최종적으로 변환해야 하는 데이터를 수정하고, 데이터를 검증하기 위한 부분이다.
- 장조 혹은 단조를 음계에 적용

그림 31. 꼬리 개수 인식

조표를 통해서 얻어진 장조 혹은 단조를 악보 정보 데이터를 돌면서 해당되는 계이름의 음을 반음 올리거나 내리는 작업을 수행한다.

동작/소리 제어 모듈

동작 제어 모듈은 5.2.3.3절 악보상의 박자에 맞추어 춤추기는 다른 구체적인 알고리즘이 요구 되지 않기 때문에 생략하겠다. 아직 동기화와 로봇간의 전송에 대한 부분이 구현되지 않았기 때문에, 전반적인 루틴은 구현된 동작들과 음을 위의 분류 기준에 따라 호출하는 것 이외의 특별한 알고리즘을 포함하고 있지 않다.
소리 모듈은 ALSA driver를 사용하여 수행된다. ALSA 라이브러리에 소리를 내는 모듈이 이미 존재하기 때문에 본 프로젝트에서는 그러한 모듈을 가져와 프로젝트에 맞게 재설정하고 커스터마이즈화 하는 것을 위주로 하였다.
우리가 알고 있는 '소리' 라는 것은 진동수를 가지고 있다. 기본적으로 피아노의 중간 부분에서 치는 '라' 음은 440Hz 진동수를 갖는다. 이 진동수에서 1.0595배를 하면 반음이 올라가고 1.0595의 제곱 배를 하면 한음이 올라간다.
따라서, 우리가 기준으로 삼은 2옥타브 낮은 '도'를 기준으로 하기 위해 다음과 같은 연산을 수행한다.
440Hz / 4 * 1.0595 * 1.0595 * 1.0595

위와 같은 연산을 수행하면 2옥타브 낮은 '도'가 기준음이 된다. 여기에 맞추어 소리 제어 프로그램이 동작하게 된다.

응용 분야

감성 교육 로봇
어린 아이들에게 음악을 가르칠 때, 악보의 음표, 보표, 쉼표 등의 기호는 어렵게 느껴질 것이다. 악보를 인식하여 춤을 추는 로봇은 그러한 아이들에게 악보를 보는 것에 대한 두려움을 잊게 할 수 있고 음악이라는 것을 재미있게 느끼게 할 것이다. 로봇이 춤을 추며 노래를 할 때에 가슴에 부착된 LCD로 현재 나오고 있는 음표가 어떤 것이라는 것을 알려주면서 플레이 하게 된다면, 아이는 로봇의 춤과 노래를 들으며 특정 음표가 높, 낮이에 따라 음이 달라지며 8분음표 16분 음표 등 음표의 모양에 따라 그 빠르기가 달라진다는 것을 자연스럽게 인지하게 될 것이다.
더 나아가, 음악 뿐만이 아니라 수학, 국어, 사회 등 다양한 과목에서 로봇이 함께함으로 아이의 교육 효율을 높일 수 있을 것이다.

시각 장애인 안내 로봇
현재 시각 장애인은 보도블록의 시각장애인용 유도블록이나 안내견을 통한 이동 밖에 할 수 없다. 매우 위험한 상황에서도 시각장애인은 보호 받지 못하는 상황이다.
시각 장애인 안내 로봇은 GPS기능, 영상 인식 기능, 센서, 소리알림 기능등을 통해 시각 장애인을 안전하게 안내할 수 있을 것이다. GPS 기능을 통해 사용자가 이동하고자 하는 곳을 직접 찾아갈 수 있고, 영상 인식 기능과 센서를 통해 돌발 위험 상황에 대해 사용자에게 알리고 위험 상황을 예방할 수 있다.
<참고문헌 생략>
회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지