2017-11-22 1 views
0

카메라 미리보기를 표시하고 UIImage에서 단일 픽셀의 색상을 검색 한 다음이 값을 '필터링 된'색상으로 변환합니다. 여기비디오 미리보기에서 모든 픽셀의 색상 변환 - 신속한

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { 
    connection.videoOrientation = orientation 
    let videoOutput = AVCaptureVideoDataOutput() 
    videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue.main) 

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    let cameraImage = CIImage(cvImageBuffer: pixelBuffer!) 

    let typeOfColourBlindness = ColourBlindType(rawValue: "deuteranomaly") 

    /* Gets colour from a single pixel - currently 0,0 and converts it into the 'colour blind' version */ 

    let captureImage = convert(cmage: cameraImage) 

    let colour = captureImage.getPixelColour(pos: CGPoint(x: 0, y: 0)) 

    var redval: CGFloat = 0 
    var greenval: CGFloat = 0 
    var blueval: CGFloat = 0 
    var alphaval: CGFloat = 0 

    _ = colour.getRed(&redval, green: &greenval, blue: &blueval, alpha: &alphaval) 
    print("Colours are r: \(redval) g: \(greenval) b: \(blueval) a: \(alphaval)") 

    let filteredColour = CBColourBlindTypes.getModifiedColour(.deuteranomaly, red: Float(redval), green: Float(greenval), blue: Float(blueval)) 
    print(filteredColour) 

    /* #################################################################################### */ 

    DispatchQueue.main.async { 
     // placeholder for now 
     self.filteredImage.image = self.applyFilter(cameraImage: cameraImage, colourBlindness: typeOfColourBlindness!) 
    } 
} 

x: 0, y: 0 픽셀 값이 변환되는 곳이다 :

placeholder for now 코멘트는 다음과 같은 기능을 의미
import Foundation 

enum ColourBlindType: String { 
    case deuteranomaly = "deuteranomaly" 
    case protanopia = "protanopia" 
    case deuteranopia = "deuteranopia" 
    case protanomaly = "protanomaly" 
} 

class CBColourBlindTypes: NSObject { 
    class func getModifiedColour(_ type: ColourBlindType, red: Float, green: Float, blue: Float) -> Array<Float> { 
     switch type { 
     case .deuteranomaly: 
      return [(red*0.80)+(green*0.20)+(blue*0), 
        (red*0.25833)+(green*0.74167)+(blue*0), 
        (red*0)+(green*0.14167)+(blue*0.85833)] 
     case .protanopia: 
      return [(red*0.56667)+(green*0.43333)+(blue*0), 
        (red*0.55833)+(green*0.44167)+(blue*0), 
        (red*0)+(green*0.24167)+(blue*0.75833)] 
     case .deuteranopia: 
      return [(red*0.625)+(green*0.375)+(blue*0), 
        (red*0.7)+(green*0.3)+(blue*0), 
        (red*0)+(green*0.3)+(blue*0.7)] 
     case .protanomaly: 
      return [(red*0.81667)+(green*0.18333)+(blue*0.0), 
        (red*0.33333)+(green*0.66667)+(blue*0.0), 
        (red*0.0)+(green*0.125)+(blue*0.875)] 
     } 

    } 

} 

:

func applyFilter(cameraImage: CIImage, colourBlindness: ColourBlindType) -> UIImage { 

    //do stuff with pixels to render new image 


    /*  Placeholder code for shifting the hue  */ 

    // Create a place to render the filtered image 
    let context = CIContext(options: nil) 

    // Create filter angle 
    let filterAngle = 207 * Double.pi/180 

    // Create a random color to pass to a filter 
    let randomColor = [kCIInputAngleKey: filterAngle] 

    // Apply a filter to the image 
    let filteredImage = cameraImage.applyingFilter("CIHueAdjust", parameters: randomColor) 

    // Render the filtered image 
    let renderedImage = context.createCGImage(filteredImage, from: filteredImage.extent) 

    // Return a UIImage 
    return UIImage(cgImage: renderedImage!) 
} 

그리고 여기가 픽셀 컬러를 검색 내 확장 :

extension UIImage { 
    func getPixelColour(pos: CGPoint) -> UIColor { 

     let pixelData = self.cgImage!.dataProvider!.data 
     let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

     let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
     let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
     let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
     let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

     return UIColor(red: r, green: g, blue: b, alpha: a) 
    } 

} 

예를 들어 다음 색상 범위에 대한 필터를 만들려면 어떻게해야합니까? enter image description here

내가 스위프트를 사용하여, 실시간 카메라 입력에 걸릴 Deuteranopia 범위의 수와 화면에이를 표시 할 색상을 교체 할 수 있습니다.

이미지 디스플레이에 UIImageView를 사용하고 있습니다.

답변

0

비디오 캡처 및 필터링 된 이미지의 실시간 디스플레이의 필터링을 수행하는 방법에 대한 자세한 내용은, 당신은 애플에서 AVCamPhotoFilter 샘플 코드를 공부하고자하고, 수 등을 사용하여 this objc.io tutorial 한마디로

같은 다른 소스 실시간 렌더링을위한 UIImage는 좋은 생각이 아닙니다. 너무 느립니다. 금속 (예 : MTKView)의 OpenGL (예 : GLKView)을 사용합니다. AVCamPhotoFilter 코드는 MTKView를 사용하여 중간 버퍼로 렌더링하지만 적절한 CIContext 메서드를 사용하여 직접 CIImage를 렌더링 할 수도 있습니다. 금속 용 https://developer.apple.com/documentation/coreimage/cicontext/1437835-render

또한 컬러 필터와 관련하여 - here과 같이 CIColorCube 코어 이미지 필터를 볼 수 있습니다.

관련 문제