Как получить соответствующий пиксель глубины при обнаружении объекта VisionIOS

Программируем под IOS
Ответить
Гость
 Как получить соответствующий пиксель глубины при обнаружении объекта Vision

Сообщение Гость »

Я создаю приложение для iOS, которое обнаруживает автомобили с помощью Vision, а затем определяет расстояние до указанного автомобиля с помощью синхронизированной карты глубины DataMap от датчика LiDAR.
Однако у меня возникла проблема поиск правильного соответствующего пикселя в этой карте глубины. Хотя CGRect ObjectObservation находится в диапазоне от 0 до 300 (x) и от 0 до 600 (y), ширина x высота DepthDataMap составляет всего 320 x 180, поэтому я не могу получить правильный соответствующий пиксель. Есть идеи, как решить эту проблему?
Это моя функция в моем AVCaptureDataOutputSynchronizerDelegate:

Код: Выделить всё

func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer,
didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
// Retrieve the synchronized depth and sample buffer container objects.
guard let syncedDepthData = synchronizedDataCollection.synchronizedData(for: depthDataOutput) as? AVCaptureSynchronizedDepthData,
let syncedVideoData = synchronizedDataCollection.synchronizedData(for: videoOutput) as? AVCaptureSynchronizedSampleBufferData else { return }

guard let pixelBuffer = syncedVideoData.sampleBuffer.imageBuffer else { return }

let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up, options: [:])

do {
try imageRequestHandler.perform(self.requests)
} catch let error {
print(error)
}

depthData = syncedDepthData.depthData.converting(toDepthDataType: kCVPixelFormatType_DepthFloat16).depthDataMap
}
и это моя функция, в которой я хочу определить середину обнаруженного объекта и получить его пиксель глубины:

Код: Выделить всё

for observation in results where observation is VNRecognizedObjectObservation {
guard let objectObservation = observation as? VNRecognizedObjectObservation else { continue }
let topLabelObservation = objectObservation.labels[0]

if topLabelObservation.identifier != "car" { return }

let objectBounds = VNImageRectForNormalizedRect(objectObservation.boundingBox, Int(screenRect.size.width), Int(screenRect.size.height))

let transformBounds = CGRect(x: objectBounds.minX, y: screenRect.size.height - objectBounds.maxY, width: objectBounds.maxX - objectBounds.minX, height: objectBounds.maxY - objectBounds.minY)

let depthMapWidth = CVPixelBufferGetWidthOfPlane(depthData, 0) //always 180
let depthMapHeight = CVPixelBufferGetHeightOfPlane(depthData, 0) // always 320
let objMiddlePointX = Int(objectBounds.minX + (objectBounds.maxX - objectBounds.minX)/2)
let objMiddlePointY = Int(screenRect.size.height - objectBounds.maxY + (objectBounds.maxY - objectBounds.minY)/2)

let rowData = CVPixelBufferGetBaseAddress(depthData)?.assumingMemoryBound(to: Float16.self)
let depthPoint = rowData?[objMiddlePointX * depthMapWidth + objMiddlePointY]

let boxLayer = self.drawBoundingBox(transformBounds)

detectionLayer.addSublayer(boxLayer)
}
Я рад каждому предложению в правильном направлении.


Источник: https://stackoverflow.com/questions/778 ... -detection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»