태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'2012/03'에 해당되는 최근 글 12건

  1. 2012/03/29 OjOcamStereo 동작 오류
  2. 2012/03/26 OjOcam을 소개합니다.
  3. 2012/03/24 카메라 렌즈 화각 테스트
  4. 2012/03/24 카메라 제어
  5. 2012/03/24 프로그램 구조
  6. 2012/03/24 프로그램 동작 (Test)
  7. 2012/03/24 프로그램 동작
  8. 2012/03/24 드라이버 설치(Win7 64bit)
  9. 2012/03/24 드라이버 설치
  10. 2012/03/21 OjOcamStereo 스펙
  11. 2012/03/21 OjOcamStereo 동작
  12. 2012/03/21 OjOcamStereo 소개

OjOcamStereo 동작 오류

Camera/OjOcamStereo 2012/03/29 21:14

 

OjOcamStereo를 제작하고 다양한 컴퓨터와 다양한 O/S에서 최종 테스트를 하였는데, 


특정한 USB 호스트 컨트롤러에서  이상 동작이 발생하였습니다. 


지금까지 확인한 바로는 아래와 같은 USB 호스트 컨트롤러(테스크탑)에서 화면이 깨지는 현상이 발생하였습니다. 


또한, 동일한 USB 호스트 컨트롤러라 할지라도 노트북에서는 정상 동작합니다.

 

- Intel (R) 5 Series/3400 Series Chipset Family USB Enhanced Host Controller -


 


지금까지 테스트한 바로는 위의 USB 호스트를 제외하고는 이러한 문제가 발생하는 경우가 없었으나


혹시, 다른 USB 호스트에서도 위와 같은 현상이 발생하면 위드로봇으로 연락을 부탁 드립니다. 


감사합니다. 

'Camera > OjOcamStereo' 카테고리의 다른 글

OjOcamStereo를 이용한 동영상 저장  (0) 2012/04/30
OjOcamStereo 동작 오류  (0) 2012/03/29
카메라 렌즈 화각 테스트  (0) 2012/03/24
카메라 제어  (0) 2012/03/24
프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
Trackback 0 : Comment 0

OjOcam을 소개합니다.

Camera 2012/03/26 16:34

OjOcam위드로봇에서 선보이는 새로운 영상 처리자를 위한 카메라 브렌드입니다. ojo 스페인어로 (eye) 해당하는 단어입니다. O는대문자로, j는소문자로 써 놓으면(OjO)  각각의 글자가 얼굴의 눈과 코로 보이는 효과가 있기에 문자만으로 카메라또는 스테레오 카메라의 이미지를 떠 올리기 쉽습니다. 이에 착안하여 OjO라는 단어와 Camera 약자 cam 뒤에 덧붙여 위드로봇만의 브랜드 OjOcam 만들었습니다. 스페인 발음으로OjO[오흐]에가깝습니다만, 영문발음식으로 [오조]라 읽고 OjOcam[오조캠]이라고읽습니다.


위드로봇 기존 산업용 카메라 업체들이 서비스하지 않던 고속, 고해상도, 다채널 카메라들을 OjOcam이라는 제품군으로 준비하여 여러분게 다가갈 계획을 가지고 있습니다. 이전 카메라에서 지원하지 않아 아쉬웠던 기능들, OjOcam에서 만나보세요. 

OjOcam 제품 이름으로 기능 파악하기
 

OjOcam 제품은 다음과 같은 규칙으로 이름이 붙습니다.

- 제품군 공통 접두어: OjOcam

- 카메라 갯수:

  1 경우 아무것도 붙지 않음

  2 경우 Stereo 붙임 (: OjOcamStereo)

  3 경우 Triple 붙임 (: OjOcamTriple)

  4 경우 Qudro 붙임 (: OjOcamQudro)

- 해상도 표시

  640 x 480 (30 화소 내외): VGA

  2048 x 1200 (5M 화소 내외): QXGA

-최대 전송 속도 표시 

 초당 30프레임 전송: 30

 초당 60프레임 전송: 60

- 모노/컬러/IR 표시

  M: 모노

  C: 컬러

  I: IR


관련 제품 링크
  • OjOcamStereo-VGA30 : VGA(640x480) 스테레오 영상을 초당 30 프레임으로 전달하는 스테레오 카메라

 

저작자 표시

'Camera' 카테고리의 다른 글

OjOcam을 소개합니다.  (0) 2012/03/26
Trackback 0 : Comment 0

카메라 렌즈 화각 테스트

Camera/OjOcamStereo 2012/03/24 11:47


스테레오 비전의 알고리즘을 작성하다보면 화각이 중요한 요소 중의 하나입니다 

실험하고자하는 대상체의 거리가 어느정도인가에 따라 적절한 초점거리의 렌즈를 사용하여야 

좋은 결과가 나오겠지요.

OjOcamStereo에서는 기본적으로 60,90,120도 화각의 렌즈를 제공합니다. 

OjOcamStereo로부터 대상체까지의 거리에 따라 적절한 렌즈를 사용하시면 됩니다. 


렌즈의 교환은 아래와 같이 이루어집니다. 

먼저 카메라 모듈 밑에 있는 조그마한 나사로 돌려서 렌즈를 움직일 수 있도록 한 후 

적절한 렌즈로 교환하시고 초점을 맞춘 후 나사를 다시 조이시면 됩니다. 

 어떤 렌즈를 사용하는 것이 어떤 효과를 일으킬 것이가에 대한 감을 잡기 위하여 

