Guest User

Untitled

a guest
Jun 18th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
  2. guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
  3. return
  4. }
  5.  
  6. var requestOptions: [VNImageOption: Any] = [:]
  7.  
  8. if let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) {
  9. requestOptions = [.cameraIntrinsics: camData]
  10. }
  11.  
  12. let imageOrientation = self.videoLayer.connection!.videoOrientation.imageOrientation()
  13.  
  14. let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: imageOrientation, options: requestOptions)
  15.  
  16. DispatchQueue.global(qos: .userInitiated).async {
  17. do {
  18. try imageRequestHandler.perform([self.rectanglesRequest])
  19. } catch {
  20. print(error)
  21. }
  22. }
  23. }
  24.  
  25. func detectRectanglesHandler(request: VNRequest, error: Error?) {
  26. guard let observations = request.results else {
  27. print("no result")
  28. return
  29. }
  30.  
  31. let result = observations.map({ $0 as? VNRectangleObservation })
  32.  
  33. for region in result {
  34. guard let rg = region else {
  35. continue
  36. }
  37.  
  38. let obs: VNRectangleObservation = rg
  39.  
  40. let rectanglesTransform = CGAffineTransform.identity.scaledBy(x: frameSize.width, y: frameSize.height)
  41.  
  42. let topLeft = obs.topLeft.applying(rectanglesTransform)
  43. let topRight = obs.topRight.applying(rectanglesTransform)
  44. let bottomLeft = obs.bottomLeft.applying(rectanglesTransform)
  45. let bottomRight = obs.bottomRight.applying(rectanglesTransform)
  46.  
  47. if drawingSemaphore.wait(timeout: .now()) == .success {
  48.  
  49. let uiTransform = CGAffineTransform.identity.scaledBy(x: 1, y: -1).translatedBy(x: 0.0, y: -frameSize.height)
  50.  
  51. let boundingBox = obs.boundingBox.applying(rectanglesTransform)
  52.  
  53. DispatchQueue.main.async {
  54. guard self.cameraView.frame.contains(boundingBox) else {
  55. print("invalid detected rectangle");
  56. self.drawingSemaphore.signal()
  57. return
  58. }
  59.  
  60. let path = UIBezierPath()
  61. path.move(to: topLeft.applying(uiTransform))
  62. path.addLine(to: topRight.applying(uiTransform))
  63. path.addLine(to: bottomRight.applying(uiTransform))
  64. path.addLine(to: bottomLeft.applying(uiTransform))
  65. path.close()
  66.  
  67. self.regionOfInterest?.removeFromSuperlayer()
  68. let regionOfInterest = CAShapeLayer()
  69. regionOfInterest.path = path.cgPath
  70. regionOfInterest.fillColor = UIColor.clear.cgColor
  71. regionOfInterest.strokeColor = UIColor.white.cgColor
  72. regionOfInterest.zPosition = -2
  73. self.cameraView.layer.addSublayer(regionOfInterest)
  74. self.regionOfInterest = regionOfInterest
  75.  
  76. self.drawingSemaphore.signal()
  77. }
  78. }
  79. }
  80. }
Add Comment
Please, Sign In to add comment