
-
FPGA 를 이용한 영상처리 방법 ( )
- 2009/09/27
-
이번 저희 팀이 나갔던 대회는 임베디드 환경에서 영상처리를 하고 이 영상처리를 이용하여 로봇을 제어하는
대회였습니다. 임베디드 환경에서의 프로세서는 일반 PC보다는 성능이 많이 떨어지기 마련입니다.
따라서 프로세서에서 영상처리를 하게된다면 영상처리에 부하가 많이 걸리게 됩니다. 이로 인해 로봇은 상대로봇을 늦게 찾게 되고 공격 및 방어가 늦어지게 됩니다.
따라서 저희가 나갔던 대회는 영상처리를 FPGA를 사용하여 하기를 권장하는 대회였습니다. 즉 영상처리를 소프트
웨어가 아닌 하드웨어 단에서 처리하는 것이였습니다.
우선 영상처리를 하기위해선 카메라가 필요하게 됩니다. 그리고 이 카메라들은 받아들인 영상을 아날로그 값으로
출력하게 되죠.. 이 아날로그 값을 우리가 사용할수 있도록 디지털 값으로 만들어 주는 역할을 하는 것이 비디오
디코더 입니다.
하드웨어 단에서 영상처리를 하기 위하여 필요한 가장 기초적인 지식은 비디오 디코더를 이해하는 것입니다.
보통 사용하는 USB 웹켐 같은 경우도 비디오 디코더를 거쳐서 나온 데이타를 이용하는 것입니다.
비디오 디코더는 홀 수 번째 라인과 짝수 번째 라인을 번갈아 가며 뿌려주게 됩니다.
즉, 720 * 480 짜리 영상이라고 한다면 1부터 480 줄 사이의 홀수 번째 줄을 먼저 뿌려주게 되고 짝수 번째 줄을
후에 뿌려주게 됩니다. 홀 수 번째 줄인지 짝수 번째 줄인지를 알려주는 신호가 odd 라는 신호입니다.
이 신호가 high 라면 홀수 번째 줄 신호이고 low 라면 짝수 번째 신호입니다.
그리고 vref 라는 신호가 있습니다. 이 vref 로 우리는 필요한 480라인의 데이터인지 아닌지를 알 수 있습니다.
즉 720*480 중 480 을 알 수 있습니다.
이 신호의 경우 blank 신호와 active 신호를 번갈아 가며 보내줍니다.
이 때 active 신호일 때만이 우리가 원하는 영상데이타 값이 들어오게 되고 blank 일때는 소위 말하는 쓰레기
값 비슷한 값이 들어옵니다. 그냥 필요없는 값이라고 생각하시면 됩니다. 따라서 이를 불리해줘야합니다.
다음으로 href 라는 신호가 있습니다. 이 신호가 High 일때 1줄의 데이터 신호가 들어오게 됩니다.
따라서 우리는 href신호가 상승 엣지일때마다 카운트를 시킨다면 총 몇줄이 카운트되었는지를 알 수 있습니다.
하지만 이때 꼭 필요한 신호만 받아들여야 함으로 odd 신호와 vref 신호를 적절히 이용하여야합니다.
이를 간단히 verilog 코드로 표현해 보자면
====================================
always @(posedge href)
begin
if(vref == 1)
line <= line +1 ;
end
===================================
이런식으로 표현할 수 있습니다. 홀수 줄인지 짝수 줄인지를 알려고 한다면 odd신호를 적절히
and 시켜주면 되겠지요..
한줄의 신호에서 우리가 원하는 픽셀수는 720개입니다. 하지만 비디오 디코더는 720개의 유효픽셀과
138개의 필요없는 픽셀을 우리에게 보냅니다. 이것은 앞에서도 말했지만 href 신호가 high 일때가
유효 픽셀입니다 ㅎ
그럼 픽셀수는 어떻게 구분하는냐..
친절하게도 비디오 디코더는 clk_llc2 라는 클럭 신호를 또 우리에게 보내주게 됩니다.
이 신호가 상승 엣지 일때마다 한 픽셀이 들어오게 됩니다.
이때도 href를 적절히 이용하여야 겠지요 이를 코드로 표현해보면
====================================
always @(posedge clk_llc2)
begin
if(href == 1)
pixel <= pixel +1 ;
end
===================================
이런식으로 표현 할 수 있습니다.
이렇게 비디오 디코더에서 영상 데이터를 가져오는 것은 간단하게 할 수 있습니다.
하지만 영상을 획득하는 것만으론 영상처리를 할 수 없습니다.
들어온 영상데이터를 언제 초기화 시키고 언제 처리하고 언제 프로세서에게 결과 값을 알려주어야
될지가 더 중요합니다. 또한 여러가지 색 테이블 변환을 하여야지 시스템이 더 안정되게 되고
이러한 것이 FPGA를 사용하는 이유일 것입니다.
FPGA는 병렬처리를 하기 때문에 수십개의 색변환 공식을 써도 걸리는 시간은 1개의 변환 공식을
쓴것과 같은 속도를 낼 수 있기 때문입니다.
이에 대해서는 여러 말이 필요하기도 하고.. 코드를 보면서 이해하는 것이 빠르기 때문에...
이에 대해서는 소스에 주석을 달아 알려드리도록 하겠습니다. ~
-
- TRACKBACK : http://www.swssm.org/trackback.php?id=349
-
-
-
-
-
[prev] ... 1 2 3 4 5 6 7 8 9 10 ... [next]