테스트를 하여 보았습니다. 

 

 


60도 렌즈


90도 렌즈


120도 렌즈


60도 렌즈

90도 렌즈


120도 렌즈

간단히 이야기하면 멀리있는 물제를 처리하고자하면 화각이 좁은(초점거리가 긴) 렌즈로,

가까운 거리에 있는 물체를 처리하고 싶으면 화각이 넖은 (촛점거리가 짧은) 렌즈를 사용하시면 됩니다. 

(너무 당연한 이야기인가...?)

그리고 테스트에서 보시는 것처럼 화각이 넓어질수록 렌즈의 왜곡이 심해집니다. 


2920JL101.pdf

3620JL101.pdf

6018WSL001.pdf


'Camera > OjOcamStereo' 카테고리의 다른 글

OjOcamStereo를 이용한 동영상 저장  (0) 2012/04/30
OjOcamStereo 동작 오류  (0) 2012/03/29
카메라 렌즈 화각 테스트  (0) 2012/03/24
카메라 제어  (0) 2012/03/24
프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
Trackback 0 : Comment 0

카메라 제어

Camera/OjOcamStereo 2012/03/24 11:40


전체적인 프로그램의 구조에 대하여 이야기하였으니 카메라를 제어하는 방법에 대하여 말씀드리겠습니다. 


기본적으로 OjOcamStereo에서 사용하는 MT9M111 마이크론 카메라에는 많은 레지스터들이 있습니다. 

레지스터에 적절한 값을 읽거나 써서 카메라를 제어하는 것이지요.

보통 카메라의 레지스터를 읽거나 쓰기위해서는 I2C 인터페이스를 이용합니다. 

아시는 분은 아시겠지만 I2C 인터페이스는 스펙상 256개의 주소만을 지정할 수 있습니다. 


MT9M111에는 256개 보다 더 많은 레지스터가 있기 때문에 

MT9M111에서는 페이지란 개념을 이용하여 더 많은 레지스터를 제어합니다. 

즉, 한번에 256개의 주소를 지정할 수 있는 페이지를 여러개 만들어 페이지를 변경해가며 레지스터를 이용하는 것입니다. 


여러개의 페이지 중 원하는 페이지로 변경하기 위해서는 0xf0(240)번지에 원하는 페이지 번호를 쓰면 됩니다. 

모든 페이지의 0xf0번 주소는 페이지를 변경하는 레지스터로 사용되기 때문에 

어떤 페이지에서 건 0xf0번지에 페이지 번호를 쓰면 페이지가 변경되는 것이지요. 


MT9M111에는 3개의 페이지가 있고 페이지당 대략 200여개의 레지스터가 있지만 

우리가 주로 사용하는 레지스터는 그렇게 많지 않습니다. 


우선, 중요한 레지스터로는 1번 페이지의 6번 레지스터인 "Operation Mode Control" 레지스터가 있습니다. 

이 레지스터는 AutoExp를 On/Off 시키는 레지스터로 0x700E를 적으면 AutoExp On이 되고, 

0x300C를 적으면 AutoExp가 off됩니다. 

(각 비트에 대한 자세한 내용은 메뉴얼 MT9M111.pdf 22 페이지에 보면 나와 있습니다.)


1번 페이지에 있기 때문에 아래와 같이 동작시켜야겠지요.


       I2C_Write(0xf0, 1);                // 1 번페이지로변경합니다.

       I2C_Write(0x06, 0x700E);         // auto exposure on

       

       혹은 


       I2C_Write(0xf0, 1);                // 1 번페이지로변경합니다.

       I2C_Write(0x06, 0x300C);         // auto exposure off

       

AutoExp를 off로 하여야 셔터 스피드와 게인값을 설정하는 것이 가능해집니다. 

AutoExp를 on으로 하면 카메라가 자동으로 카메라 레지스터 값을 변경하기 때문에 

프로그램상에서 수동으로 레지스터 값을 설정하는 것이 의미가 없어집니다. 


셔터 스피드의 경우는 0번 페이지 9번 레지스터입니다. 

마찬가지로 셔터 스피드의 값을 바꾸기 위해서는 아래와 같이 해야겠지요.


       I2C_Write(0xf0, 0);                // 0 번페이지로변경합니다.

       I2C_Write(0x09, shutter);         // shutter speed 값을 바꿉니다. 


게인 값은 0번 페이지 43(0x2B) ~ 47(0x2F)번 레지스터입니다. 

이 레지스터를 보면, R, G1, G2, B, Global 게인을 설정할 수 있습니다. 

위의 레지스터를 보면 R, G, B중 G가 두개입니다. 

이것은 칼라 CMOS 센서가 아래와 같이 생겼기 때문입니다. 


   



 

즉, 한점에서 칼라를 표현하기 위해서는 RGB가 모두 있어야 하지만 모든 픽셀마다 RGB 센서를 만들면 

해상도가 낮아지기 때문에 위와 같이 RGB를 번갈아가면서 만들어서 센서의 효율을 높이는 것입니다. 

(RGB를 번갈아가면서 만든다기 보다는 동일한 센서위에 RGB 칼라 필터를 장착하는 것이랍니다.)

사람의 시신경의 경우 G에 민감하기 때문에 G를 2개 사용한다고 하네요.

(진화론적으로 자연 환경이 거의 G로 되어 있기 때문이겠죠?)

