0 Replies
      Latest reply on Apr 9, 2019 6:54 AM by ddixon91
      ddixon91 Level 1 Level 1 (0 points)

        How can I rectify the AVDepthData using this function?  I haven't been able to find any examples online of how to do the actual rectification process and I'm somewhat at a loss. Any help would be greatfully appreciated.

         

        Thanks

        David

         

        func lensDistortionPoint(for point: CGPoint, lookupTable: Data, distortionOpticalCenter opticalCenter: CGPoint, imageSize: CGSize) -> CGPoint {
                // The lookup table holds the relative radial magnification for n linearly spaced radii.
                // The first position corresponds to radius = 0
                // The last position corresponds to the largest radius found in the image.
                
                // Determine the maximum radius.
                let delta_ocx_max = Float(max(opticalCenter.x, imageSize.width  - opticalCenter.x))
                let delta_ocy_max = Float(max(opticalCenter.y, imageSize.height - opticalCenter.y))
                let r_max = sqrt(delta_ocx_max * delta_ocx_max + delta_ocy_max * delta_ocy_max)
                
                // Determine the vector from the optical center to the given point.
                let v_point_x = Float(point.x - opticalCenter.x)
                let v_point_y = Float(point.y - opticalCenter.y)
                
                // Determine the radius of the given point.
                let r_point = sqrt(v_point_x * v_point_x + v_point_y * v_point_y)
                
                // Look up the relative radial magnification to apply in the provided lookup table
                let magnification: Float = lookupTable.withUnsafeBytes { (lookupTableValues: UnsafePointer<Float>) in
                    let lookupTableCount = lookupTable.count / MemoryLayout<Float>.size
                    
                    if r_point < r_max {
                        // Linear interpolation
                        let val   = r_point * Float(lookupTableCount - 1) / r_max
                        let idx   = Int(val)
                        let frac  = val - Float(idx)
                        
                        let mag_1 = lookupTableValues[idx]
                        let mag_2 = lookupTableValues[idx + 1]
                        
                        return (1.0 - frac) * mag_1 + frac * mag_2
                    } else {
                        return lookupTableValues[lookupTableCount - 1]
                    }
                }
                
                // Apply radial magnification
                let new_v_point_x = v_point_x + magnification * v_point_x
                let new_v_point_y = v_point_y + magnification * v_point_y
                
                // Construct output
                return CGPoint(x: opticalCenter.x + CGFloat(new_v_point_x), y: opticalCenter.y + CGFloat(new_v_point_y))
            }