试图开始使用真正伟大的GPUImage框架,由Brad Larson亲切地分享,但有一个问题.
运行SimpleVideoFileFilter示例时,它总是在完成时崩溃并出现以下错误:
[AVAssetWriterInput markAsFinished]状态为2时无法调用方法
有谁知道如何纠正这个?
在模拟器中运行时也看不到视频,它对模拟器不起作用吗?
运行iOS 6.1和Xcode 4.6
谢谢!
我注意到finishRecordingWithCompletionHandler被调用了两次,它在第二次调用时崩溃了
我正在使用GPUImage来处理传入的视频,然后我想考虑图像的给定方形子区域并确定该区域中像素的平均像素值.任何人都可以告诉我如何做到这一点?甚至关于如何在图像中的坐标(x,y)处获取像素的像素数据的信息也是有用的.
抱歉,如果这是一个简单的问题,但我是计算机视觉的新手,并且从可用的文档中我不清楚这样做的方法.谢谢.
我正在使用GPUImage我的应用程序中的过滤器(使用它将一个值过滤器应用于静态照片).我正在尝试决定是否需要使用smoothlyScaleOutput.它的缺点是加载大型照片需要很长时间.我读过Brad Larson说:
照片的smoothScaleOutput:选项告诉框架在对照片进行下采样时使用三线性过滤.也就是说,对于缩小的大型照片,它会产生更平滑的输出.如果您不需要缩小照片,可以将其关闭以获得更好的性能和更清晰的照片.
只是很好奇,但对于那些GPUImage以与我相同的方式使用的人来说,启用此选项对我来说是否值得?我很难区分它,但我只使用一些基本滤镜(亮度,对比度,棕褐色等)对少量照片进行采样.
关于什么可能构成缩小照片也很困惑.这是否意味着使用UIImage drawInRect以较小的分辨率绘制照片?或者这是否意味着拍摄大照片并将其大小转换为适合UIImageView?或两者?
任何帮助将不胜感激.
我有一个C++二值化例程,我用于以后的OCR操作.但是我发现它产生了不必要的文本倾斜.寻找替代方案我发现GPUImage具有很高的价值,它解决了倾斜的问题.
我正在使用这样的GPUImage代码在应用OCR之前对输入图像进行二值化.
但是,阈值不包括我得到的图像范围.查看输入图像中的两个样本:


我不能用相同的阈值处理两者.低价值似乎随后很好,第一个价值更高.
第二个图像似乎特别复杂,因为无论我为阈值设置了什么值,我都不会将所有字符都正确地二进制化.另一方面,我的C++二值化例程似乎做得对,但我没有太多的见解可以像GPUImage中的简单阈值那样进行实验.
我该怎么处理?
更新:
我尝试使用GPUImageAverageLuminanceThresholdFilter默认乘数= 1.它适用于第一张图像,但第二张图像仍然是问题.
二值化的一些更多样化的输入:


更新II:
经过布拉德的这个回答后,尝试过GPUImageAdaptiveThresholdFilter(也包含了GPUImagePicture,因为之前我只在UIImage上应用它).
有了这个,我得到了二次图像二值化完美.然而,当我设置模糊大小为3.0时,第一个似乎在二值化后有很多噪音.OCR导致添加额外字符.使用较低的模糊大小值,第二个图像会失去精度.
这里是:
+(UIImage *)binarize : (UIImage *) sourceImage
{
UIImage * grayScaledImg = [self toGrayscale:sourceImage];
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:grayScaledImg];
GPUImageAdaptiveThresholdFilter *stillImageFilter = [[GPUImageAdaptiveThresholdFilter alloc] init];
stillImageFilter.blurSize = 3.0;
[imageSource addTarget:stillImageFilter];
[imageSource processImage];
UIImage *imageWithAppliedThreshold = [stillImageFilter imageFromCurrentlyProcessedOutput];
// UIImage *destImage = [thresholdFilter imageByFilteringImage:grayScaledImg];
return imageWithAppliedThreshold;
}
Run Code Online (Sandbox Code Playgroud) 是否可以像iOS 7中的通知中心中的箭头一样进行实时混合?我想知道UIImage是否可以在柔和的光线下使用内容(UIView或CALayer),因此背景图像可以移动,混合图像可以保留在一个位置.
我想让它成为你可以拥有UIImage的地方,你可以将blendMode属性设置为你需要的任何混合模式,例如, imageView.blendMode = kCGBlendModeSoftLight;
我尝试使用GPUImage,但我无法弄清楚如何做我需要的东西.任何帮助,将不胜感激.
到目前为止,我用来设置UIImage的混合模式的代码是这样的; 但是,如果移动背景视图,则不会更新UIImage上的混合.
//blur the background
GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
blurFilter.blurRadiusInPixels = 50.0f;
blurFilter.blurPasses = 4;
UIImage *blurredBackground = [blurFilter imageByFilteringImage:[UIImage imageNamed:@"Background.png"]];
//make the blended images
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 2.0f);
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationHigh);
[blurredBackground drawInRect:self.view.bounds blendMode:kCGBlendModeNormal alpha:1.0];
[[UIImage imageNamed:@"BarLineImage.png"] drawInRect:CGRectMake(0, self.view.bounds.size.height - 31, self.view.bounds.size.width, 1) blendMode:kCGBlendModeSoftLight alpha:1.0];
[[UIImage imageNamed:@"Equalizer-th.png"] drawInRect:CGRectMake(65, self.view.bounds.size.height - 30, 30, 30) blendMode:kCGBlendModeSoftLight alpha:1.0];
[[UIImage imageNamed:@"Player-th.png"] drawInRect:CGRectMake(145, self.view.bounds.size.height - 30, 30, 30) blendMode:kCGBlendModeSoftLight alpha:1.0];
[[UIImage imageNamed:@"Container-th.png"] drawInRect:CGRectMake(225, self.view.bounds.size.height - …Run Code Online (Sandbox Code Playgroud) 我目前正在一个主要是Objective-C的项目中编写一些Swift代码.在我们的ObjC代码中,我们有一个声明的标头typedef GPUImageOutput<GPUImageInput> MyFilter;.然后我们可以声明一个只能是GPUImageOutput实现的子类的@property GPUImageInput.
(注:GPUImageOutput和GPUImageInput是不是我定义的;它们是部分GPUImage库)
我们的Swift代码似乎没有认识到这一点,即使标题在我们的桥接标题中是#imported.我试图在Swift中复制声明,但这些都不是正确的语法:
typealias MyFilter = GPUImageOutput, GPUImageInput
typealias MyFilter = GPUImageOutput : GPUImageInput
我正在尝试使用GPUImage的HoughTransform来检测名片的边缘,因为它似乎是使用此框架从我发现的类似问题/问题中实现此任务的最佳方式.
我能得到的最好结果就是将lineDetectionThreshold设置为0.25,这样就可以给出4行界定名片,同时最小化行总数.
我无法确定edgeThreshold参数是否有帮助.
通过我得到的线条,我将过滤掉彼此非常相似的线条(通常在每条边缘上找到很多!),将它们分成水平和垂直,然后找到2条水平线和2条垂直线,可以形成一个矩形.
由于文本或名片本身的形状,我仍然找到很多行,数字越大,视频流的性能越差.
我试图添加一些预处理,但不是很成功,可能是因为我不知道哪种技术可以帮助我.
如何才能改善仅确定边缘的4条线的检测?实际上,有可能吗?
编辑:
这里有一些图片来说明.我删除了名片中的徽标和详细信息以保护隐私.
使用0.25阈值获得的原始线(此阈值有时会在处理视频时丢失一些边缘)

使用相同图像手动过滤后的行:

另一个例子,虽然这可能更难,甚至添加预处理步骤:
原线:

过滤线:

image-processing edge-detection hough-transform ios gpuimage
我正在尝试使用两种视频的组合GPUImage和AVVideoCompositing实现两个视频之间的实时色度键过滤器.这样做天真地利用CIImage imageFromCVPixelBuffer进入CGImage到GPUImage出来CGImage,以CIImage对CVPixelBuffer,是非常低效的,并导致记忆问题.
我注意到框架中有纹理对象,渲染目标和帧缓冲区GPUImage.我希望能够利用CVOpenGLESTextureCacheCreateTextureFromImageiOS来保持GPU上的所有内容.
我不认为我完全理解框架的内部工作原理,因为我假设我可以在一个GPUImageTextureInput对象上设置一个过滤器链然后得到过滤器renderTarget,这是一个CVPixelBufferRef.在renderTarget下面的永远是零,并呼吁imageFromCurrentFrameBuffer将产生我一个灰色的框,这是不是我的形象.
请注意,下面的示例不是色度键,而是单个视频上的简单亮度滤镜,以尝试和证明该概念.
@implementation MyCustomCompositor : NSObject <AVVideoCompositing>
- (instancetype)init
{
self = [super init];
if (self) {
CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [GPUImageContext sharedImageProcessingContext].context, NULL, &_textureCache);
}
return self;
}
- (NSDictionary<NSString *,id> *)requiredPixelBufferAttributesForRenderContext
{
return @{(NSString *)kCVPixelBufferPixelFormatTypeKey : @[@(kCVPixelFormatType_32BGRA)],
(NSString *)kCVPixelBufferOpenGLCompatibilityKey : @YES};
}
- (NSDictionary<NSString *,id> *)sourcePixelBufferAttributes
{ …Run Code Online (Sandbox Code Playgroud) 创建图像处理演示,我需要根据从图库中选择的视频内容方向来设置设备方向。所以我用了几行代码来获取方向,请参考下面的代码。
var video_orientation: UIInterfaceOrientation {
guard let transform = tracks(withMediaType: AVMediaType.video).first?.preferredTransform else {
return .portrait
}
switch (transform.tx, transform.ty) {
case (0, 0):
return .landscapeLeft
case (videoFirstFrameSize.width, videoFirstFrameSize.height):
return .landscapeRight
case (0, videoFirstFrameSize.width):
return .portraitUpsideDown
default:
return .portrait
}
}
Run Code Online (Sandbox Code Playgroud)
现在,问题是当我从图库中选择视频(慢动作,正常)时,它的工作正常。但是,当我从画廊方向选择“延时摄影”视频时,我做了太多与此相关的研发工作,最后我得到了一些解决方案,解决方案是,如果我们选择“延时摄影”,我们需要传入AVMediaType.timecode视频类型,但是现在的问题是,如何在选定的资产上设置它。任何帮助都是非常可观的。
注意:- var video_orientation是扩展属性AVAssets
我正在尝试在我的 iOS 应用程序中重现 Adobe Lightroom 效果。目前我正在使用GPUImage所有效果,但发现很难重现高光和阴影效果。我也已经尝试使用CIHighlightShadowAdjustCIFilter 但它给了我错误的结果。
所以我正在寻找至少 Lightroom 用于此效果的算法。它们都与亮度更改非常相似,但似乎它们仅用于更改图片的亮/暗部分,具体取决于是否使用高光或阴影。
谁能指出我需要寻找的正确方向才能产生相同的效果?如何仅更改图片的暗/亮部分的亮度?
示例如下 1. 左为原始图像,右为经过 +100 高光调整的图像(可能范围 -100;100,默认为 0)。
你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有改变。
在这里你可以看到雕像(图片较暗的部分)的亮度变化很大,但天空几乎没有变化。