위와 같은 패턴을 베이어 패턴(Bayer Pattern)이라고 합니다. 카메라 센서 MT9M111에서는 

위와 같은 데이터로부터 각 픽셀당 RGB 값을 계산하고, RGB 값을 다시 밝기 정보(Y)와 색상 정보(UV)를 갖는 

YUV 값으로 변경하여 최종 출력합니다. 

최종적으로는 YUV422 포맷으로 전송되는데 이것은 밝기값 2개에 색상값을 1개씩만 보내는 것입니다. 

이것도 역시 사람의 눈이 밝기 정보에는 예민하고 색상 정보에는 둔감하기 때문으로  

색상에 대한 해상도는 절반으로 줄어들게 됩니다. 


이렇게 해서 카메라 레지스터를 설정하는 부분에 대하여는 대략 설명이 되었고, 

두개의 카메라의 동기를 맞추는 법에 대하여 설명 드리도록 하겠습니다. 


OjOcamStereo는 기본적으로 카메라가 2개 있기 때문에 

처음에는 FPGA에서 I2C 포트를 2개 만들어 각 카메라 별로 제어하려고 했습니다. 

하지만 카메라의 동기를 맞추려고 보니 양쪽 카메라에 같은 시각에 동일한 명령을 내려야하는 경우가 발생하였습니다. 

그래서 어떻게 할까 고민하다가 아래와 같이 I2C 회로를 구성하였습니다. 



I2C는 Data와 클럭의 두개의 라인으로 되어 있는데, 

이중 데이터는 공유를 하고 클럭은 FPGA에서 선택하여 각각의 카메라를 제어하는 것입니다. 

이렇게 하면 FPGA를 통하여 카메라를 개별적으로 제어할 수도, 동시에 같이 제어할 수도 있게 됩니다. 

FPGA에서 어떤 카메라를 제어할 것인가를 결정하는 함수가 아래의 함수입니다.


               Bus_Write(3, Value);


Value에 0번 비트는 0번 카메라에 해당하고 1번 비트는 1번 카메라에 해당합니다. 

따라서 Value에 1을 쓰면 0번 카메라를, 2를 쓰면 1번 카메라를 3을 쓰면 양쪽 카메라를 동시에 제어할 수 있습니다. 


그래서, Bus_Write() 함수와 I2C_Write() 함수를 이용하여 카메라의 동기를 맞추는 방법은 아래와 같습니다 .

우선, AutoExp를 off 시킵니다. 

AutoExp가 On되어 있으면 한프레임을 받는데 걸리는 시간이 양쪽 카메라가 다르기 때문에 

동기를 맞추어도 계속 틀어지게 됩니다. 

AutoExp를 off 시킨 후 양쪽 카메라에 셔터 스피드등 원하는 파라메터값을 설정합니다. 

(셔터 스피드는 영상을 받는데 걸리는 시간이므로 동일하게 설정하여야 하며, 게인은 양쪽 카메라가 

다르게 설정되어도 상관없습니다.)

그리고 나서 양쪽 카메라에 동시에 Restart를 하면 

양쪽 카메라에 동일한 클럭이 들어가기 때문에 그때부터는 양쪽 카메라에서는 동기가 맞는

영상 데이터가 출력 됩니다. 

이렇게 하면 픽셀 레벨에서 동기가 맞게됩니다. 


       Bus_Write(3, 3);                // 양쪽 카메라를 동시에 제어합니다. 

       I2C_Write(0xf0, 1);                // 1 번페이지로변경합니다.

       I2C_Write(0x06, 0x300C);         // auto exposure off


       Bus_Write(3, 1);                // 0 번 카메라를 제어합니다. 

       I2C_Write();                        // 필요한 값 설정

       ...                                

       

       Bus_Write(3, 2);                // 1 번 카메라를 제어합니다. 

       I2C_Write();                        // 필요한 값 설정

       ...                                

       

       Bus_Write(3, 3);                // 양쪽 카메라를 동시에 제어합니다. 

       I2C_Write(0xf0, 0);                // 0 번페이지로변경합니다.

       I2C_Write(0x0d, 0x0a);         // restart



MT9M111.pdf


'Camera > OjOcamStereo' 카테고리의 다른 글

OjOcamStereo 동작 오류  (0) 2012/03/29
카메라 렌즈 화각 테스트  (0) 2012/03/24
카메라 제어  (0) 2012/03/24
프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
프로그램 동작  (0) 2012/03/24
Trackback 0 : Comment 0

프로그램 구조

Camera/OjOcamStereo 2012/03/24 11:38


OjOcamStereo를 동작시켜 보았으니, 프로그램의 내부 구조에 대하여 살펴 보기로 합시다. 

우선, 코드는 VS2008에서 다이얼로그 기반으로 작성되었습니다. 


프로젝트를 열어보면 Stereo.cpp, Stereo.h 파일이 있는데, 

핵심적인 코드는 모두 이 파일 안에 들어 있습니다. 


영상은 USB를 통하여 전송되기 때문에 

USB로부터 데이터를 받는 쓰레드가 별도로 동작합니다. 

양쪽 카메라로부터 각각 전송을 받으므로 두개의 쓰레드가 돌아갑니다. 

쓰레드 함수는 Stereo.cpp파일에 있는 ThreadUSB()입니다 .



우선 프로그램에서 Start 버튼을 누르면 StartThread() 함수를 실행시킵니다.

