Open3D

(Open3D)#7 포인트 클라우드로 직사각형 단면 수치 정보 확인하기 - 실전 적용

IT & Civil Oreh 2024. 9. 9. 01:05

(Open3D)#6 포인트 클라우드로 직사각형 단면 수치 정보 확인하기 - Convex Hull 알고리즘 활용 (tistory.com)

 

(Open3D)#6 포인트 클라우드로 직사각형 단면 수치 정보 확인하기 - Convex Hull 알고리즘 활용

지난 글에서 간단하게 설명했던 Convex Hull 알고리즘을 활용해서이번에는 실제 단면의 수치 정보를 확인하고자 한다. Convex Hull은 볼록 다각형이다.내가 가진 데이터는 직사각형이다. 직사각형은

ywlee3460.tistory.com

 

 

 

오늘은 지금까지 했던 직사각형의 단면 수치 정보를 확인하는 알고리즘을 짜보고 실습도 하고 결과도 도출했었는데, 얼마나 결과가 잘 나왔는지에 대한 지표가 없었던 탓에, 실제로 내가 실측할 수 있는 구조물을 대상으로 적용해보려고 한다.

 

먼저 적용해볼 구조물은 내가 속해있는 연구실의 문을 대상으로 한다.

 

사진으로 보면 이렇게 생긴 문이다. 나는 이 문의 가로, 세로 길이를 알고리즘을 통해서 도출하고자 한다.

 

3D 포인트 클라우드 데이터를 얻기위해서 3D 스캐너로는 Vidoc 을 사용하였다. Vidoc은 아이폰과 결합하여 사용할 수 있는 휴대용 3D 스캐너이다. 이 장비를 사용하여 포인트 클라우드 데이터를 업로드하여 분석하였다.

 

지금까지 내가 포인트 클라우드 데이터 분석에서 사용한 파일 형식은 전부 LAS 파일이였다. 하지만 Vidoc을 통해 포인트 클라우드 데이터를 얻으면 PLY 형식으로 나온다. Vidoc은 PIX4D CATCH 어플을 깔아서 블루투스 연결을 하고 사용하면 되는데, 이 어플을 통해 스캔을 하고 PIX4D CLOUD로 업로드하면 PLY 형식으로 보내진다.

 

PIX4D CLOUD 에서 LAS 파일로 변형해서 파일 내보내기가 가능하지만 여기서 문제가 생겼다. PIX4D CLOUD에서 LAS파일로 변환하고 파이썬에서 LAS 파일을 불러오면 데이터가 시각화되지 않는다. 문제의 원인을 알아보았지만 확실한 문제원인은 파악하지 못했으나, 한 가지 의심해볼 수 있는 것이 있다. 바로 '좌표체계'이다. 포인트 클라우드에서 좌표는 아주 중요하지만 나는 아직 좌표에 대한 공부가 덜 되었기 때문에, 당장은 확실히 알 수 없지만, 전에 했던 공사데이터와 같은 방식으로 진행했을 때, 저번에는 되었지만 이번엔 되지 않았다. 이 둘의 차이로는 일단 스캐너가 달랐다. 공사현장에서 취득한 데이터는 Trimble의 SX12, 이번 데이터는 Vidoc이기 때문에 저번에는 운이 좋게 데이터를 잘 불러왔지만, 이번엔 아닌것같다. 이 문제에 대해서는 나중에 다시 고민해보고 일단 파이썬은 PLY 파일형식도 불러올 수 있기때문에, 그렇게 큰 문제가 되지는 않았다.

 

Vidoc으로 스캔한 PLY형식의 데이터를 파이썬으로 불러와서 시각화 하였다. 보다시피 노이즈가 많으며, 문 앞에도 데이터 이상하게 찍혀서 문을 다 가리게끔 나왔다. 하지만, 뒤쪽에서 보면 문도 잘 스캔되어서 문제가 될건 없다. 파일을 불러오는 과정에서 이렇게 된건지, 아님 내가 애초에 잘 못 찍은건지.. 근데 또 PIX4D CLOUD에서 확인하면 잘 찍히긴했다. 여튼 불러온 PLY 파일에서 RANSAC 알고리즘을 통해 '문'에 대한 평면 데이터만을 추출한다.

 

 

 

여러 각도에서 확인해보면 RANSAC 알고리즘은 잘 적용된듯하다. 이제 여기서 빨간색 영역, 즉 평면 데이터만 뽑아서 시각화 하였다. 나는 '문'에 대한 데이터가 필요하기 때문에, 평면데이터는 '문' 데이터라고 생각하면 된다.

 

 

아무래도 데이터의 정밀도를 위해, 임계값은 저번 실습보다 작은 값(0.005)으로 하였고, 반복 횟수도 10000번으로 하였다.

 

 

결과가 잘 나온듯 하다. 이제 저번에 했던 것처럼 2D 평면으로 투영하고 Convex Hull과 코너 포인트를 활용하여 결과를 추출하려고 했으나, 문제가 생겼다. 역시나 좌표 문제다. 저번에는 z좌표를 무시하고도 x,y 평면에 잘 투영 되었지만 이번엔 z값을 무시하면 아예 다르게 투영되어 원하는 결과를 도출할 수 없었다. 그래서 생각한 방법으로는 도출한 3차원 상의 평면 방정식을 회전시켜서 이 평면이 x,y 축과 수평하게 맞도록 정렬하는 것이다. 쉽게 말해, 도출한 평면 방정식(평면)을 회전시켜 x,y 평면과 평행하게 만드는 것이다. 이렇게 되면 z값을 무시하고 x,y 평면에 2D로 투영해도 모양이 변하지 않고 잘 투영된다. 이렇게 코드를 조금 수정해주고 결과를 도출하였더니 원하는 결과를 얻을 수 있었다. 

 

