6월에 있을 큰 행사에서 사용할 데모 때문에 하드웨어 연동 부분을 Simulink에서 사용 가능하도록 하고 있는 중이다. 하드웨어는 http://www.varram.com 에 있는 DRC 카메라와 홈페이지에서 동영상으로 보이는 로봇이다. 뭐 카메라에 대한 자세한 내용은 홈페이지를 참조하면 되겠다.

카메라의 특징중에 하나가 RF를 이용해서 이미지가 전송되고 이를 PC상에서 처리해서 결과를 보내 주면 카메라는 다른 보드들과는 시리얼로 통신이 가능하다는 개념이다.  카메라가 DRC Station이라고 USB로 PC와 연결되어 있는 보드로 RF로 이미지를 보내 주면 PC에서는 이를 OpenCV를 이용해서 이미지 처리를 하도록 되어 있다.

Simulink나 MATLAB에서 이를 쓰게 할려면 몇 가지 작업을 거쳐야 한다. 첫 번째 문제점은 OpenCV를 활용해서 PC로 넘어 오는 이미지의 포맷이 IplImage 라는 점이다. MATLAB이나 Video and Image Processing Blockset에서 사용하기 위해서는 RGB 형태가 제일 좋다.

지금 진행된 작업은 DRC Station에서 가져온 데이타를 Simulink에서 사용 가능하도록 블록을 만들었다. 이제 할 일은 IplImage 포맷을 RGB로 변환해서 넘겨 주도록만 하면 될것 같다.

구글신께 상황을 물어 보니 여러 가지 답이 나오는데, 이것 저것을 직접 본 결과 제대로 답을 주는 코드가 없어서 오히려 더 헷갈리기만 해서 직접 IplImage의 포맷을 확인한 결과 의외로 배열을 잘 핸들링만 하면 특별히 어려울게 없다는 것을 알았다. 아래의 내용은 채널수가 3인 경우에 해당된다. Gray Scale로 오는 경우는 3을 곱할 필요도 억고, 당은연히 RGB로 뽑아 낼 수도 없다.

IplImage 구조에 있는 필드 중에 imageData라는 필드가 실제로 RGB 데이타를 가지고 있는데, 1차원 배열로 저장이 BGR 순서로 되어 있다. 즉 아래 그림과 갈이 있는다는 것을 알 수 있다. RGB의 각각의 처음이 (1, 1)부터 시작된다고 하면, 아래와 같이 imageData의 첫번째가 바로 Blue 데이타이고, 그 다음이 Green 데이타의 처음, 그 다음이 Red 테이타의 처음이다. 이런식으로 위치에 대한 데이타가 1차원으로 주욱 나열 되어 있다.
사용자 삽입 이미지

실제 MATLAB이나 Simulink에 있는 Video and Image Processing Blockset에서 사용하기 쉽게 하기 위해서는 아래 그림과 같이 각각의 데이타를 가진 배열로 만들어서 3차원 배열로 만들면 된다.

사용자 삽입 이미지


이를 위해서 IplImage의 필드 중에서 필요한 필드를 이용하여 직접 만들어야 한다. 아래에 코드가 이를 하기 위한 코드이다.  월요일에 사무실에 가서 실제 하드웨어에서 값을 받아서 해봐야 겠다.

img를 IplImage의 포인터 타입이라고 생각하자. 그러면 IplImage의 구조를 보면 img->width, img->height, img->widthStep 등을 활용해서 필요한 RGB를 뽑아 낼 수 있다.


로 코드를 뽑으면 된다. 현재 하드웨어가 없어서 되는지를 MATLAB에서 확인해 봤다. 월요일날 실제로 적용해서 되는지를 적도록 하겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

트랙백을 보내세요

트랙백 주소 :: http://www.cipher.pe.kr/tt/cipher/trackback/194

댓글을 달아 주세요

  1. Yang 2009/12/17 12:46

    아, Iplimage 구조 파악하다가 한 참 헤매다 와서 단번에 해결하고 가요!
    유용글 감사합니다.!

[로그인][오픈아이디란?]
비밀글 (Serect)
댓글 달기 (Submit)