StartThread() 함수에서는 카메라 초기화를 비롯한 몇가지 초기화 작업을 하고 쓰레드를 동작시킵니다. 

ThreadUSB() 쓰레드 함수에서는 USB로부터 데이터를 읽어서 버퍼에 저장합니다.

데이터 전송은 아이소크로노스 모드를 이용하기 때문에 지속적으로 데이터를 읽어야 합니다. 

벌크 모드의 경우 원하는 만큼만 데이터를 읽어 올 수 있지만 아이소크로노스 모드의 경우 

데이터가 있건 없건 상관없이 사전에 할당된 양만큼의 데이터를 읽어와야 합니다. 

대신에 아이소크로노스 모드가 벌크 모드보다 컴퓨터 리소스도 적게 차치하고 속도도 빠릅니다. 


따라서 카메라 센서로부터 데이터가 적게 들어와서 미리할당된 데이터량보다 적게되면

FX2에서는 더미 데이터를 포함해서 보내게 됩니다. 

ThreadUSB()에서는 더미 데이터는 걸러내고 실제 영상데이터만을 추출하여 

버퍼(g_Buffer)에 차곡차곡 넣습니다. 


그래서 메인 프로그램의 동작과 관계없이 영상은 쓰레드를 통하여 계속 버퍼에 쌓이고 있습니다. 

그리고 이렇게 버퍼에 쌓인 영상은 GetImageIpl() 함수를 통하여 가져올 수 있습니다. 

버퍼에 영상이 많이 쌓여 있을지라도 GetImageIpl() 함수를 호출하면 버퍼중에서 

가장 최근에 받은 영상을 리턴해 줍니다. 그리고 한번만 리턴해 줍니다. 

다시 GetImageIpl()함수를 호출하면 다음번 영상이 들어올 때까지 NULL을 리턴합니다. 


이것은 버퍼의 영상 중 가장 최근에 들어온 영상을 처리하는 것이 의미가 있다고 생각하여 

이렇게 구현한 것입니다. 만일 버퍼에 있는 영상을 모두 처리하고 싶으시면 

GetImageIpl() 함수를 조금만 수정하시면 구현하실 수 있으실 겁니다. 


다시, OjOcamStereoDlg.cpp 파일의 MainLoop() 함수를 보면 아래와 같이 되어 있을 것입니다. 


       for (int i=0; i<2; i++)

       {

               if ( GetImageIpl(i, m_ImgCap[i]) )

               {

                       // Process();

                       cvShowImage( m_WinName[i], m_ImgCap[i] );

               }

       }


MainLoop() 함수는 지속적으로 호출이 되고 MainLoop()에서 

GetImageIpl() 함수를 호출하여 NULL이 아닐 경우에만 처리합니다. 

만일 스테레오로 양쪽 이미지를 처리하고 싶다면 아래와 같이 하면 됩니다. 


       if ( GetImageIpl(0, m_ImgCap[0]) )

       {

               if ( GetImageIpl(1, m_ImgCap[1]) )

               {

                       // StereoAlg(m_ImgCap[0], m_ImgCap[1]);

                       cvShowImage( m_WinName[0], m_ImgCap[0] );

                       cvShowImage( m_WinName[1], m_ImgCap[1] );

               }

       }

       

앞에서 MainLoop() 함수가 지속적으로 호출이된다고 했는데, 

영상처리를 위해서는 일정 간격으로 지속적으로 어떤 처리를 해야하는 경우가 자주 발생합니다.

윈도우즈 프로그램에서는 일정한 정주기로 어떤 일을 처리하는 것이 쉽지만은 않은데

윈도우즈가 리얼타임 OS가 아니어서 정확한 시간 주기로 어떤 일을 하기가 힘들기 때문입니다. 

윈도우즈에서는 일정 주기로 어떤 일을 처리할 때 보통 아래와 같은 3가지정도의 방법을 사용합니다. 


- 윈도우 타이머 이용

보통 간단하게 사용할 수 있는 것이 SetTimer(), OnTimer() 함수입니다. 

SetTimer()로 시간 간격을 설정해 주면 설정된 시간 간격으로 OnTimer()가 호출되는 것이지요.

잘 아시겠지만 일반적으로 윈도우 타이머의 해상도가 높지 않아서 시간 간격이 수십 ms이하이면 

정확한 시간 간격을 얻기가 쉽지 않습니다. 그래서 해상도가 좀 더 높은 멀티미디어 함수를 사용하기도 하구요.

동영상 재상 같은 경우에는 멀티 미디어 타이머를 많이 사용하는 것 같은데, 

영상처리에서는 입력 영상과의 동기화 문제도 있고 해서 타이머 함수는 잘 사용하지 않는 것 같습니다. 


- 이벤트 이용

카메라로부터 영상이 한장 들어왔을 때 등록된 콜백 함수가 호출되거나 

사전에 정의해 놓은 윈도우 메시지가 날라와 메시지 핸들러에서 처리하도록 하는 것입니다. 

윈도우의 설계 철학적으로는 가장 맞는 방법입니다. 

하지만 저 같은 DOS 시절 구시대 개발자에게는 복잡하게 느껴지기도 하지요....


- 폴링 방식

무한 루프를 돌면서 영상이 들어왔는지 주구장창 지켜 보고 있는 것입니다. 

영상이 들어 오면 바로 처리하구요....

성능에 상관없이 가장 간단해 보이고 직관적입니다....

