标签: gpuimage

GPUImageMovieWriter - 崩溃时"状态为2时无法调用方法"

试图开始使用真正伟大的GPUImage框架,由Brad Larson亲切地分享,但有一个问题.

运行SimpleVideoFileFilter示例时,它总是在完成时崩溃并出现以下错误:

[AVAssetWriterInput markAsFinished]状态为2时无法调用方法

有谁知道如何纠正这个?

在模拟器中运行时也看不到视频,它对模拟器不起作用吗?

运行iOS 6.1和Xcode 4.6

谢谢!

我注意到finishRecordingWithCompletionHandler被调用了两次,它在第二次调用时崩溃了

ios avassetwriter gpuimage

5
推荐指数
0
解决办法
2187
查看次数

GPUImage:如何确定处理图像中给定矩形的平均像素值

我正在使用GPUImage来处理传入的视频,然后我想考虑图像的给定方形子区域并确定该区域中像素的平均像素值.任何人都可以告诉我如何做到这一点?甚至关于如何在图像中的坐标(x,y)处获取像素的像素数据的信息也是有用的.

抱歉,如果这是一个简单的问题,但我是计算机视觉的新手,并且从可用的文档中我不清楚这样做的方法.谢谢.

pixel image-processing pixels gpuimage

5
推荐指数
1
解决办法
1677
查看次数

GPUImage:使用或不使用smoothScaleOutput

我正在使用GPUImage我的应用程序中的过滤器(使用它将一个值过滤器应用于静态照片).我正在尝试决定是否需要使用smoothlyScaleOutput.它的缺点是加载大型照片需要很长时间.我读过Brad Larson说:

照片的smoothScaleOutput:选项告诉框架在对照片进行下采样时使用三线性过滤.也就是说,对于缩小的大型照片,它会产生更平滑的输出.如果您不需要缩小照片,可以将其关闭以获得更好的性能和更清晰的照片.

只是很好奇,但对于那些GPUImage以与我相同的方式使用的人来说,启用此选项对我来说是否值得?我很难区分它,但我只使用一些基本滤镜(亮度,对比度,棕褐色等)对少量照片进行采样.

关于什么可能构成缩小照片也很困惑.这是否意味着使用UIImage drawInRect以较小的分辨率绘制照片?或者这是否意味着拍摄大照片并将其大小转换为适合UIImageView?或两者?

任何帮助将不胜感激.

iphone ios gpuimage

5
推荐指数
0
解决办法
486
查看次数

用于OCR的iOS UIImage二值化 - 处理具有不同亮度的图像

我有一个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)

ocr image-processing ios gpuimage

5
推荐指数
1
解决办法
4710
查看次数

实时混合UIImages

是否可以像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 uiimage ios gpuimage ios7

5
推荐指数
1
解决办法
1234
查看次数

什么是Swift相当于声明`typedef SomeClass <SomeProtocol> MyType`?

我目前正在一个主要是Objective-C的项目中编写一些Swift代码.在我们的ObjC代码中,我们有一个声明的标头typedef GPUImageOutput<GPUImageInput> MyFilter;.然后我们可以声明一个只能是GPUImageOutput实现的子类的@property GPUImageInput.

(注:GPUImageOutputGPUImageInput是不是我定义的;它们是部分GPUImage库)

我们的Swift代码似乎没有认识到这一点,即使标题在我们的桥接标题中是#imported.我试图在Swift中复制声明,但这些都不是正确的语法:
typealias MyFilter = GPUImageOutput, GPUImageInput
typealias MyFilter = GPUImageOutput : GPUImageInput

objective-c ios gpuimage swift

5
推荐指数
1
解决办法
2315
查看次数

使用gpuimage hough行进行名片边缘检测的预处理步骤

我正在尝试使用GPUImage的HoughTransform检测名片的边缘,因为它似乎是使用此框架从我发现的类似问题/问题中实现此任务的最佳方式.

我能得到的最好结果就是将lineDetectionThreshold设置为0.25,这样就可以给出4行界定名片,同时最小化行总数.

我无法确定edgeThreshold参数是否有帮助.

通过我得到的线条,我将过滤掉彼此非常相似的线条(通常在每条边缘上找到很多!),将它们分成水平和垂直,然后找到2条水平线和2条垂直线,可以形成一个矩形.

由于文本或名片本身的形状,我仍然找到很多行,数字越大,视频流的性能越差.

我试图添加一些预处理,但不是很成功,可能是因为我不知道哪种技术可以帮助我.

如何才能改善仅确定边缘的4条线的检测?实际上,有可能吗?

编辑:

这里有一些图片来说明.我删除了名片中的徽标和详细信息以保护隐私.

使用0.25阈值获得的原始线(此阈值有时会在处理视频时丢失一些边缘) test5.1.jpg

使用相同图像手动过滤后的行: test5.1.filtered.jpg

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

原线: test7.1.jpg

过滤线: test7.1.filtered.jpg

image-processing edge-detection hough-transform ios gpuimage

5
推荐指数
0
解决办法
927
查看次数

将GPUImage与AVVideoCompositing一起使用

我正在尝试使用两种视频的组合GPUImageAVVideoCompositing实现两个视频之间的实时色度键过滤器.这样做天真地利用CIImage imageFromCVPixelBuffer进入CGImageGPUImage出来CGImage,以CIImageCVPixelBuffer,是非常低效的,并导致记忆问题.

我注意到框架中有纹理对象,渲染目标和帧缓冲区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)

video opengl-es ios gpuimage

5
推荐指数
1
解决办法
1527
查看次数

如何确定视频是延时摄影还是慢动作摄影还是普通

创建图像处理演示,我需要根据从图库中选择的视频内容方向来设置设备方向。所以我用了几行代码来获取方向,请参考下面的代码。

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

video-processing ios gpuimage avasset swift4

5
推荐指数
1
解决办法
484
查看次数

如何在 iOS 应用程序中从 Adob​​e Lightroom 重现高光和阴影效果

我正在尝试在我的 iOS 应用程序中重现 Adob​​e Lightroom 效果。目前我正在使用GPUImage所有效果,但发现很难重现高光和阴影效果。我也已经尝试使用CIHighlightShadowAdjustCIFilter 但它给了我错误的结果。

所以我正在寻找至少 Lightroom 用于此效果的算法。它们都与亮度更改非常相似,但似乎它们仅用于更改图片的亮/暗部分,具体取决于是否使用高光或阴影。

谁能指出我需要寻找的正确方向才能产生相同的效果?如何仅更改图片的暗/亮部分的亮度?

示例如下 1. 左为原始图像,右为经过 +100 高光调整的图像(可能范围 -100;100,默认为 0)。

亮点+100

你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有改变。

  1. 左边是原始图像,右边是+100阴影调整的图像(可能的范围-100;100,默认为0)。

阴影 + 100

在这里你可以看到雕像(图片较暗的部分)的亮度变化很大,但天空几乎没有变化。

image-processing ios gpuimage

5
推荐指数
1
解决办法
1430
查看次数