Guest User

Untitled

a guest
Nov 20th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. {
  2. Normal: {
  3. R:[100, 0, 0],
  4. G:[0, 100, 0],
  5. B:[0, 100, 0]
  6. },
  7. Protanopia: {
  8. R:[56.667, 43.333, 0],
  9. G:[55.833, 44.167, 0],
  10. B:[0, 24.167, 75.833]
  11. },
  12.  
  13. ...
  14.  
  15. R:[56.667, 43.333, 0],
  16. G:[55.833, 44.167, 0],
  17. B:[0, 24.167, 75.833]
  18.  
  19. //
  20. // ViewController.swift
  21. // Filter
  22. //
  23.  
  24. import UIKit
  25. import AVFoundation
  26.  
  27. class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate, UITabBarDelegate {
  28.  
  29. var captureSession = AVCaptureSession()
  30. var backCamera: AVCaptureDevice?
  31. var frontCamera: AVCaptureDevice?
  32. var currentCamera: AVCaptureDevice?
  33.  
  34. var photoOutput: AVCapturePhotoOutput?
  35. var orientation: AVCaptureVideoOrientation = .portrait
  36.  
  37. let context = CIContext()
  38.  
  39. @IBOutlet weak var filteredImage: UIImageView!
  40.  
  41. @IBOutlet weak var tabBar: UITabBar!
  42. @IBOutlet weak var moreButton: UITabBarItem!
  43.  
  44. @IBAction func toggleFlashlight(_ sender: UISwitch) {
  45.  
  46. switch sender.isOn {
  47.  
  48. case true:
  49. print("turn on flashlight")
  50.  
  51. do {
  52. try currentCamera?.lockForConfiguration()
  53. currentCamera?.torchMode = .on
  54. currentCamera?.unlockForConfiguration()
  55. }
  56. catch {
  57. print("Cannot enable flashlight")
  58. }
  59.  
  60. break
  61.  
  62. default:
  63. print("turn off flashlight")
  64. do {
  65. try currentCamera?.lockForConfiguration()
  66. currentCamera?.torchMode = .off
  67. currentCamera?.unlockForConfiguration()
  68. }
  69. catch {
  70. print("Cannot enable flashlight")
  71. }
  72.  
  73. break
  74. }
  75. }
  76.  
  77. override func viewDidLoad() {
  78. super.viewDidLoad()
  79. tabBar.delegate = self
  80.  
  81. setupDevice()
  82. setupInputOutput()
  83. }
  84.  
  85. override func viewDidLayoutSubviews() {
  86. orientation = AVCaptureVideoOrientation(rawValue: UIApplication.shared.statusBarOrientation.rawValue)!
  87. }
  88.  
  89. override func viewDidAppear(_ animated: Bool) {
  90. super.viewDidAppear(animated)
  91. if AVCaptureDevice.authorizationStatus(for: AVMediaType.video) != .authorized
  92. {
  93. AVCaptureDevice.requestAccess(for: AVMediaType.video, completionHandler:
  94. { (authorized) in
  95. DispatchQueue.main.async
  96. {
  97. if authorized
  98. {
  99. self.setupInputOutput()
  100. }
  101. }
  102. })
  103. }
  104. }
  105.  
  106. func setupDevice() {
  107. let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
  108. let devices = deviceDiscoverySession.devices
  109.  
  110. for device in devices {
  111. if device.position == AVCaptureDevice.Position.back {
  112. backCamera = device
  113. }
  114. else if device.position == AVCaptureDevice.Position.front {
  115. frontCamera = device
  116. }
  117. }
  118.  
  119. currentCamera = backCamera
  120. }
  121.  
  122. func setupInputOutput() {
  123. do {
  124. setupCorrectFramerate(currentCamera: currentCamera!)
  125. let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
  126. captureSession.sessionPreset = AVCaptureSession.Preset.hd1280x720
  127. if captureSession.canAddInput(captureDeviceInput) {
  128. captureSession.addInput(captureDeviceInput)
  129. }
  130. let videoOutput = AVCaptureVideoDataOutput()
  131.  
  132. videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "sample buffer delegate", attributes: []))
  133. if captureSession.canAddOutput(videoOutput) {
  134. captureSession.addOutput(videoOutput)
  135. }
  136. captureSession.startRunning()
  137. } catch {
  138. print(error)
  139. }
  140. }
  141.  
  142. func setupCorrectFramerate(currentCamera: AVCaptureDevice) {
  143. for vFormat in currentCamera.formats {
  144. //see available types
  145. //print("(vFormat) n")
  146.  
  147. var ranges = vFormat.videoSupportedFrameRateRanges as [AVFrameRateRange]
  148. let frameRates = ranges[0]
  149.  
  150. do {
  151. //set to 240fps - available types are: 30, 60, 120 and 240 and custom
  152. // lower framerates cause major stuttering
  153. if frameRates.maxFrameRate == 240 {
  154. try currentCamera.lockForConfiguration()
  155. currentCamera.activeFormat = vFormat as AVCaptureDevice.Format
  156. //for custom framerate set min max activeVideoFrameDuration to whatever you like, e.g. 1 and 180
  157. currentCamera.activeVideoMinFrameDuration = frameRates.minFrameDuration
  158. currentCamera.activeVideoMaxFrameDuration = frameRates.maxFrameDuration
  159. }
  160. }
  161. catch {
  162. print("Could not set active format")
  163. print(error)
  164. }
  165. }
  166. }
  167.  
  168. func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
  169. connection.videoOrientation = orientation
  170. let videoOutput = AVCaptureVideoDataOutput()
  171. videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main)
  172.  
  173. //let comicEffect = CIFilter(name: "CIComicEffect")
  174.  
  175. let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
  176. let cameraImage = CIImage(cvImageBuffer: pixelBuffer!)
  177.  
  178. let filter = CustomFilter()
  179. filter.setValue(cameraImage, forKey: kCIInputImageKey)
  180.  
  181. //comicEffect!.setValue(cameraImage, forKey: kCIInputImageKey)
  182.  
  183. let cgImage = self.context.createCGImage(filter.outputImage!, from: cameraImage.extent)!
  184.  
  185. DispatchQueue.main.async {
  186. let filteredImage = UIImage(cgImage: cgImage)
  187. self.filteredImage.image = filteredImage
  188. }
  189. }
  190.  
  191. lazy var optionLauncher: OptionLauncher = {
  192. let launcher = OptionLauncher()
  193. launcher.homeController = self
  194. return launcher
  195. }()
  196.  
  197.  
  198.  
  199. func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
  200.  
  201. switch item.tag {
  202.  
  203. case 0:
  204. print("do something")
  205.  
  206. break
  207.  
  208. case 1:
  209. print("show options")
  210. // show options
  211. optionLauncher.showOptions()
  212. break
  213.  
  214. default:
  215. break
  216. }
  217. }
  218.  
  219. func showControllerForOption(option: Option) {
  220. let dummyOptionViewController = UIViewController()
  221. dummyOptionViewController.view.backgroundColor = UIColor.white
  222. dummyOptionViewController.navigationItem.title = option.name.rawValue
  223. navigationController?.navigationBar.tintColor = UIColor.white
  224. navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
  225. navigationController?.pushViewController(dummyOptionViewController, animated: true)
  226. }
  227.  
  228. }
  229.  
  230. //
  231. // CustomFilter.swift
  232. // Filter
  233. //
  234.  
  235. import CoreImage
  236.  
  237. class CustomFilter: CIFilter {
  238. @objc dynamic var inputImage : CIImage?
  239.  
  240. override public var outputImage: CIImage! {
  241. get {
  242. if let inputImage = self.inputImage {
  243. let args = [inputImage as AnyObject]
  244. return createCustomKernel().apply(extent: inputImage.extent, arguments: args)
  245. } else {
  246. return nil
  247. }
  248. }
  249. }
  250.  
  251. func createCustomKernel() -> CIColorKernel {
  252. let kernelString =
  253. "kernel vec4 chromaKey( __sample s) { n" +
  254. " vec4 newPixel = s.rgba;" +
  255. " newPixel[0] = 1.0;" +
  256. " newPixel[2] = newPixel[2] / 2.0;" +
  257. " return newPixel;n" +
  258. "}"
  259.  
  260. return CIColorKernel(source: kernelString)!
  261. }
  262. }
Add Comment
Please, Sign In to add comment