하지만 이렇게 무한 루프를 돌고 있으면 다른 프로그램들이 멈춰 버리고 

시스템 점유율이 100%가 되어 버립니다.... ^^;;

그래서 무한 루프를 돌면서 메시지를 처리해 주고 Sleep() 함수도 넣어 시스템 점유율도 낮춥니다. 


그래서 OjOcamStereo에서는 폴링 방식을 사용했습니다. 

OjOcamStereo.cpp 파일에 있는 BOOL COjOcamStereoApp::InitInstance() 함수를 보시면 

어떻게 폴링 방식으로 구현되어 있는지 아실 수 있으실 겁니다. 


       COjOcamStereoDlg dlg;

       m_pMainWnd = &dlg;

/*

       int nResponse = dlg.DoModal();

       if (nResponse == IDOK)

       {

               // TODO: Place code here to handle when the dialog is

               //  dismissed with OK

       }

       else if (nResponse == IDCANCEL)

       {

               // TODO: Place code here to handle when the dialog is

               //  dismissed with Cancel

       }

*/

//--- 추가된부분

       dlg.Create(COjOcamStereoDlg::IDD, NULL);

       dlg.ShowWindow(SW_SHOWDEFAULT);


       MSG  msg;


       while (dlg.IsWindowVisible())

       {

               if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

               {

                       TranslateMessage(&msg);

                       DispatchMessage(&msg);

               }

               else

                       dlg.MainLoop();

       }


       dlg.DestroyWindow();

//---


위와 같이 기존 코드에서는 다이얼로그를 생성하고 DoModal() 함수를 호출합니다. 

그러면 모달 형태의 다이얼로그가 동작하지요.

이것을 Create() 함수를 이용하여 모달리스 다이얼로그로 만들고 

아래에서 메시지 루프를 처리해 주는 것입니다. 메시지가 없을 경우에는 MainLoop()를 

호출하구요....이렇게 하면 메시지를 처리하면서 MainLoop() 함수를 지속적으로 호출할 수가 있습니다.

앞에서 보신바와 같이 MainLoop()에서는 영상이 들어왔는지를 확인하여 

영상이 들어왔을 경우에만 처리를 하도록 하구요.

이렇게 하면 영상이 들어올 때마다 바로 바로 처리를 할 수 있고, 

영상은 일정 주기로 들어오기 때문에 일정한 주기로 영상을 처리할 수 있는 것이지요.


영상이 일정 주기로 들어오면 이제 스테레오 영상을 처리하여 거리 정보를 추출할 수 있어야 합니다. 

앞에서도 말씀 드린 것과 같이 아직 거기까지는 구현되어 있지 않습니다. 

원래는 OpenCV를 이용하여 구현하려고 하였기 때문에 함수의 자료 구조등을 

OpenCV의 구조체를 이용하였습니다. 

현재로는 YUV 데이터를 RGB 데이터로 변환시키는 부분과 영상을 출력하는 부분에서 OpenCV 함수를 사용하고 있습니다. 

현재 OpenCV는 2.X까지 버전이 나와 있지만 OpenCV에서 사용하는 함수도 많지 않고 하여 

설치하기 쉬운 OpenCV 1.1pre 버전을 사용하였습니다. 

OpenCV를 설치하는 방법은 인터넷이나 서적에 많이 나와 있으니 별도로 설명하지는 않겠습니다. 

OjOcamStereo.zip


'Camera > OjOcamStereo' 카테고리의 다른 글

카메라 렌즈 화각 테스트  (0) 2012/03/24
카메라 제어  (0) 2012/03/24
프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
Trackback 0 : Comment 0

프로그램 동작 (Test)

Camera/OjOcamStereo 2012/03/24 11:34


OjOcamStereo.exe를 이용하여 다양한 OS와 컴퓨터에서 테스트를 하다보니 

테스트 환경에 따라 성능이 다르게 나와서 성능을 측정할 수 있도록 OjOcamStereo를 조금 수정하여

OjOcamStereo(Test)를 만들었습니다. 




프로그램을 동작시켜 보면 하단에 Test Msg란 콤보박스가 하나 있고

기존 프로그램에 비하여 출력 터미널이 하나 더 떠있을 것입니다. 


우선, 기본 동작은 OjOcamStereo와 동일합니다. 

단, 콤보박스에서 적절한 항목을 선택하면 각 항목에 따른 측정값이 출력될 것입니다. 

측정 항목은 아래와 같습니다.


Cam0, Cam1

각각 카메라에 대하여 프레임 사이의 측정 시간입니다. 

초당 30 프레임일 경우 대략 33ms(1000ms/30 = 33ms)이 출력됩니다. 

노출시간을 늘리면 프레임 사이의 시간 간격이 늘어남을 확인하실 수 있을 겁니다. 


GetImage

한장의 이미지를 가져오는데 걸리는 시간입니다. 

Gray로 설정하였을 경우 거의 시간이 걸리지 않지만 

Color로 설정하면 받은 영상(YUV 형태로 받습니다.)을 RGB 칼라로 변환하는 시간도 포함됩니다. 

Color의 경우에도 대부분의 컴퓨터에서 2~3ms 정도 밖에 걸리지 않지만 

어떤 컴퓨터에서는 10ms 이상이 걸리기도 합니다. 


ShowImage

영상을 화면에 출력하는데 걸리는 시간입니다. 

영상의 출력은 OpenCV의 cvShowImage 함수를 사용하기 때문에 cvShowImage에서 소요되는 시간입니다. 

