gpt4 book ai didi

ios - 转换视频预览中每个像素的颜色 - Swift

转载 作者:行者123 更新时间:2023-11-30 11:59:26 27 4
gpt4 key购买 nike

我有以下代码,它显示相机预览,从 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像素值转换:

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)]
}

}

}

placeholder for now评论引用了以下函数:

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范围并使用 Swift 将其实时显示在屏幕上。

我使用 UIImageView 来显示图像。

最佳答案

要了解如何对视频捕获进行过滤并实时显示过滤后的图像,您可能需要研究 AVCamPhotoFilter来自 Apple 的示例代码以及其他来源,例如 this objc.io tutorial

简而言之,使用 UIImage 进行实时渲染并不是一个好主意 - 它太慢了。使用Metal(例如MTKView)的OpenGL(例如GLKView)。 AVCamPhotoFilter 代码使用 MTKView 并渲染到中间缓冲区,但您也可以使用适当的 CIContext 方法直接渲染 CIImage,例如用于 Metal https://developer.apple.com/documentation/coreimage/cicontext/1437835-render

此外,关于您的色彩滤镜 - 您可能需要查看 CIColorCube 核心图像滤镜,如图 here 所示。 。

关于ios - 转换视频预览中每个像素的颜色 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47440211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com