Я снимаю видео с камеры моего устройства и передаю его в каркас Vision для обнаружения прямоугольника.Код выглядит примерно так (сжато для краткости ... скрытые строки, не относящиеся к этому вопросу):
func captureOutput(_ output: AVCaptureOutput,
didOutput sampleBuffer:
CMSampleBuffer, from connection: AVCaptureConnection) {
// Get a CIImage from the buffer
guard let buffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
let image = CIImage(cvImageBuffer: buffer)
// Set up corner detector
let handler = VNImageRequestHandler(ciImage: image, orientation: .up options: [:])
let request = VNDetectRectanglesRequest()
// Perform corner detection
do {
try handler.perform([request])
guard let observation = request.results?.first as? VNRectangleObservation else {
print("error at \(#line)")
return
}
handleCorners(observation)
} catch {
print("Error: \(error)")
return
}
}
Это отлично работает на iPad Air 2, и я могу использовать углы в observation
объект, чтобы нарисовать хорошее наложение.Но на iPhone X углы по оси X «сжаты».
Например, если я сделаю снимок с визитной карточкой, занимающей почти всю ширину экрана, я бы ожидал, что observation.topLeft
будет иметь значение x
, близкое к нулю.Вместо этого это почти 0,15.Это верно и для правых углов (ожидаемое: ~ 1,0, фактическое: ~ 0,85).
Есть идеи, почему это так?Свойство CIImage extent
одинаково на обоих устройствах.Просто углы Vision сжаты по оси X.