거의 0~1ms정도입니다.


UsbData

USB로 전송되는 데이터의 총량입니다. 

DataUSB는 아이소크로노스 모드로 전송되는 데이터의 총량으로 대략 48MB쯤 됩니다. 

DataCam은 전송된 데이터 중 실제 카메라 영상으로 카메라의 FPS에 따라 달라집니다. 

초당 30프레임이 들어올 경우 대략 39MB정도입니다. 

아이소크로노스 모드의 경우 사전에 전송량을 예약하여 사용하기 때문에

전송할 데이터가 적어졌다고 전송량을 줄일 수는 없습니다. 

또한 전송량도 1M단위로 설정할 수 있는 것도 아니기 때문에 

최대 카메라 전송량 39MB를 넘는 가장 작은 예약 단위가 48MB입니다. 

낭비가 심한 것 같지만 그래도 벌크 모드보다는 빠르고 CPU 리소스도 적게 차지합니다.


FrameDrop

FrameDrop은 전송된 카메라 데이터중 깨진 프레임의 수를 나타냅니다. 

데이터를 확인하여 영상 데이터가 깨질 경우 그 프레임은 버리도록 되어 있는데,

이때 버려진 프레임 수를 나타냅니다. 

당연히 0이어야 정상이겠지요.


OjOcamStereo(Test).exe

cv110.dll

cxcore110.dll

highgui110.dll



'Camera > OjOcamStereo' 카테고리의 다른 글

카메라 제어  (0) 2012/03/24
프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
Trackback 0 : Comment 0

프로그램 동작

Camera/OjOcamStereo 2012/03/24 11:32

무사히 드라이버를 설치하였으면 OjOcamStereo.exe를 동작시켜 보도록 하겠습니다. 


먼저, OjOcamStereo.exe를 더블 클릭하여 실행시킵니다.

OjOcamStereo에서는 OpenCV 함수를 사용하기 때문에

cv110.dll, cxcore110.dll, highgui110.dll 파일도 필요합니다. 



우선 Start 버튼을 누릅니다. 별다른 문제가 없다면 영상이 나오기 시작할 것입니다. 

가장 위에 있는 Color, Gray 라디오 버튼은 

출력하는 영상을 컬러로 할 것인가 흑백으로 할 것인가를 선택합니다. 

Camera0 FPS(Frames Per Second)는 Camera0의 초당 프레임수입니다. 

대략 10~30이 나올 것입니다. 


AutoExp On/Off는 Auto Expose(자동 노출)를 결정합니다. 

AutoExp를 On으로 하면 주위 조명 환경에 따라 자동으로 노출시간과 RGB 게인(Gain)이 조절됩니다. 

노출 시간은 FPS와도 관계가 있어서 노출 시간이 작으면 FPS가 올라갑니다. 

반면, 노출시간이 길어지면 FPS가 떨어집니다. 

AutoExp On한 후 밝은 곳에 있으면 노출시간이 줄어서 FPS가 올라가고 

어두운 곳에 있으면 자동으로 노출시간을 늘리기 때문에 FPS가 내려갑니다. 


AutoExp를 Off로 하면 노출시간과 게인을 수동으로 설정할 수 있습니다. 

AutoExp를 On->Off로 하면 현재 카메라에 설정된 노출 시간과 게인을 읽어서 스크롤바와 화면에 출력합니다. 


Shutter는 Shutter Speed로 노출시간을 나타냅니다. 

슬라이드바를 움직여 노출시간을 늘리면 화면을 밝아지는 대신 블러가 발생할 것입니다. 

반대로 노출시간을 줄이면 화면은 어두워지고 블러는 줄어들 것입니다.

R, G, B Gain은 카메라 각각의 RGB 게인을 조절합니다. 

Gain은 RGB 게인을 동시에 조절합니다. 


마찬가지로 Camera1에 대한 파라메터도 동일합니다. 


Gain과 RGB Gain 슬라이드바는 0~127까지 설정할 수 있습니다. 

레지스터에 직접 값을 쓰면 127 이상의 값도 쓸 수 있지만 127 이상의 값을 쓰면 

127을 기준으로 값이 다시 작아지는 현상이 나타나서 127까지만 변경하도록 슬라이드바를 제한하였습니다.

(아무래도 카메라 센서 MT9M111의 버그인 듯 합니다.)


cv110.dll

cxcore110.dll

highgui110.dll

OjOcamStereo.exe

'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 구조  (0) 2012/03/24
프로그램 동작 (Test)  (0) 2012/03/24
프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
Trackback 0 : Comment 0

드라이버 설치(Win7 64bit)

Camera/OjOcamStereo 2012/03/24 11:28

앞의 방법대로 드라이버 설치대로 해도 Win7 64bit에서는 제대로 동작하지 않습니다. 

드라이버를 설치하였더라도 장치관리자에 가보면 장치 앞에 

!가 붙은 상태로 표시되어 있어 장치가 제대로 동작하지 않음을 알 수 있습니다. 

다른 버전의 윈도우에서는 드라이버를 인증받지 않아도 드라이버가 동작합니다만

Win7 64bit에서는 드라이버를 인증받지 않으면 드라이버가 동작하지 않습니다. 

(음... 다시말하면 인증받지 않은 드라이버란 이야기죠... 빨리 인증받도록 하겠습니다. ^^a)


하지만 Win7 64bit에서도 테스트 모드에서는 인증받지 않은 드라이버도 동작하기 때문에 

