맵을 합치기 위해 특징점 매칭을 수행하려 하였으나, 2D Map과 2.5D Map의 형태가 다르기 때문에
같은 포맷의 매칭에 강력한 특징점 매칭 방법은 사용하기 어렵게 되었다.
대신 Line 정보와 corner 정보를 이용하면?
1. 선 검출
선 검출을 위하여 OpenCV의 HoughLines Detection 기법을 이용했다.
참고 링크는 다음과 같다.
https://docs.opencv.org/master/d3/de6/tutorial_js_houghlines.html
2D Map에 대한 결과와 elevation Map에 대한 결과는 다음과 같다.
2. 코너점 검출
코너점 검출은 Harris Corner Detection 을 사용하게 된다.
참고한 링크는 다음과 같다.
https://docs.opencv.org/master/d4/d7d/tutorial_harris_detector.html
3. 코너점 필터링
검출된 코너들 중 잘 보면 같은 위치에서 미세한 차이로 존재하는 코너점들이 있다.
이러한 코너점은 연산속도를 떨어트릴 우려가 있으므로 하나만 남기도록 한다.
4. 코너의 ROI 구하기
이제 각 코너점의 특성을 파악하기 위하여 ROI를 구한다. 해당 부분은 아래 링크를 참조했다.
https://webnautes.tistory.com/1345
아래처럼 ROI들이 구해진다.
5. 이미지의 방향 구하기
두 개의 이미지가 서로 비슷한지 파악하기 위해서 먼저 이미지의 방향을 맞추게 된다.
이 때, 임의의 데이터에 대해 방향성을 구하는 것은 쉽지 않기 때문에 주성분 분석 방법인 PCA를 이용하기로 하였다.
참고한 링크는 다음과 같다.
https://docs.opencv.org/master/d1/dee/tutorial_introduction_to_pca.html
이를 위해 먼저 데이터를 이진화 하게 된다. (벽쪽 데이터만을 남기기 위함.)
그렇게 하면 아래와 같은 결과를 얻을 수 있다.
이후에 PCA 를 구하게 되면 아래와 같은 결과를 얻을 수 있다.
2D Map PCA의 주축의 각도는 다음과 같다.
plane angle 0 : -1.7396
plane angle 1 : -1.62298
plane angle 2 : -1.652
plane angle 3 : 0.68561
plane angle 4 : -0.184085
plane angle 5 : 0.314597
2.5D Map PCA의 주축의 각도는 다음과 같다.
elevation angle 0 : -0.101443
elevation angle 1 : -0.174445
elevation angle 2 : -1.42069
elevation angle 3 : -2.33712
elevation angle 4 : 0.51177
elevation angle 5 : -1.1927
elevation angle 6 : -1.58788
6. 이미지 회전
PCA를 이용하여 축의 정보를 얻었다. 이를 모두 얻은 각도만큼 회전시켜서 같은 포즈의 이미지를 비교할 수 있다.
참고링크는 다음과 같다.
https://spring.ghost.io/opencv-image-rotate/
주의할 사항은 PCA를 통해 얻은 축과 각도 정보가 2D Map 과 2.5D Map에 대해 같은 위치라고 항상 일치하지는 않는다는 것이다.
2.5D Map은 2D Map보다 노이즈가 많고, 데이터의 높이정보도 포함하기 때문이다.
이미지들을 회전시키면 다음과 같은 정보를 얻을 수 있다.
7. 이미지간의 관계성 파악
이제 이 이미지들 간의 관계를 파악할 것이다.
NCC(Normalized Cross Correlation)을 사용할 것이며, 참고한 링크는 다음과 같다.
이미지들간의 관계성은 다음과 같다.
result 0 and 0 : 129
result 0 and 1 : 216
result 0 and 2 : 133
result 0 and 3 : 98
result 0 and 4 : 152
result 0 and 5 : 144
result 0 and 6 : 153
result 1 and 0 : 234
result 1 and 1 : 83
result 1 and 2 : 35
result 1 and 3 : 224
result 1 and 4 : 197
result 1 and 5 : 91
result 1 and 6 : 71
result 2 and 0 : 107
result 2 and 1 : 116
result 2 and 2 : 18
result 2 and 3 : 126
result 2 and 4 : 54
result 2 and 5 : 216
result 2 and 6 : 229
result 3 and 0 : 13
result 3 and 1 : 24
result 3 and 2 : 206
result 3 and 3 : 246
result 3 and 4 : 97
result 3 and 5 : 24
result 3 and 6 : 161
result 4 and 0 : 92
result 4 and 1 : 65
result 4 and 2 : 134
result 4 and 3 : 4
result 4 and 4 : 225
result 4 and 5 : 118
result 4 and 6 : 141
result 5 and 0 : 101
result 5 and 1 : 159
result 5 and 2 : 204
result 5 and 3 : 151
result 5 and 4 : 111
result 5 and 5 : 21
result 5 and 6 : 189
보면 2D Map의 이미지 3과 2.5D Map의 이미지 3이 관계성이 가장 높은 것을 알 수 있다. (실제로도 같은 위치, 같은 방향 이다.)
위 결과를 이미지로 나타내면 다음과 같다.
(3,3) 위치의 픽셀이 가장 밝은 것을 확인할 수 있다.
더 정확한 결과를 확인하기 위해 normalize를 수행하면 다음과 같다.
8. 2.5D 이미지 회전 및 사이즈 맞추기
이제 매칭되는 좌표를 중심으로 PCA를 통해 얻어낸 각도만큼 2.5D 이미지를 회전시킨다.
이후에, 2D 이미지와 2.5D 이미지의 특징점을 맞추면서 크기를 조절하면 다음과 같은 결과를 만들 수 있다.
얼추 비슷한 형태를 얻었지만, 아직 완벽하진 않다. 이를 해결하기 위해 다음의 과정을 수행한다.
9. 라인 검출
먼저 FLD ( Fast Line Detection ) 알고리즘을 이용해 라인을 검출한다.
참고한 링크는 다음과 같다.
https://docs.opencv.org/master/d1/d9e/fld_lines_8cpp-example.html#a7
결과는 아래와 같다.
10. 라인 필터링
무수한 선들이 검출되는 것을 확인할 수 있는데, 우리가 필요한건 매칭된 코너 주변의 선들이다.
이를 위해, 코너점 주변의 선들만 남기면 아래와 같다.
11. 2.5D 이미지 회전
이 후에, 각도가 비슷한 선 쌍을 찾은 뒤, 두 선 사이의 각도를 구해 매칭점을 중심으로 해당 각도만큼 회전(기하학적 방법)시키게 되면 아래와 같은 결과를 얻을 수 있다.
12. 이미지 합치기
이제 매칭하는 지점을 중심으로 두 이미지를 합친다.
이 때, 2D 이미지의 데이터 보다 2.5D의 데이터가 더 많은 정보를 지니고 있으므로, 2D 이미지와 겹치는 지점은 2.5D 이미지의 데이터로 덮기로 한다.
3번째 사진과 같이 합쳐진 이미지를 확인할 수 있다.
'Research' 카테고리의 다른 글
[Research] Visual-Lidar SLAM for UAV (0) | 2020.10.08 |
---|---|
[Research] ICP(Iterative Closest Points) (0) | 2020.07.20 |
[Research] realsense depth-color alignment (0) | 2020.07.17 |
[Research] ov_secondary install (0) | 2020.05.27 |