我正在尝试将应用程序从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'
我究竟做错了什么?
我正在使用GPUImage和许多GPUImageView实例.目的是显示原始图像,在顶部层叠几片过滤图像,最后在原始图像上缓慢地对切片过滤器进行动画处理.想象一下,带有一些棕褐色条纹的图像会滚动显示正常图像和剖面图中的棕褐色图像.
我将此功能包装在UIView的子类中,如下所示:
import Foundation
import QuartzCore
class FilteredImageMaskView : UIView {
init(frame: CGRect, image: UIImage){
super.init(frame: frame);
let imageViewFrame = CGRectMake(frame.origin.x, 0.0, frame.size.width, frame.size.height);
let origImage = GPUImagePicture(image: image);
origImage.forceProcessingAtSizeRespectingAspectRatio(imageViewFrame.size);
// Display the original image without a filter
let imageView = GPUImageView(frame: imageViewFrame);
origImage.addTarget(imageView);
origImage.processImageWithCompletionHandler(){
origImage.removeAllTargets();
var contentMode = UIViewContentMode.ScaleAspectFit;
imageView.contentMode = contentMode;
// Width of the unfiltered region
let regularWidth: CGFloat = 30.0;
// Width of filtered region
let filterWidth: CGFloat = 30.0;
// How much we are moving …Run Code Online (Sandbox Code Playgroud) 在我的场景中,我从设备获取屏幕(它只生成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来处理传入的视频,然后我想考虑图像的给定方形子区域并确定该区域中像素的平均像素值.任何人都可以告诉我如何做到这一点?甚至关于如何在图像中的坐标(x,y)处获取像素的像素数据的信息也是有用的.
抱歉,如果这是一个简单的问题,但我是计算机视觉的新手,并且从可用的文档中我不清楚这样做的方法.谢谢.
我正在使用GPUImage我的应用程序中的过滤器(使用它将一个值过滤器应用于静态照片).我正在尝试决定是否需要使用smoothlyScaleOutput.它的缺点是加载大型照片需要很长时间.我读过Brad Larson说:
照片的smoothScaleOutput:选项告诉框架在对照片进行下采样时使用三线性过滤.也就是说,对于缩小的大型照片,它会产生更平滑的输出.如果您不需要缩小照片,可以将其关闭以获得更好的性能和更清晰的照片.
只是很好奇,但对于那些GPUImage以与我相同的方式使用的人来说,启用此选项对我来说是否值得?我很难区分它,但我只使用一些基本滤镜(亮度,对比度,棕褐色等)对少量照片进行采样.
关于什么可能构成缩小照片也很困惑.这是否意味着使用UIImage drawInRect以较小的分辨率绘制照片?或者这是否意味着拍摄大照片并将其大小转换为适合UIImageView?或两者?
任何帮助将不胜感激.
是否可以像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) 我想在我的 Android 设备中通过相机录制视频。我需要在录制的电影上添加叠加图像。在 iOS 中,我会使用GPUImage。在 Android 中,我找到了Android GPUImage。我尝试使用它,但我没有找到任何方法在视频录制时添加任何过滤器。在提供的示例中,我可以添加仅用于拍照的过滤器。有什么方法可以使用Android GPUImage使用过滤器录制视频?有没有其他方法可以实时在录制视频上添加图像叠加?如果没有,是否有任何方法可以在后期处理中添加覆盖在录制视频上的图像?
我目前正在一个主要是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
我正在尝试在我的 iOS 应用程序中重现 Adobe Lightroom 效果。目前我正在使用GPUImage所有效果,但发现很难重现高光和阴影效果。我也已经尝试使用CIHighlightShadowAdjustCIFilter 但它给了我错误的结果。
所以我正在寻找至少 Lightroom 用于此效果的算法。它们都与亮度更改非常相似,但似乎它们仅用于更改图片的亮/暗部分,具体取决于是否使用高光或阴影。
谁能指出我需要寻找的正确方向才能产生相同的效果?如何仅更改图片的暗/亮部分的亮度?
示例如下 1. 左为原始图像,右为经过 +100 高光调整的图像(可能范围 -100;100,默认为 0)。
你可以看到天空(图像较亮的部分)有不同的亮度,但雕像几乎没有改变。
在这里你可以看到雕像(图片较暗的部分)的亮度变化很大,但天空几乎没有变化。