우선은 테스트 모드에서 동작시키도록 합시다. 

(인증받지 않은 드라이버라고 무슨 문제를 발생시키지는 않습니다.)


테스트 모드에서 동작시키기 위해서는 dseo13b.exe가 필요합니다. 

동작하지 않더라도 먼저 드라이버를 설치한 후 dseo13b.exe를 실행시킵니다.

dseo13b.exe가 실행되면 아래의 그림과 같이 Sign a System File을 선택하고 Next버튼을 누릅니다.

그런 후 Insert filename에서 실제 드라이버가 존재하는 위치인 

C:\Windows\System32\drivers\cyusb.sys를 입력합니다. 






다시 아래의 그림과 같이 Enable Test Mode를 선택하고 Next 버튼을 누릅니다. 

이제 Exit를 선택하고 프로그램을 종료한 후 컴퓨터를 재부팅하면 

모니터의 오른쪽 하단에 test mode라는 마크가 생겼을 것입니다. 

그리고 장치관리자에 들어가 보면 장치앞의 i가 사라져 장치가 정상적으로 동작함을 확인할 수 있을 것입니다. 


이제 OjOcamStereo.exe를 동작시키면 정상적으로 동작할 것입니다. 

(test mode에서 나가시려면 dseo13b.exe를 실행시키시고 Disable Test Mode를 선택하신 후 재부팅하면 됩니다.)


dseo13b.exe


'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 동작 (Test)  (0) 2012/03/24
프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
OjOcamStereo 동작  (0) 2012/03/21
Trackback 0 : Comment 0

드라이버 설치

Camera/OjOcamStereo 2012/03/24 11:22


그럼, 대강의 스펙도 살펴 보았으니, 직접 컴퓨터에 설치해 보도록 하겠습니다.

우선 제 컴퓨터가 Win7 32bit인 관계로 Win7 32bit를 기준으로 설명드리겠습니다. 


먼저 그냥 OjOcamStereo를 남는 USB 포트에 꽂으시면 됩니다. 

간단하죠? (물론 대부분의 USB 장비들이 꽂기만 하면 동작하지만요...^^;;)


이제 장치 관리자에 들어가 봅시다. 

장치관리자를 들어가 보면 아래의 그림과 같이 기타 장치에 EZ-USB FX2로 장치가 잡혀 있고 느낌표가 나와 있을 것입니다. 


 


느낌표가 나와 있는 것으로 보아 드라이버가 제대로 설치가 되어 있지 않다는 것을 알 수 있습니다. 

EZ-USB FX2를 선택하고 마우스 오른쪽 버튼을 눌러서 

"드라이버 소프트웨어 업데이트"를 선택합니다. 

아래와 같이 드라이버 소프트웨어 업데이트 창이 뜰 것입니다. 


"컴퓨터에서 드라이버 소프트웨어 찾아보기"를 선택한 다음 

위치 검색에서 드라이버가 있는 디렉토리를 선택해 줍니다. 

w2k, wxp는 각각 Win2000과 WinXP이고 비스타 이후 버전은 

wlh입니다. 제것은 Win7이니 wlh를 선택하고 32bit이므로 x86을 선택합니다. 


"이 드라이버 소프트웨어의 게시자를 확인할 수 없습니다."라고 나오지만 무시하고(?)

그냥 설치합니다. 



그러면 무사히 드라이버가 설치될 것 입니다... ^^

장치관리자를 다시 확인해 보면 아래와 같이 드라이버가 무사히 설치되었음을 확인하실 수 있을 겁니다.




drv.zip

'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
OjOcamStereo 동작  (0) 2012/03/21
OjOcamStereo 소개  (0) 2012/03/21
Trackback 0 : Comment 0

OjOcamStereo 스펙

Camera/OjOcamStereo 2012/03/21 16:20


이제 동작이 되는 것을 보았으니 구체적인 스펙을 살펴 보도록 하지요.


우선, 기구적인 크기는 아래와 같습니다. 


대략적인 크기는 인간의 양안 사이의 거리와 비슷하게 제작했습니다. 

베이스라인의 길이를 가변으로 하자는 의견도 있었습니다만 

우선은 단순하게 가자는 의견이 우세하여 기구쪽은 단순하게 만들었습니다. 

예전에 다른 과제에서 베이스라인을 가변으로 만든 적도 있었는데,

그렇게 튼튼하지가 않아서... 이번에는 간단히 만들었습니다.


카메라 센서는 마이크론(Micron)에서 나온 MT9M111을 사용하였습니다. 

이 센서는 나온지가 좀 오래된 센서이긴 한데... 

어차피 이번에는 이미지 해상도를 VGA 급으로 생각하고 있었기 때문에 그냥 사용하기로 했습니다. 

현재로서는 수급도 가장 용이하고, 다양한 초점거리의 렌즈도 쉽게 구할 수 있는 센서입니다. 


영상을 PC로 전송하는 것은 Cypress사에서 나온 FX2를 사용합니다. 

전체적인 구조는 CMOS 카메라에서 나온 영상을 FPGA에서 합쳐서 FX2로 보내고,

FX2에서는 USB2.0 아이소크로노스 전송을 이용하여 영상을 PC로 전송하는 것입니다.



소비 전류는 측정해 보았더니 대략 190~240mA정도 소비됩니다. 

USB의 스펙상 500mA까지 허용되기 때문에 큰 문제가 없으리라 생각하지만 

