Мы обнаружили угол горизонта изображения между -10 градусами и 10 градусами в соответствии с 0 опорным углом для потокового видео со следующим кодом.
Кроме того, когда обнаруженный угол изображения был равен нулю или когда он находится за пределами этого диапазона, результат не возвращается. Таким образом, невозможно определить, был ли он нулевым или находится вне этого диапазона.
И этот диапазон кажется очень узким. Что-то не так с нашим кодом или это оно?
Есть другая проблема. Найденный здесь угол исходит из анализа изображения или он также связан с углом физического устройства?
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection){
pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
DispatchQueue.main.async() {
self.lookForHorizon(imageBuffer: pixelBuffer)
}
// Other things
}
var requestForHorizon = [VNImageBasedRequest]()
lazy var horizonRequest: VNDetectHorizonRequest = {return VNDetectHorizonRequest(completionHandler: self.detectHorizonHandler) }()
func lookForHorizon(imageBuffer: CVImageBuffer){
frameUIImage = takeAFrameImage(imageBuffer: imageBuffer)
let cgUIImage = frameUIImage.cgImage!
DispatchQueue.main.async() {
var requestOption:[VNImageOption : Any] = [:]
if let camData = CMGetAttachment(cgUIImage,
key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix,
attachmentModeOut: nil) {
requestOption = [.cameraIntrinsics:camData]
}
let imageRequestHandler = VNImageRequestHandler(
cgImage: cgUIImage,
orientation: CGImagePropertyOrientation(rawValue: 6)!,
options: requestOption)
do {
try imageRequestHandler.perform(self.requestForHorizon)
} catch {
print("error with imageRequestHandler.perform \(error)")
}
}
}
func detectHorizonHandler(request: VNRequest, error: Error?) {
guard let observations = request.results else {
print("no result")
return
}
let result = observations.map({$0 as? VNHorizonObservation})
if result.count > 0 {
let horizonAngle = CGFloat(result[0]?.angle ?? 0)
print("angle = \(horizonAngle)")
} else {
print("no angle info")
}
}