我正在使用GPUImage框架(一些旧版本)来混合两个图像(将边框叠加添加到某个图像).在我更新到最新的框架版本后,应用这样的混合后,我得到一个空的黑色图像.
我正在使用下一个方法:
- (void)addBorder {
if (currentBorder != kBorderInitialValue) {
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
GPUImagePicture *imageToProcess = [[GPUImagePicture alloc] initWithImage:self.imageToWorkWithView.image];
GPUImagePicture *border = [[GPUImagePicture alloc] initWithImage:self.imageBorder];
blendFilter.mix = 1.0f;
[imageToProcess addTarget:blendFilter];
[border addTarget:blendFilter];
[imageToProcess processImage];
self.imageToWorkWithView.image = [blendFilter imageFromCurrentlyProcessedOutput];
[blendFilter release];
[imageToProcess release];
[border release];
}
}
Run Code Online (Sandbox Code Playgroud)
问题是什么?
我想实现一个名片检测功能,如这个应用程序(https://scanbot.io).相机应该检测到一张名片并自动拍照(只有名片).

我的想法是使用BradLarson's GPUImage库,检测角落(使用Harris角点检测算法),计算获得角落的最大矩形并裁剪矩形内的图像.
这是我的代码:
- (void)setupFilter {
videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
filter = [[GPUImageHarrisCornerDetectionFilter alloc] init];
[(GPUImageHarrisCornerDetectionFilter *)filter setThreshold:0.01f];
[(GPUImageHarrisCornerDetectionFilter *)filter setSensitivity:0.5f];
[(GPUImageHarrisCornerDetectionFilter *)filter setBlurRadiusInPixels:2.0f];
[videoCamera addTarget:filter];
videoCamera.runBenchmark = YES;
GPUImageView *filterview = [[GPUImageView alloc] init];
self.view=filterview;
GPUImageCrosshairGenerator *crosshairGenerator = [[GPUImageCrosshairGenerator alloc] init];
crosshairGenerator.crosshairWidth = 22.0;
[crosshairGenerator forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
[(GPUImageHarrisCornerDetectionFilter *)filter setCornersDetectedBlock:^(GLfloat* cornerArray, NSUInteger cornersDetected, CMTime frameTime) {
[crosshairGenerator renderCrosshairsFromArray:cornerArray count:cornersDetected frameTime:frameTime];
}];
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
[blendFilter forceProcessingAtSize:CGSizeMake(480.0, 640.0)];
GPUImageGammaFilter *gammaFilter …Run Code Online (Sandbox Code Playgroud) 添加GPUImage到我的Xcode项目后,我的应用因缺少的Info.plist密钥而被拒绝NSCameraUsageDescription。
Info.plist密钥丢失-该应用尝试访问对隐私敏感的数据,而没有使用说明。该应用程序Info.plist必须包含一个NSCameraUsageDescription带有字符串值的 键,该字符串值会向用户说明该应用程序如何使用此数据。
我以几种不同的方式将密钥和说明添加到了我的plist中,并且超过10个版本都遇到了相同的拒绝错误。
这是我的,info.plist带有底部的“相机使用情况”键。
当我在plist中明确定义了为什么仍然拒绝我的任何想法?
我正在使用GPUImage库将视频录制到文件系统上的文件中.我把它保存为m4v文件.这是我正在使用的代码:
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:recordingDestination];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1280.0, 720.0)];
[videoCameraFilter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio = YES;
movieFile.audioEncodingTarget = movieWriter;
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[movieWriter startRecording];
[movieFile startProcessing];
[movieWriter setCompletionBlock:^{
[videoCameraFilter removeTarget:movieWriter];
[movieWriter finishRecording];
}];
Run Code Online (Sandbox Code Playgroud)
这会记录一个m4v视频.然后我试着用它来玩MPMoviePlayerController:
NSString *videoPath = [NSString stringWithFormat:@"%@/%@", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], [libraryFiles objectAtIndex:selectedCell]];
NSLog(videoPath);
NSURL *url=[[NSURL alloc] initWithString:videoPath];
MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDonePressed) name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];
moviePlayer.controlStyle=MPMovieControlStyleDefault;
[moviePlayer play];
[self.view …Run Code Online (Sandbox Code Playgroud) 我正在使用GPUIImage库来开发iOS相机应用程序.有时,当应用程序在2-3分钟后暂停时,Xcode会在应用程序上发生崩溃,指向方法中的行:
- (void)presentBufferForDisplay;
{
[self.context presentRenderbuffer:GL_RENDERBUFFER];
}
Run Code Online (Sandbox Code Playgroud)
可能是这次崩溃的原因是什么?我有一个非常长的相机设置,代码本身就在GPUImageContext课堂上.我在这里做错了什么?
我最近在Xcode中将GPUImage添加到我的podfile中,如下所示:
pod 'GPUImage', '~> 0.1.4'
Run Code Online (Sandbox Code Playgroud)
我不认为我遇到的问题是GPUImage特有的,而是与GPUImage是我添加的唯一包含额外资源的pod有关.
我的构建因"Shell脚本调用错误,退出代码23"而失败.
./Pods/GPUImage/framework/Resources/lookup.png
./Pods/GPUImage/framework/Resources/lookup_amatorka.png
./Pods/GPUImage/framework/Resources/lookup_miss_etikate.png
./Pods/GPUImage/framework/Resources/lookup_soft_elegance_1.png
./Pods/GPUImage/framework/Resources/lookup_soft_elegance_2.png
building file list ... rsync: link_stat "/Pods/GPUImage/framework/Resources/lookup.png" failed: No such file or directory (2)
rsync: link_stat "/Pods/GPUImage/framework/Resources/lookup_amatorka.png" failed: No such file or directory (2)
rsync: link_stat "/Pods/GPUImage/framework/Resources/lookup_miss_etikate.png" failed: No such file or directory (2)
rsync: link_stat "/Pods/GPUImage/framework/Resources/lookup_soft_elegance_1.png" failed: No such file or directory (2)
rsync: link_stat "/Pods/GPUImage/framework/Resources/lookup_soft_elegance_2.png" failed: No such file or directory (2)
done
sent 29 bytes received 20 bytes 98.00 bytes/sec
total size is 0 speedup …Run Code Online (Sandbox Code Playgroud) 我正在尝试将应用程序从Objective-C移植到Swift,但我遇到了GPUImageFilter子类的问题.
在Obj-C中,继承GPUImageFilter并使用不同的片段着色器就像这样简单
- (id)init;
{
NSString *fragmentShaderPathname = [[NSBundle mainBundle] pathForResource:@"TestShader" ofType:@"fsh"];
NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragmentShaderPathname encoding:NSUTF8StringEncoding error:nil];
if (!(self = [super initWithFragmentShaderFromString:fragmentShaderString]))
{
return nil;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何在Swift中做到这一点.这是我的新初始化程序:
override init() {
let fragmentShaderPathname = NSBundle.mainBundle().pathForResource("TestShader", ofType: "fsh")!
let fragmentShaderString = NSString(contentsOfFile: fragmentShaderPathname, encoding: NSUTF8StringEncoding, error: nil)
super.init(fragmentShaderFromString: fragmentShaderString)
}
Run Code Online (Sandbox Code Playgroud)
一旦调用此应用程序,应用程序就会崩溃并显示以下错误消息:
/Users/peterwunder/Documents/XCode/welp/welp/GPUImageTestFilter.swift: 12: 7: fatal error: use of unimplemented initializer 'init(vertexShaderFromString:fragmentShaderFromString:)' for class 'welp.GPUImageTestFilter'
我究竟做错了什么?
我的视频处理应用程序中发生了一次奇怪的崩溃.它用于AVFoundation处理视频和音频以及GPUImage过滤.我自己从未遇到过这个问题,但在将它发布到App Store之后,它经常出现在Crashlytics中.这是崩溃的日志:
Thread : Crashed: AVPlayerItemOutput queue
0 libobjc.A.dylib 0x00000001986f80b4 objc_retain + 20
1 libsystem_blocks.dylib 0x0000000198d79bf8 _Block_object_assign + 320
2 AVFoundation 0x0000000186895a34 __copy_helper_block_171 + 36
3 libsystem_blocks.dylib 0x0000000198d79738 _Block_copy_internal + 384
4 libdispatch.dylib 0x0000000198d252fc _dispatch_Block_copy + 36
5 libdispatch.dylib 0x0000000198d2685c dispatch_async + 68
6 AVFoundation 0x00000001868959ac -[AVPlayerItemVideoOutput _dispatchOutputSequenceWasFlushed] + 112
7 libdispatch.dylib 0x0000000198d2536c _dispatch_client_callout + 16
8 libdispatch.dylib 0x0000000198d2e6e8 _dispatch_barrier_sync_f_invoke + 76
9 AVFoundation 0x00000001868940a8 AVPlayerItemVideoOutput_figVCSequentialAvailable + 196
10 MediaToolbox 0x000000018a3c16f8 FigVisualContextImageAvailableSequential + 108
11 MediaToolbox …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Swift中设置一个hello-world-type型GPUImage示例.代码构建没有错误,但我得到一个没有图像的纯白色屏幕.GPUImageView在故事板中更改为红色的背景颜色会更改设备上的颜色,但使用setBackgroundColorRed(...)该类的方法无效.
以下是我设置的步骤:
GPUImage使用的CocoaPods.xcworkspace#include "GPUImage.h"桥接文件头UIView到故事板中,添加autolayout约束,将其类更改为GPUImageView,并在我的ViewController班级中创建了一个插座GPUImagePicture从我的应用程序包中的照片创建了一个import UIKit
class ViewController: UIViewController {
let image = GPUImagePicture(image: UIImage(named: "cameraman.png"))
@IBOutlet weak var imageView: GPUImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.image.addTarget(self.imageView)
self.image.processImage()
}
}
Run Code Online (Sandbox Code Playgroud)
如果我打印出来imageView或者image我得到非空的指针,并且它imageView有一个非零看的帧.奇怪的是,我在其他项目中使用了GPUImage而没有任何问题,并且无法想象这次我做了什么不同 - 我确定它是一个非常小的东西,我不知道,但我似乎无法把我的手指在上面.我在这里上传了这个项目:
https://bitbucket.org/DVigneault/stack/downloads
编辑:
我正在使用XCode 6.3和iOS 8.3
编辑2:
更新到XCode 6.3.1后的结果相同
编辑3:
如果我加self.image.processImage()的viewDidAppear,我得到了想要的结果(即,显示图像).我发现,GPUImage在我过去使用过的任何时候,我都会processImage()在视图出现后至少打过一次电话.视图出现后是否 …
在我的场景中,我从设备获取屏幕(它只生成tiff图像)并将其传输到jpeg并通过网络发送到客户端(客户端仅支持jpeg编码)
java code
public byte[] getscreen(){
/*
logic for fetching tiff image from the device
*/
if(tiffimage == null )
return null;
byteOutput = new ByteArrayOutputStream();
ImageIO.write(tiffImage, "jpeg", byteOutput);
return byteOutput;
}
Run Code Online (Sandbox Code Playgroud)
对于设备生成图像,它需要10ms - 1秒,具体取决于设备的分辨率(请注意,此侧不能进行任何更改,它只生成tiff图像),大小为3 MB -12 MB,具体取决于决议.
现在将图像转换为JPEG需要一些时间.我的查询是,我们可以使用GPU功率将图像从tiff转换为JPEG,这样我就可以在客户端获得改进的FPS吗?
PS:该应用程序运行在具有显卡的各种机器上,如(NVDIA,AMD,Intel HD图形)我想知道是否可以这样做,如果是这样,如何处理解决方案.
gpuimage ×10
ios ×6
objective-c ×3
swift ×3
xcode ×3
avfoundation ×1
cocoa-touch ×1
cocoapods ×1
crop ×1
detection ×1
gpu ×1
iphone ×1
java ×1
m4v ×1
opengl-es ×1