혹시, 전류가 부족할 것 같으면 전원이 공급되는 USB 허브에 연결하여 사용하는 것도 한 방법일 것 같습니다.

(제가 테스트해 본 컴퓨터 중에서 전류가 부족했던 적은 한번도 없었습니다.)


스펙을 정리해 보면 대략 아래와 같네요.

- 카메라 : MT9M111

- 전송속도 : 30

- 이미지 크기 : 640x480 

- 동기화 기능 : 가능

- 소비전류 : 190~240mA

MT9M111.pdf


'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
OjOcamStereo 동작  (0) 2012/03/21
OjOcamStereo 소개  (0) 2012/03/21
Trackback 0 : Comment 0

OjOcamStereo 동작

Camera/OjOcamStereo 2012/03/21 16:16


저 같은 엔지니어는 구체적인 문서보다도 

사실 깜박이는 LED나 움직이는 동영상 하나에 더 감명(?) 받기 때문에 

우선 동작하는 모습을 동영상으로 담았습니다. 



동영상을 보시면 아시겠지만 두대의 카메라를 개별적으로 제어할 수 있습니다. 

(물론 동시에 같이 제어할 수도 있답니다. ^^...)


AutoExp를 On하면 주위 조명 상태에 따라 자동적으로 카메라 레지스터가 세팅됩니다. 

AutoExp를 Off하면 사용자가 카메라 레지스터를 제어할 수 있습니다. 

제어하는 레지스터는 크게 셔터 스피드와 게인이 있습니다. 


셔터 스피드는 카메라의 노출시간을 제어하는 것으로 노출이 많이 되면

어두운 곳에서도 밝은 영상이 나오지만 당연히 블러(Blur)가 발생하구요. 

셔터 스피드를 낮추면 노출이 적게 되니 영상은 어둡지만 블러가 적게 됩니다. 

게인은 밝기를 조절할 수있는 값으로 RGB를 각각 개별적으로 제어할 수 있습니다. 


일반적으로 영상처리에서는 영상이 밝게 들어오면서 블러가 적기를 바라기 때문에 

이럴 경우에는 외부 조명을 강하게 하고 셔터 스피드를 낮추는 것이 답입니다. 

외부 조명을 강하게 사용할 수 없으면서 블러가 적기를 바라면 

셔터 스피드를 낮추고 게인을 높이는 것이 답입니다. 

하지만 이럴 경우 당연히 영상에는 노이즈가 심해지겠지요.


모든 것을 만족시키는 답은 없습니다. 

저 같은 경우 블러를 허용할 수 있는 범위에서 셔터 스피드를 조절하고 

그다음에 게인을 조절합니다. 

물론 외부 조명을 조절할 수 있으면 가장 좋구요....

'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
OjOcamStereo 동작  (0) 2012/03/21
OjOcamStereo 소개  (0) 2012/03/21
Trackback 0 : Comment 0

OjOcamStereo 소개

Camera/OjOcamStereo 2012/03/21 16:07

OjOcamStereo는 아래의 사진과 같은 스테레오 카메라입니다. 


최종적으로 거리를 계산하는 알고리즘까지 구현을 하려고 하고 있지만

아직까지는 스테레오 영상을 받아들이는 부분까지만 구현되어 있습니다.

(알고리즘은 언제 구현하려나...^^;;)


대신 스테레오 비전을 실험할 수 있도록 영상을 실시간으로 받아들일 수 있고, 

노출시간등과 같은 카메라의 파라메터를 각 카메라별로 제어할 수 있도록 하였습니다. 

양쪽 카메라 사이의 동기화 기능도 구현되었구요...


우선은 스테레오 알고리즘을 구현할 수 있는 기본 하드웨어를 만드는 것이 목적이었고,

하드웨어가 완성되면 저희도 다양한 스테레오 알고리즘을 실험/구현하려고 생각하고 있습니다. 


혹시, OjOcamStereo를 사용하다가 불편하신 점이 있으시면 댓글이나 메일로 연락을 주세요... 

다음 버전을 제작할 때 최대한(?) 반영하도록 하겠습니다. 

물론 저희도 사용자이기 때문에 써보고 불편하면 바꾸겠지요...


OjOcamStereo를 기획할 때 우선은 아래와 같은점들을 고려하였습니다. 

- 이미지 크기는 VGA(640x480)급으로 하자. 

- 영상 캡쳐는 초당 30 프레임으로 한다. 

- 카메라의 셔터 스피드(Shutter Speed)를 조절할 수 있어야 한다. 

- 카메라의 게인(Gain)을 조절할 수 있어야 한다.

- 양쪽 카메라 사이의 동기화가 구현되어야 한다.

- PC 인터페이스는 사용하기 편한 USB 2.0을 이용하자.

- 다양한 실험을 할 수 있도록 다양한 초점 거리의 렌즈를 사용할 수 있어야 한다. 

OjOcamStereo 사용자가이드 rev.A_1.pdf

 


판매 사이트


'Camera > OjOcamStereo' 카테고리의 다른 글

프로그램 동작  (0) 2012/03/24
드라이버 설치(Win7 64bit)  (0) 2012/03/24
드라이버 설치  (0) 2012/03/24
OjOcamStereo 스펙  (0) 2012/03/21
OjOcamStereo 동작  (0) 2012/03/21
OjOcamStereo 소개  (0) 2012/03/21
Trackback 0 : Comment 0