본문 바로가기
Computer Vision

16. Generalized Hough Transform

by 꿈꾸는 띵땅근 2021. 2. 27.
학습 내용
1. Generalized Hough Transform
2. Generalized Hough Transform Code C++

 

 

1. Generalized Hough Transform


• model을 갖고 이미지 내에 모델을 회전시키거나 스케일변화를 적용한 물체를 찾을것이다.
• theta 는 1도 간격으로 1~360도 범위를 보면 된다.
• 스케일 변화는 본인이 설정하면 된다. 나는 0.1부터 2.0까지 0.1단위로 찾아볼것이다.
• Parameter(=accumulator가 어떤 변수들로 만들어지는지) : Xc, Yc, s, theta

→ Hough Space의 x축은 Xc, y축은 Yc가 될것이다.

→ s, theta를 달리 하면서 그래프를 그려 나가면 되는것이다. 

→ 코딩으로 구현할떄는 s, theta별로 배열을 다르게 해서 Accumulator를 만들면 되겠다. 

 

 

 


Hough Transform의 장단점

 

 

 

 

 

 

 

 

2. Generalized Hough Transform Code C++


중심점을 미리 설정해놓아야 한다. 나같은 경우는, 데이터들의 평균 x, 평균 y를 중심점으로 잡았다. 

Dir과 Ang은 다르다!!! 

Dir은 엣지점에서 바깥으로 나가는 방향이거나 안쪽으로 들어오는 방향을 0~4로 나눠놓은것이고, 

Ang은 중심과 엣지점 사이의 각도를 말한다. 

Hough Circle에서는 Ang을 0~4로 나눠놓은것을 Dir로 했는데, 그 이유는, 원은 중심이 가운데에 있기 때문이다!

그러나, Generalized Hough Transform에서는 중심을 임의의 점으로 설정하기 때문에, 중심이 아니므로, Dir과 Ang은 다르다. 

Generalized hough transform 코딩 개념이 뭐냐면, 

일단 model을 보고 

mDir (모델 dir)

mAng

mDist 이 세가지 정보를 얻어서 등록한다. 

---

mDir은 엣지점에서 바깥쪽 또는 안쪽으로 오는 방향을 4방향으로 나눠서 등록하는거고, 

mAng은 model중심점과 엣지 점간의 각도를 의미하고

mDist는 model중심점과 엣지 점간의 거리를 의미한다. 

 

canny edge를 수행하면 

eDir (엣지 dir)

eAng

eMag 이 세가지 정보를 얻는데, 

여기서 eAng은 엣지점에서 바깥쪽 또는 안쪽으로 오는 방향을 각도로 정확하게 나타낸 것이고

이것을 4방향으로 나타낸 것이 _dir이다. 

 

그래서, Generalized Hough transform은, 

일단 모델 정보를 받아서 위의 3가지 정보를 등록하고, 

Canny edge 를 수행하여 실제 엣지 점들에서 _ang과 _dir을 알 수 있다. 그런데, 사실 _dir은 필요 없고, 

_ang에서 위의 theta(회전했을거라고 생각하는 각도)만큼을 빼줘야 한다. 그걸로 dir을 새로 구한다. 

이제 준비는 완료되었고, 

엣지 점 한점 한점마다 새로구한 dir이 예를들어 3이라 한다면, model에서 dir이 3인 녀석들 정보를 싸그리 갖다가 voting하는것이다. 여기에 scale을 곱해서 거리를 조정할 수 있다. (나는 그냥 스케일은 안했다. 넘 복잡해져서) 그리고, theta만큼 회전한것을 고려해줘야 한다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처

댓글