我正在尝试对传入的预览相机帧应用二维傅里叶变换。
以下是我的renderScript代码,它在每个onSurfaceTextureUpdated上执行:
现在,我的代码背后的数学原理是什么?基本上应用欧拉公式,忽略相位项,因为我不能处理虚数,并且只绘制幅度,即实际(余弦)部分。当然,我将图像灰度化,如您所见。
以下是我的资源:
1) http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm “...在图像处理中,通常仅显示傅里叶变换的幅度,因为它包含了空间域图像几何结构的大部分信息..”
2) http://www.nayuki.io/page/how-to-implement-the-discrete-fourier-transform 我获得欧拉公式和如何应用它的地方。
我的问题是,当我启动我的应用程序时,它会给我原始图像,无论摄像机看到什么,除此之外没有任何东西。而且它在2到3秒后就会冻结。
我的代码有什么问题吗?它太难处理了吗?我所问的是否可能(我在三星Galaxy S4 Mini上运行)?我只想在相机帧上应用实时简单DFT。
#pragma version(1)
#pragma rs java_package_name(foo.camerarealtimefilters)
rs_allocation inPixels;
int height;
int width;
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
float3 fourierPixel;
for(int k=0; k<=width; k++){
for(int l=0; l<=height; l++){
float3 pixel = convert_float4(rsGetElementAt_uchar4(inPixels, k, l)).rgb;
float greyOrigPixel = (pixel.r + pixel.g + pixel.b)/3;
float angle = 2 * M_PI * ( ((x * k) / width) + ((y * l) / height) );
fourierPixel.rgb = greyOrigPixel*cos(angle);
};
};
out->xyz = convert_uchar3(fourierPixel);
}
这个方法设置了inPixels变量的值,
public void setInAllocation(Bitmap bmp) {
inAllocation = Allocation.createFromBitmap(rs, bmp);
fourierScript.set_inPixels(inAllocation);
};
现在,我的代码背后的数学原理是什么?基本上应用欧拉公式,忽略相位项,因为我不能处理虚数,并且只绘制幅度,即实际(余弦)部分。当然,我将图像灰度化,如您所见。
以下是我的资源:
1) http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm “...在图像处理中,通常仅显示傅里叶变换的幅度,因为它包含了空间域图像几何结构的大部分信息..”
2) http://www.nayuki.io/page/how-to-implement-the-discrete-fourier-transform 我获得欧拉公式和如何应用它的地方。
我的问题是,当我启动我的应用程序时,它会给我原始图像,无论摄像机看到什么,除此之外没有任何东西。而且它在2到3秒后就会冻结。
我的代码有什么问题吗?它太难处理了吗?我所问的是否可能(我在三星Galaxy S4 Mini上运行)?我只想在相机帧上应用实时简单DFT。