본문 바로가기

ARM9/S3C6410

[S3C6410] 카메라 영상 처리 - USB를 이용한 영상 전송 테스트

[S3C6410] 카메라 영상 처리 - USB를 이용한 영상 전송 테스트



S3C6410 보드의 카메라 인터페이스는 J2에 연결되어 있다.



S3C6410의 경우 내부적으로 4개의 카메라 버퍼가 있고 카메라로부터 영상이 들어오면 DMA를 통하여 4개의 버퍼에 차례로 영상이 저장된다. buf[0]->buf[1]->buf[2]->buf[3]->buf[0]->…의 순서로 계속 영상이 저장된다.

영상을 받기 위해서는 Cam_GrabContinuous() 함수를 이용하여 버퍼를 설정하고 카메라를 동작시킨 후, Cam_GrabWait() 함수를 이용하여 영상이 들어올 때까지 기다리면 된다. Cam_GrabWait() 함수에서 리턴된 값은 현재 영상이 들어온 버퍼의 번호이다. (0~3까지의 리턴값) 따라서 Cam_GrabWait() 함수의 리턴값으로 어떤 버퍼에 영상이 들어 왔는지 확인할 수 있다.

 //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
 Cam_GrabContinuous(Img);
// SetCamPara();

 char data[1024];
 int len, frame;
 
 while(1)
 {
  //영상이 들어올때 까지 대기
  frame = Cam_GrabWait(Img);
  Led1Toggle();

  //영상 처리
 //-----------------------------------------------------------
  int low_limit = 0x50000+Img[0].GetSize()/4;
  len = UsbGetFill();
  if (len < low_limit)
  {
   //USB로 영상 전송
   SendImage(Img[frame]);
  }
 //-----------------------------------------------------------
 }



전송된 이미지데이터
USB에 연결하고 "Connect" 로 영상데이터를 수신할 수 있다.



프레임 버퍼의 영상을 꺼내서 처리할때는 아래와 같이 할 수 있다.
wImage Img[MAX_BUF]; // Image Buffer
  :

  if (Img[0].GetType() == MV_Y8)
  {
   int frame = Cam_GrabWait(Img);
   
   u8 **ptr = (u8 **)Img[frame].GetPtr2D();
   for (int y=0; y<Img[frame].GetHeight(); y++)
    for (int x=0; x<Img[frame].GetWidth(); x++)
     ptr[y][x] = 255 - ptr[y][x];
      :
  }



S3C6410 영상 전송 테스트 동영상




S3C6410 카메라 영상 전송 테스트 소스코드
제공되는 함수를 이용하면 쉽게 영상을 획득 및 처리할 수 있다.
int main(void)
{
 SystemInit();

 DebugPrint("S3C6410 Test - Camera Test...");
 
 //LED초기화
 Led1Init();
 Led1Off();
 
 //Switch초기화
 Sw1Init();
 
 PWPAR pPar = ParAlloc(BUF_PAR);
 ParSetFunc(pPar, CB_Func, NULL);
 
 for (int i=0; i<MAX_BUF; i++)
  Img[i].Alloc(g_width, g_height, g_type);

   //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
 Cam_GrabContinuous(Img);
// SetCamPara();

 char data[1024];
 int len, frame;
 
 while(1)
 {
  //PC에서 데이터를 요구하면
  len = UsbRead(data, sizeof(data));
  if (len)
  {
   data[len] = NULL;
   DebugPrint("Packet(len=%d) : %s\n", len, data);
   ParInput(pPar, data, len);
  }

  //포멧이 변경되면
  if (g_width!=Img[0].GetWidth() || g_height!=Img[0].GetHeight() || g_type!=Img[0].GetType())
  {
   DebugPrint("change format : %dx%d\n", g_width, g_height);   
   Cam_Halt();

   // realloc
   for (int i=0; i<MAX_BUF; i++)
    Img[i].Alloc(g_width, g_height, g_type);

   //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
   Cam_GrabContinuous(Img);
   Cam_GrabWait(Img);   // 1프레임은 받아야 한다.
  }

  //영상이 들어올때 까지 대기
  frame = Cam_GrabWait(Img);
  Led1Toggle();
  
  
  //영상처리
  //----------------------------------------------------------
  int low_limit = 0x50000+Img[0].GetSize()/4;
  len = UsbGetFill();
  if (len < low_limit)
  {
   // DebugPrint("send frame = %d\n", frame);
   
   //USB로 영상 전송   
   SendImage(Img[frame]);
  }
  //----------------------------------------------------------
 }
}



좀더 소형으로 제작해 임베디드 영상 처리 쪽으로 사용할 수 있도록 제작한 보드
반응형