더북(TheBook)

허프 변환을 구현할 때, ρ 값을 결정하기 위해 모든 각도에 대하여 xsinθ+ycosθ 연산을 수행해야 한다. 이때 삼각함수의 연산을 상당히 많이 중복하여 사용하게 된다. 이러한 경우 삼각함수를 미리 계산하여 따로 배열에 저장해두고 사용하면 실제 프로그램 동작 시 중복되는 삼각함수 연산을 줄일 수 있어서 효과적이다. 이처럼 중복되는 연산의 값을 미리 계산하여 저장해두는 배열을 룩업 테이블lookup table이라고 부른다. 다음은 sin, cos 함수에 대하여 룩업 테이블을 만드는 코드이다.

const float PI_F = 3.14159265358979323846f;
int num_ang = 360;

float* sin_tbl = new float[num_ang];
float* cos_tbl = new float[num_ang];

for (i = 0; i < num_ang; i++)
{
    sin_tbl[i] = sin(i * PI_F / num_ang);
    cos_tbl[i] = cos(i * PI_F / num_ang);
}

위와 같이 삼각함수의 값을 미리 계산해두면, 실제 허프 변환 과정에서는 sin, cos 삼각 함수를 호출하지 않고 대신 sin_tbl, cos_tbl 배열을 바로 참조하여 사용할 수 있다.

허프 변환을 이용한 직선 검출 함수의 선언을 IppFeature.h 파일에 추가하자.

#include <vector>
...
void IppHoughLine(IppByteImage& img, std::vector<IppLineParam>& lines, int threshold = 60);

IppHoughLine 함수는 세 개의 인자를 받는다. 첫 번째 인자 img는 입력 영상이며, 두 번째 인자 lines는 검출된 직선 성분들의 정보를 저장할 컨테이너이다. lines 변수의 타입이 std::vector<IppLineParam>&이므로 IppFeature.h 파일 상단에 #include <vector> 문장을 추가해야 한다. 세 번째 인자 threshold는 직선 성분으로 판단하기 위한 임계값으로써, 축적 배열에 누적된 값이 threshold 값보다 크면 직선으로 간주한다. IppHoughLine 함수의 전체 내용은 소스 11-8에 나타내었다

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.