[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() 함수의 리턴값으로 어떤 버퍼에 영상이 들어 왔는지 확인할 수 있다.
전송된 이미지데이터
USB에 연결하고 "Connect" 로 영상데이터를 수신할 수 있다.
프레임 버퍼의 영상을 꺼내서 처리할때는 아래와 같이 할 수 있다.
S3C6410 영상 전송 테스트 동영상
S3C6410 카메라 영상 전송 테스트 소스코드
제공되는 함수를 이용하면 쉽게 영상을 획득 및 처리할 수 있다.
좀더 소형으로 제작해 임베디드 영상 처리 쪽으로 사용할 수 있도록 제작한 보드
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]);
}
//-----------------------------------------------------------
}
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];
:
}
:
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]);
}
//----------------------------------------------------------
}
}
{
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]);
}
//----------------------------------------------------------
}
}
좀더 소형으로 제작해 임베디드 영상 처리 쪽으로 사용할 수 있도록 제작한 보드
반응형