본문 바로가기

LiDAR

iOS LiDAR 화면 하단 영역만 PointCloud 검출

728x90

이전 글

2024.03.03 - [LiDAR] - iOS 가로 세로 모드 설정와 연결되는 내용입니다.


화면을 세로 모드로 설정하는 것은 성공했으니 전체 영역의 pointcloud가 아닌 화면의 하단 영역만 pointcloud를 취득할 수 있는 방법에 대해 알아야했습니다.

위 링크의 코드에서 

func makeGridPoints() -> [Float2] {
        // 카메라 이미지의 너비와 높이를 곱함
        let gridArea = cameraResolution.x * cameraResolution.y
        // 전체 이미지 영역을 포인트 수로 나눈 후의 간격 => 이미지를 설정된 포인트 수로 나눔
        let spacing = sqrt(gridArea / Float(numGridPoints))
        
        // 가로방향의 격자 수
        let deltaX = Int(round(cameraResolution.x / spacing))
        // 세로방향의 격자 수 => 2로 나누니까 상단 절반 부분만 포인트 클라우드 생성함
        let deltaY = Int(round(cameraResolution.y / spacing))
        
        // 포인트 생성
        var points = [Float2]()
        for gridY in 0 ..< deltaY {
            let alternatingOffsetX = Float(gridY % 2) * spacing / 2
            for gridX in 0 ..< deltaX {
                let cameraPoint = Float2(alternatingOffsetX + (Float(gridX) + 0.5) * spacing, (Float(gridY) + 0.5) * spacing)
                
                points.append(cameraPoint)
            }
        }
        return points
    }

 해당 부분이 카메라 화면을 기준으로 x축 y축에 대한 pointcloud 값을 가져오는 것을 알게 되었습니다. 

 

앞서 Python computer vision을 공부한 내용에 따라

화면의 좌측 상단이 (0,0)이며 왼쪽으로 갈수록 x값이 증가하고 아래로 갈수록 y값이 증가하겠지!!!??

라고 생각하고 화면의 하단 영역(아래 절반 영역)만 얻기 위해 delaY값에 대한 코드를 변경하고자 했습니다

 

우선 for문이 0부터 커지는 반복문이 실행되면 상단 부분만 얻을 수 있으므로 반대로 점점 작아지는 반복문이 있나 찾아보니 

.reversed()

를 이용하면 거꾸로 점점 값이 작아지는 반복문이 된다는 것을 알게되었습니다.

 

그래서 코드를 

// 포인트 생성
        var points = [Float2]()
        for gridY in (deltaY/2 ..< deltaY).reversed() {
            let alternatingOffsetX = Float(gridY % 2) * spacing / 2
            
            for gridX in 0 ..< deltaX {
                let cameraPoint = Float2(alternatingOffsetX + (Float(gridX) + 0.5) * spacing, (Float(gridY) + 0.5) * spacing)
                
                points.append(cameraPoint)
            }
        }
        return points

와 같이 작성하고 실행을 하니!!!!!

 

??

위 사진과 같이 하단 절반이 아닌 왼쪽 절반에 대한 pointcloud를 가져오는 것을 확인했습니다...?

 

그래서 이유를 찾아보니

ARCamera의 카메라 좌표계가 위 사진과 같다는 글을 통해 그럼 혹시 

위 사진과 같이 세로모드를 해도 카메라 좌표계는 변하지 않는건가?? 

 

라는 생각으로 코드를

var points = [Float2]()
        for gridY in 0 ..< deltaY {
            let alternatingOffsetX = Float(gridY % 2) * spacing / 2
            
            for gridX in (deltaX/2 ..< deltaX).reversed() {
                let cameraPoint = Float2(alternatingOffsetX + (Float(gridX) + 0.5) * spacing, (Float(gridY) + 0.5) * spacing)
                
                points.append(cameraPoint)
            }
        }
//        print(points)

        return points

위와 같이 변경하니

 

사진과 같이 하단 부분의 pointcloud만 가져오는 것에 성공했습니다!!!!!

(혹시 뉴비의 생각이 틀렸다면 댓글로 알려주시면 감사하겠습니다ㅠㅠㅠㅠ!!)

 


참고자료

 

GitHub - isakdiaz/arkit-scenedepth-pointcloud: IOS example app to generate point clouds in ARKit using scenedepth

IOS example app to generate point clouds in ARKit using scenedepth - isakdiaz/arkit-scenedepth-pointcloud

github.com

 

Apple ARCamera. Camera parameters explanation for 3D reconstruction pipeline

If you start working with ARKit for the first time you might notice that Apple documentation doesn’t have very detailed descriptions and…

medium.com

 

'LiDAR' 카테고리의 다른 글

Ouster LiDAR 정보를 Unity로 보내기  (0) 2024.03.08
Ouster LiDAR pointcloud를 확인해보자  (2) 2024.03.08
iOS 가로 세로 모드 설정  (0) 2024.03.03
Flutter + Unity AR  (0) 2024.02.27
Unity iOS notification  (0) 2024.02.27