//编辑...
我正在编辑我的问题,以解决专门处理非二次幂图像的问题.我有一个基本结构,适用于尺寸为256x256或1024x1024的方形灰度图像,但无法看到如何推广到任意大小的图像.fft函数似乎希望你包含宽度和高度的log2,但是它不清楚如何解压缩结果数据,或者数据是否只是被扰乱.我认为显而易见的事情是将npot图像置于较大的全黑图像中,然后在查看数据时忽略这些位置中的任何值.但是想知道是否有一种不太笨拙的方法来处理npot数据.
//...END编辑
我在使用Accelerate Framework文档时遇到了一些麻烦.我通常会使用FFTW3,但是我无法在实际的IOS设备上进行编译(请参阅此问题).任何人都可以指向使用Accelerate的超级简单实现,它执行如下操作:
1)将图像数据转换为适当的数据结构,可以传递给Accelerate的FFT方法.
在FFTW3中,最简单的是,使用灰度图像,这涉及将无符号字节放入"fftw_complex"数组中,该数组只是两个浮点数的结构,一个包含实数值,另一个包含虚数(和虚数在哪里)每个像素初始化为零).
2)采用该数据结构并对其执行FFT.
3)打印出幅度和相位.
4)对其执行IFFT.
5)根据IFFT产生的数据重新创建原始图像.
虽然这是一个非常基本的例子,但我在使用Apple网站上的文档时遇到了麻烦.Pi的SO 答案非常有用,但我仍然对如何使用Accelerate使用灰度(或彩色)2D图像执行此基本功能感到困惑.
无论如何,任何指针或特别是一些处理2D图像的简单工作代码都会非常有用!
编辑\\\
好的,花了一些时间深入研究文档和SO上的一些非常有用的代码以及pkmital的github repo,我有一些工作代码,我以为我会发布自1)我花了一段时间来计算它和2)因为我有几个剩下的问题......
初始化FFT"计划".假设一个方形的二次幂图像:
#include <Accelerate/Accelerate.h>
...
UInt32 N = log2(length*length);
UInt32 log2nr = N / 2;
UInt32 log2nc = N / 2;
UInt32 numElements = 1 << ( log2nr + log2nc );
float SCALE = 1.0/numElements;
SInt32 rowStride = 1;
SInt32 columnStride = 0;
FFTSetup setup = create_fftsetup(MAX(log2nr, log2nc), FFT_RADIX2);
Run Code Online (Sandbox Code Playgroud)
传入一个字节数组,用于方形二次灰度图像并将其转换为COMPLEX_SPLIT:
COMPLEX_SPLIT in_fft;
in_fft.realp = ( float* ) …Run Code Online (Sandbox Code Playgroud) 尽管StackOverflow上有很好的信息,但我仍然在这里尽力而为......
我正在尝试将OpenGL渲染缓冲区写入iPad 2上的视频(使用iOS 4.3).这正是我正在尝试的:
A)设置AVAssetWriterInputPixelBufferAdaptor
创建一个指向视频文件的AVAssetWriter
使用适当的设置设置AVAssetWriterInput
设置AVAssetWriterInputPixelBufferAdaptor以将数据添加到视频文件中
B)使用该AVAssetWriterInputPixelBufferAdaptor将数据写入视频文件
将OpenGL代码渲染到屏幕上
通过glReadPixels获取OpenGL缓冲区
从OpenGL数据创建CVPixelBufferRef
使用appendPixelBuffer方法将PixelBuffer附加到AVAssetWriterInputPixelBufferAdaptor
但是,我遇到了这个问题.我现在的策略是在按下按钮时设置AVAssetWriterInputPixelBufferAdaptor.一旦AVAssetWriterInputPixelBufferAdaptor有效,我设置一个标志来通知EAGLView创建一个像素缓冲区,并通过appendPixelBuffer将它附加到视频文件中给定数量的帧.
现在我的代码崩溃,因为它试图附加第二个像素缓冲区,给我以下错误:
-[__NSCFDictionary appendPixelBuffer:withPresentationTime:]: unrecognized selector sent to instance 0x131db0
Run Code Online (Sandbox Code Playgroud)
这是我的AVAsset设置代码(很多是基于Rudy Aramayo的代码,它可以在普通图像上工作,但不是为纹理设置的):
- (void) testVideoWriter {
//initialize global info
MOVIE_NAME = @"Documents/Movie.mov";
CGSize size = CGSizeMake(480, 320);
frameLength = CMTimeMake(1, 5);
currentTime = kCMTimeZero;
currentFrame = 0;
NSString *MOVIE_PATH = [NSHomeDirectory() stringByAppendingPathComponent:MOVIE_NAME];
NSError *error = nil;
unlink([betaCompressionDirectory UTF8String]);
videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:betaCompressionDirectory] fileType:AVFileTypeQuickTimeMovie error:&error];
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width], AVVideoWidthKey, …Run Code Online (Sandbox Code Playgroud) 在http://www.vtk.org/Wiki/Cocoa_VTK上发布的非常有用的指南以及由VTK回购中的Sean McBride和Mike Jackson 发布的自述文件对于VTK 6.1来说已经过时了.所以,如果这有助于任何人,我发布了在OSX 10.8上安装VTK 6.1的说明,并支持SimpleCocoaVTK Xcode项目.