Gaussian Filter
그냥 불규칙 적인 수치(잔떨림)를 정규분포로 평활화 하는 필터로, 가장 구현이 쉽다고 한다.
가우시안 블러랑은 또 다른개념이다
이전 프레임 일곱개를 받아서 그 이전 프레임의 평균치를 내어 이상현상을 방지하는 필터
전공에 배우지 말아야 할 것 없고, 모르는게 더 많으니까 또 공부해야겠다.
자세한 필터 설명은 다음에 하고,
오늘은 내 AR 솔루션에 적용시킬 코드만 적어놓겠다.
//////////////////////////////////초기화/////////////////////////////////
float Sigma = 2.0f; // 가우시안 필터 시그마값 조절
mTotal = 0.0f; // 전체 가중치
for ( int i = 0; i < COUNT_OF_WEIGHTS; i++ )
mPositionSet[i].set(0.0, 0.0, 0.0);
for ( int i = 0; i < COUNT_OF_WEIGHTS; i++ ) // 7개 : 현재 프레임 하나 + 이전 프레임 여섯개 획득
{
float Position = static_cast< float >( COUNT_OF_WEIGHTS / 2 - i ); // 위치 프레임 x
mTable[i] = std::expf( -( Position * Position ) / ( 2.0f * Sigma * Sigma ) ) / ( std::sqrt( 2.0f * 3.1415f ) * Sigma ); // 2차원 가우시안 분포 수식
mTotal += mTable[i]; // 각 프레임 별 가우시안 분포 총합
}
mTotal = 0.0f;
for ( int i = 0; i < COUNT_OF_WEIGHTS; i++ )
mPositionSet[i].set(0.0, 0.0, 0.0); // 벡터 초기화
////////////////////////////////가우시안 분포 계산//////////////////////////
mMoveMat.set(m[0][3], m[1][3], m[2][3]);
// printf("in : %f, %f, %f //\n", m[0][3], m[1][3], m[2][3]);
for ( int i = 1; i < COUNT_OF_WEIGHTS; i++ )
{
mPositionSet[ i - 1 ] = mPositionSet[i]; // 카메라에서 얻은 이동행렬(벡터) 한칸씩 뒤로 밀자
}
mPositionSet[ COUNT_OF_WEIGHTS - 1 ] = mMoveMat; // 이동행렬 세트에 넣기
Vec3 FilteredPosition;
FilteredPosition.set(0.0, 0.0, 0.0); // 가우시안 필터 입힌 결과를 넣을 벡터변수 초기화
for ( int i = 0; i < COUNT_OF_WEIGHTS; i++ )
{
for( int j = 0; j < 3; j++)
{
FilteredPosition.v[j] += mTable[i] * mPositionSet[i].v[j]; // 최근 7개 벡터를 가우시안 필터 적용 후 전부더해
}
}
for (int i = 0; i < 3; i++)
FilteredPosition.v[i] = FilteredPosition.v[i] / mTotal; // 그리구 전부더한 전체 벡터와 가우시안 분포 총합을 나눠줘
m[0][3] = FilteredPosition.v[0];
m[1][3] = FilteredPosition.v[1];
m[2][3] = FilteredPosition.v[2]; // 가우시안 필터링 된 벡터 적용
'Augmented Reality > Image Processing' 카테고리의 다른 글
Gaussian Pyramid (0) | 2014.06.10 |
---|---|
영상처리 영문용어 (0) | 2014.06.10 |
Kalman Filter (5) | 2014.05.27 |
SIFT (0) | 2014.05.27 |