* Haar like feature
** integral image
심플하다.. 수평방향으로 현재 pixel과 이전 픽셀을 더하고 이 결과값을 다시 인풋으로 해서 수직방향으로 더하면 Integral 이미지, 즉, 적분 이미지가 된다.
ref) 참고
coding)
for(int j=0; j<h; j++) _integral[j][0] = _image[j][0];
for(int j=0; j<h; j++) // horizontal direction weighted sum
for(int i=1; i<w; i++)
_integral[j][i] = (_integral[j][i-1]+_image[j][i]);
for(int i=0; i<w; i++) // vertical direction weighted sum
for(int j=1; j<h; j++)
_integral[j][i] += _integral[j-1][i];
** haar like feature
*** (개념) 흰색에서 검은색을 빼준다.
*** 위의 그림에서 첫번째 haar like feature 구현.
(0, 0) .. (0,w)
|---------------------------------------------|
| A | B | B' | ..
|---------------------------------------------| ..
| C | D | D' | ...
|---------------------------------------------|
.....
..... (w,h)
있다면 실제 D이 하얀색, D'가 검은색인 2 rectangle의 Haar like feature을 구현한다면,
즉, D-D' 을 구한다는 의미이다. 이는 다음과 같이 나타낼수 있다.
D region = D-C-B+A;
D' region = (A+B+C+D+B'+D')-(A+B+B')-(A+B+C+D)+(A+B)
// Rect white(D), Rect black(D')
// integral = integral image
// D
double white_region = integral [white.y+white.height][white.x+white.width]-
integral [white.y][white.x+white.width]-
integral [white.y+white.height][white.x]+
integral [white.y][white.x];
// D'
double black_region = integral [black.y+black.height][black.x+black.width]-
integral [white.y][black.x+black.width]-
integral [white.y+white.height][white.x+white.width]+
integral [black.y][black.x];
double haar = white_region-black_region;
**** 이런식으로 해서 2 rectanle, 4 retangle등을 만들수 있다.
*** Rainer Lienhart(위의 그림 오른편)가 제안하 회전된 (titled) Haar feature는 어떻게 구현해야 할까? paper보고 별로 와닿지 않아서 (어떻게 해야할지 몰라서),여기 [링크1] 를 참고했다.
45도를 회전한 Haar feature인데, 위의 그림에서 입력값은 (x=4, y=1)'s w = 4, h = 3 인 사각형을 입력 받는다. 좀 특이하다. 익숙치않음.
*** Rotated Summed Area Table
이를 이용하여 사각형 영역을 계산한다.
즉, 다음과 같이, 구할수 있다. 입력값은 바로 위에 말한대로..
(위의 링크1 에 위의 그림처럼 하면되는데, tilted integral image(?)를 왜 저렇게 만드는지는 이해하지 못했음 ㅠㅠ )
링크 1에서 보면 다음과 같은 예가 나온다.
double img[13][15] =
{ // 0 1 2 3 4 5 6 7 8 9 A B C D E
/*0*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },
/*1*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },
/*2*/ { 9,9,9,9,9,1,1,9,9,9,9,9,9,9,9 },
/*3*/ { 9,9,9,9,1,1,1,1,9,9,9,9,9,9,9 },
/*4*/ { 9,9,9,1,1,1,1,1,1,9,9,9,9,9,9 },
/*5*/ { 9,9,1,1,1,1,1,1,1,1,9,9,9,9,9 },
/*6*/ { 9,9,9,1,1,1,1,1,1,1,1,9,9,9,9 },
/*7*/ { 9,9,9,9,1,1,1,1,1,1,1,1,9,9,9 },
/*8*/ { 9,9,9,9,9,1,1,1,1,1,1,9,9,9,9 },
/*9*/ { 9,9,9,9,9,9,1,1,1,1,9,9,9,9,9 },
/*A*/ { 9,9,9,9,9,9,9,1,1,9,9,9,9,9,9 },
/*B*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },
/*C*/ { 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9 },
};
int x = 6, y = 2, h = 4, w = 6;
integral = titledintegralimage(img); // 위의 링크1 참고
int a = integral [y - 1 + (1)][x - 1 + (2)];
int b = integral [y + w - 1 + (1)][x + w - 1 + (2)];
int c = integral [y + w - 1 + h + (1)][x + w - 1 - h + (2)];
int d = integral [y + h - 1 + (1)][x - h - 1 + (2)];
RecSum(r) = (-a + b - c + d);
48이 나온다 위의 배열에서 1이 48개다.
※ 우선은 이거를 제거하고 해볼예정
Next Adaboost + Haar like feaure
'Research > Paper' 카테고리의 다른 글
[Object Detection] Robust Real-Time Object Detection (4) (0) | 2014.02.14 |
---|---|
[Object Detection] Robust Real-Time Object Detection (3) (1) | 2014.02.04 |
[Object Detection] Robust Real-Time Object Detection (1) (0) | 2014.01.22 |
[Object Detection] Class-Specific Hough Forests for Object Detection (1) (0) | 2014.01.06 |