2017-11-10 50 views
6

Próbuję znaleźć dane głębokości w określonym punkcie przechwyconego obrazu i zwrócić odległość w meters.Jak odczytywać dane głębokości w punkcie CGPoint z bufora AVDepthData

Mam włączone dane głębokości i przechwytuję dane wraz z obrazem. Uzyskać punkt z X, Y współrzędne środka obrazu (i gdy naciśnięty) i jego konwersję do indeksu bufory stosując

Int((width - touchPoint.x) * (height - touchPoint.y)) 

z WIDTH i HEIGHT czym wymiary przechwyconego obrazu. Nie jestem pewien, czy jest to właściwa metoda, aby to osiągnąć.

obsłużyć dane takie jak głębokość:

func handlePhotoDepthCalculation(point : Int) { 

    guard let depth = self.photo else { 
     return 
    } 

    // 
    // Convert Disparity to Depth 
    // 
    let depthData = (depth.depthData as AVDepthData!).converting(toDepthDataType: kCVPixelFormatType_DepthFloat32) 
    let depthDataMap = depthData.depthDataMap //AVDepthData -> CVPixelBuffer 

    // 
    // Set Accuracy feedback 
    // 
    let accuracy = depthData.depthDataAccuracy 
    switch (accuracy) { 
    case .absolute: 
     /* 
     NOTE - Values within the depth map are absolutely 
     accurate within the physical world. 
     */ 
     self.accuracyLbl.text = "Absolute" 
     break 
    case .relative: 
     /* 
     NOTE - Values within the depth data map are usable for 
     foreground/background separation, but are not absolutely 
     accurate in the physical world. iPhone always produces this. 
     */ 
     self.accuracyLbl.text = "Relative" 
    } 

    // 
    // We convert the data 
    // 
    CVPixelBufferLockBaseAddress(depthDataMap, CVPixelBufferLockFlags(rawValue: 0)) 
    let depthPointer = unsafeBitCast(CVPixelBufferGetBaseAddress(depthDataMap), to: UnsafeMutablePointer<Float32>.self) 

    // 
    // Get depth value for image center 
    // 
    let distanceAtXYPoint = depthPointer[point] 

    // 
    // Set UI 
    // 
    self.distanceLbl.text = "\(distanceAtXYPoint) m" //Returns distance in meters? 
    self.filteredLbl.text = "\(depthData.isDepthDataFiltered)" 
} 

nie jestem przekonany jestem coraz prawidłową pozycję. Z moich badań wynika również, że dokładność jest zwracana tylko w .relative lub .absolute, a nie float/integer?

Odpowiedz

1

Wartości wskazujące ogólną dokładność mapy danych głębokości.

Dokładność mapy danych głębokości zależy w dużym stopniu od danych kalibracji kamery użytych do jej wygenerowania. Jeśli nie można dokładnie ustalić ogniskowej kamery w momencie przechwytywania, zostanie wprowadzony błąd skalowania w płaszczyźnie z (głębokość). Jeśli centrum optyczne kamery nie może być precyzyjnie określone w czasie przechwytywania, zostanie wprowadzony błąd punktu głównego, co prowadzi do błędu przesunięcia w oszacowaniu różnic. Wartości te podają dokładność wartości mapy w odniesieniu do jej zgłaszanych jednostek.

przypadek względne

wartości w danych mapy głębi są wykorzystywane do oddzielania pierwszego planu/tła, ale nie są absolutnie prawdziwe w świecie fizycznym.

przypadek bezwzględne

wartości w mapie głębokości są absolutnie prawdziwe w świecie fizycznym.

Otrzymasz CGPoint z bufora AVDepthData jak wysokość i szerokość jak poniższy kod.

// Useful data 
let width = CVPixelBufferGetWidth(depthDataMap) 
let height = CVPixelBufferGetHeight(depthDataMap) 
+0

Widziałem już pytanie, skąd skopiowałeś ten e-mail. Pokazałem również, jak uzyskać punkt danych - 'Int ((width - touchPoint.x) * (height - touchPoint.y)), który jest taki sam. To tylko opis problemu, a nie odpowiedź imo. – Allreadyhome

0

dostęp do danych głębokość przy CGPoint zrobić:

let point = CGPoint(35,26) 
let width = CVPixelBufferGetWidth(depthDataMap) 
let distanceAtXYPoint = depthPointer[Int(point.y * CGFloat(width) + point.x)] 

Mam nadzieję, że to działa.