我想在我的应用程序中实现自定义相机。因此,我正在使用创建此相机AVCaptureDevice
。
现在,我只想在我的自定义相机中显示“灰度输出”。所以我正在尝试使用setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:
和AVCaptureWhiteBalanceGains
。我正在使用AVCamManual:为此扩展了AVCam以使用手动捕获。
- (void)setWhiteBalanceGains:(AVCaptureWhiteBalanceGains)gains
{
NSError *error = nil;
if ( [videoDevice lockForConfiguration:&error] ) {
AVCaptureWhiteBalanceGains normalizedGains = [self normalizedGains:gains]; // Conversion can yield out-of-bound values, cap to limits
[videoDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:normalizedGains completionHandler:nil];
[videoDevice unlockForConfiguration];
}
else {
NSLog( @"Could not lock device for configuration: %@", error );
}
}
但是为此,我必须在1至4之间传递 RGB增益值 。因此,我正在创建此方法来检查MAX和MIN值。
- (AVCaptureWhiteBalanceGains)normalizedGains:(AVCaptureWhiteBalanceGains) gains
{
AVCaptureWhiteBalanceGains g = gains;
g.redGain = MAX( 1.0, g.redGain );
g.greenGain = MAX( 1.0, g.greenGain );
g.blueGain = MAX( 1.0, g.blueGain );
g.redGain = MIN( videoDevice.maxWhiteBalanceGain, g.redGain );
g.greenGain = MIN( videoDevice.maxWhiteBalanceGain, g.greenGain );
g.blueGain = MIN( videoDevice.maxWhiteBalanceGain, g.blueGain );
return g;
}
我也试图获得不同的效果,例如传递RGB增益静态值。
- (AVCaptureWhiteBalanceGains)normalizedGains:(AVCaptureWhiteBalanceGains) gains
{
AVCaptureWhiteBalanceGains g = gains;
g.redGain = 3;
g.greenGain = 2;
g.blueGain = 1;
return g;
}
现在,我想在我的自定义相机上设置此灰度(公式:像素= 0.30078125f * R + 0.5859375f * G + 0.11328125f * B)。我已经尝试过此公式。
- (AVCaptureWhiteBalanceGains)normalizedGains:(AVCaptureWhiteBalanceGains) gains
{
AVCaptureWhiteBalanceGains g = gains;
g.redGain = g.redGain * 0.30078125;
g.greenGain = g.greenGain * 0.5859375;
g.blueGain = g.blueGain * 0.11328125;
float grayScale = g.redGain + g.greenGain + g.blueGain;
g.redGain = MAX( 1.0, grayScale );
g.greenGain = MAX( 1.0, grayScale );
g.blueGain = MAX( 1.0, grayScale );
g.redGain = MIN( videoDevice.maxWhiteBalanceGain, g.redGain );
g.greenGain = MIN( videoDevice.maxWhiteBalanceGain, g.greenGain);
g.blueGain = MIN( videoDevice.maxWhiteBalanceGain, g.blueGain );
return g;
}
那么, 如何在1到4之间传递该值 呢?
有什么方法或规模可以比较这些东西吗?
任何帮助,将不胜感激。
CoreImage
提供了大量用于使用GPU调整图像的过滤器,并且可以有效地与来自摄像机源或视频文件的视频数据一起使用。
objc.io上有一篇文章介绍了如何执行此操作。例子在Objective-C中,但是解释应该足够清楚以至于可以遵循。
基本步骤是:
EAGLContext
配置为使用OpenGLES2的。GLKView
以显示渲染的输出EAGLContext
。CIContext
,使用相同的EAGLContext
。CIFilter
使用CIColorMonochrome
CoreImage过滤器创建一个。AVCaptureSession
一个AVCaptureVideoDataOutput
。AVCaptureVideoDataOutputDelegate
方法中,将转换CMSampleBuffer
为CIImage
。将应用于CIFilter
图像。将过滤后的图像绘制到CIImageContext
。该流水线确保视频像素缓冲区保留在GPU(从摄像机到显示器)上,并避免将数据移至CPU,以保持实时性能。
要保存过滤后的视频,请实施AVAssetWriter
,然后将样本缓冲区附加到AVCaptureVideoDataOutputDelegate
进行过滤的位置。
这是Swift中的示例。
GitHub上的示例。
import UIKit
import GLKit
import AVFoundation
private let rotationTransform = CGAffineTransformMakeRotation(CGFloat(-M_PI * 0.5))
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
private var context: CIContext!
private var targetRect: CGRect!
private var session: AVCaptureSession!
private var filter: CIFilter!
@IBOutlet var glView: GLKView!
override func prefersStatusBarHidden() -> Bool {
return true
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let whiteColor = CIColor(
red: 1.0,
green: 1.0,
blue: 1.0
)
filter = CIFilter(
name: "CIColorMonochrome",
withInputParameters: [
"inputColor" : whiteColor,
"inputIntensity" : 1.0
]
)
// GL context
let glContext = EAGLContext(
API: .OpenGLES2
)
glView.context = glContext
glView.enableSetNeedsDisplay = false
context = CIContext(
EAGLContext: glContext,
options: [
kCIContextOutputColorSpace: NSNull(),
kCIContextWorkingColorSpace: NSNull(),
]
)
let screenSize = UIScreen.mainScreen().bounds.size
let screenScale = UIScreen.mainScreen().scale
targetRect = CGRect(
x: 0,
y: 0,
width: screenSize.width * screenScale,
height: screenSize.height * screenScale
)
// Setup capture session.
let cameraDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let videoInput = try? AVCaptureDeviceInput(
device: cameraDevice
)
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: dispatch_get_main_queue())
session = AVCaptureSession()
session.beginConfiguration()
session.addInput(videoInput)
session.addOutput(videoOutput)
session.commitConfiguration()
session.startRunning()
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
return
}
let originalImage = CIImage(
CVPixelBuffer: pixelBuffer,
options: [
kCIImageColorSpace: NSNull()
]
)
let rotatedImage = originalImage.imageByApplyingTransform(rotationTransform)
filter.setValue(rotatedImage, forKey: kCIInputImageKey)
guard let filteredImage = filter.outputImage else {
return
}
context.drawImage(filteredImage, inRect: targetRect, fromRect: filteredImage.extent)
glView.display()
}
func captureOutput(captureOutput: AVCaptureOutput!, didDropSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
let seconds = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer))
print("dropped sample buffer: \(seconds)")
}
}
我正在尝试将Firebase Crashlytics集成到iOS我的应用程序中,该应用程序启用了Firebase Crash Reporting。我遵循了这里的文档,但在运行自定义构建阶段时,我的构建总是失败: Xcode中的错误如下: Fabric API键无效。Fabric运行脚本构建阶段应包含API密钥:./Fabric.framework/run INSERT_YOUR_API_KEY I
设置输出选项 输出设置控制如何设置 HTML 文件的格式、如何命名文件和切片,以及在存储优化图像时如何处理背景图像。在 “输出设置 ”对话框中可以设置这些选项。 可以存储输出设置并将它们应用于其它文件。 1要显示 “输出设置 ”对话框,请执行以下任一操作: 存储优化图像时,从 “存储优化结果 ”或 “将优化结果存储为 ”对话框的 “设置 ”弹出菜单中选取 “其它 ”。 从 “存储为 Web 和设备
问题内容: 当传递Python程序的输出的管道时,Python解释器对编码感到困惑,并将其设置为None。这意味着这样的程序: 正常运行时可以正常工作,但失败: 编解码器无法在位置编码字符:序数不在范围内(128) 以管道顺序使用时。 使管道工作的最佳方法是什么?我能告诉它使用外壳程序/文件系统/正在使用的任何编码吗? 到目前为止,我所看到的建议是直接修改你的,或使用此hack硬编码: 有更好的方
打印当前输出目录,默认情况下,该目录为test-output。但是为什么没有SetOutputDirectory呢?我希望将@beforeTest方法中的输出目录设置为在testng.xml文件中设置的文件夹。
Meta:- IOS仿真器设备v10.3 Appium java-client V5.0.0 beta8 硒v3.4.0 实际上,我试图在设备中使用自动化设置。我尝试了以下代码,它在设备上运行良好,而在上抛出异常: 例外情况: WebDriverException:方法尚未实现(警告:服务器未提供任何stacktrace信息) 当我尝试使用JavascriptExecutor作为: Unsuppo
我正在窗户上运行Kafka。我正在尝试设置 SASL/可控性代码身份验证。这是我在设置 SASL/超线程管理时所遵循的链接。在运行 我收到错误 未知动态配置:设置('SCRAM-SHA-256) 有人知道可能是什么问题吗?