2D 평면 상으로 잘 투영되었고, 이제 Convex Hull과 코너 포인트를 이용하여 가로, 세로 길이를 도출하였다.

 

'문'을 대상으로 한 결과, 본 알고리즘을 통해 도출된 가로, 세로 길이는 다음과 같다.

 

첫 번째 가로길이 (side 2) =

0.8528738276585793

 

두 번째 가로길이(side 4) =

0.8263327570520945

 

첫 번째 세로길이(side 1) =

2.040040539735653

 

두 번째 세로길이(side 3) =

2.010042953267445

 

이제 실측값과 내 코드를 통한 값, 그리고 PIX4D CLOUD를 통한 값. 이렇게 3가지 결과를 비교해 볼 차례이다.

 

먼저, '문'의 실측값은 다음과 같다.

1. 가로 = 0.86 m

2. 세로 = 2.03 m

 

다음은 PIX4D CLOUD에서 얻을 수 있었던 값은 다음과 같다.(하지만 이 값은 본인이 직접 눈대중으로 선을 그어서 얻은 값이므로 이 또한 정확하지 않고, 이것도 결과가 매번 달라짐)

1. 가로 = 0.855

2.세로 = 2.028

 

 

 

이제 유사도를 퍼센트로 계산해보면 다음과 같다.

결과를 보면 보다시피, 실제 상업용 소프트웨어 PIX4D CLOUD의 값이 더 정확하게 도출된 것을 확인할 수 있다.

하지만, 나의 알고리즘을 통한 결과값도 분명 나쁘지 않은 결과가 도출되었다. 물론 정확도가 높으면 높을 수록, 오차는 작으면 작을수록 좋지만, 현재 토목에서는 1~3cm의 오차정도는 나쁘지 않은 수준이다. 그리고 분석에 사용한 데이터의 품질이 너무 떨어졌다. 노이즈도 많았고...내 알고리즘 보다는 현재 사용되는 상업용 소프트 웨어가 좋은 성능을 보이는 것 같다. 아무래도 PIX4D CLOUD에서는 메쉬처리도 다 해주는 기능이 있기 때문이다. 하지만, 어느정도 허용오차 범위안에 들어갈 수 있다는 점과, 퀄리티가 그리 뛰어나지 않은 데이터로 이 정도의 결과를 도출한 것에 대해서 의의가 있고, 데이터 품질이 좋으면 더 나은 결과가 나올 것 같다. 그래도 더욱 더 오차를 줄이고 정밀도를 올릴 수 있도록 계속 생각해봐야 할 것 같다.

 

 

 

 

마지막으로 본 실습에 있어서 한계점과 느낀점, 향후 방향성이다.

1. 한계점으로는 먼저, 저번 실습에서 사용한 SX12로 취득한 포인트 클라우드 데이터보다 이번 실습에서 사용한 Vidoc으로 취득한 포인트 클라우드의 데이터 퀄리티 차이이다. 아무래도 장비를 고정시키고 사용하는 더 비싼 장비인 SX12의 데이터 품질이 훨씬 좋기에 노이즈도 적고 결과도 깔끔하게 나오는 편이다. 이에 비해, Vidoc은 내가 이동하면서 스캔을 해야하고, 아무래도 장비 사양 자체가 SX12에 비해 떨어지기 때문에 노이즈도 더욱 심하고 데이터 품질이 그리 좋지 않은 환경이였다. 이 부분은 장비 사용에 대해 더 숙지할 필요가 있겠으며, SX12와 Vidoc의 차이를 한번 보는 것도 좋을 듯 하다.

 

2. 왜 PIX4D에서 LAS파일로 변환하고 파이썬으로 불러오면 데이터 시각화가 안되는지를 좀 더 생각해보고 확인해볼 필요가 있겠다. 가장 의심스러운 점이 좌표 체계인데, 이 부분은 더 공부하고 확인해봐야겠다. PLY 파일로 불러올 수 있어서 큰 문제가 되지는 않았지만 향후 해보고 싶은 것이 생겼을 때, 발목 잡힐 수가 있다.

 

3. 3D 포인트 클라우드를 2D로 투영시킬 때, 평면방정식(평면)을 x,y축에 평행하게끔 회전시켜서 투영했는데, 저번 실습에서는 바로 투영했기 때문에 저번 실습에서의 코드를 수정해서 다시 한번 적용해볼 필요가 있다.

 

4. 제일 중요한 점으로, 내가 구현한 코드는 RANSAC 알고리즘이 주요 Key Point이다. 하지만 RANSAC 알고리즘 특성상 확률이 작용하기때문에, 알고리즘을 실행할 때마다 다른 결과값이 도출된다. 이 부분을 방지하기 위해 반복횟수를 높이는 것인데, 그래도 제일 좋은 결과가 나오지 않을 수도 있다. 이 부분이 제일 큰 한계점인데,,,, 그래도 이 부분에 대해서는 3D 포인트 클라우드 데이터의 품질이 좋다면 어느 정도는 해결될 수 있을 것이라 생각된다. 이래서 좋은 장비를 사용하는 것인가 싶다. 저번 공사 현장 데이터만 봐도 노이즈가 심하지 않고 데이터 퀄리티가 엄청 좋다.

5. 내가 사용한 알고리즘 말고도 단면의 수치정보를 확인할 수 있는 다른 알고리즘을 찾아보는 것도 좋을 듯 하다.