目前在我正在开发的Android应用程序中,我正在循环遍历图像的像素以使其模糊.这在640x480图像上大约需要30秒.
在Android Market中浏览应用程序时,我遇到了一个包含模糊功能的应用程序,并且它们的模糊非常快(例如5秒),因此它们必须使用不同的模糊方法.
除了循环像素之外,任何人都知道更快的方法吗?
我一直想知道是否有可能使用OpenCL for Android,发现它是不可能的,并完全放弃了主题.但感谢1月14日在官方Android开发者博客(http://android-developers.blogspot.fr/2013/01/evolution-of-renderscript-performance.html)上发布的博客文章,我发现并行编程是可能的自Android 4.0以来,感谢RenderScript!一个与OpenCL有很多共同特征的API.
我现在想知道的是:为什么谷歌选择实施这个新的解决方案,而不是推动OpenCL向前推进(现在由Khronos集团处理的开放规范).
我的意思是,我知道,从一个转换到另一个并不是很难,但仍然......
无论如何,如果有人作为真正的解释,请告诉我!
是否可以将支持Renderscript库与Gradle 一起使用?如果是这样,你如何将它包含在你的项目中?
对于平台独立性(桌面,云,移动......),当速度很重要时,使用OpenCL进行GPGPU开发会很棒.我知道谷歌推动RenderScript作为替代方案,但它似乎只适用于Android,并且不太可能包含在iOS中.
因此,我寻求在Android应用程序中执行OpenCL代码的解决方案.
我想在android上的GPU上进行相机图像处理.
在我目前的设置中,我使用SurfaceTexture从相机图像流中捕获帧作为OpenGL ES纹理.这是在我的着色器中访问相机流的有效方法.(http://developer.android.com/reference/android/graphics/SurfaceTexture.html)
现在我想开始使用新的RenderScript API而不是直接使用OenGL ES.(http://developer.android.com/guide/topics/renderscript/index.html)
但是要创建SurfaceTexture,我需要将openGl纹理ID传递给构造函数.遗憾的是,纹理ID不可用(RenderScript使用Allocation类来加载纹理,不会显示纹理ID).所以我在使用RenderScript时无法创建SurfaceTexture.
我已经阅读了关于renderscript的所有文档(它仍然非常稀疏)并查看了示例,但它们没有关于该主题的信息.
所以我的问题是:是否可以将SurfaceTexture与RenderScript结合使用,还是有其他有效的方法在RenderScript Graphics脚本中使用实时相机流?
我目前正在使用Javacv,它利用public void onPreviewFrame(byte[] data, Camera camera)相机功能.
由于相机已被弃用,我一直在研究camera2和MediaProjection.这两个库都使用ImageReader类.
目前我ImageReader使用以下代码实例化这样的:
ImageReader.newInstance(DISPLAY_WIDTH, DISPLAY_HEIGHT, PixelFormat.RGBA_8888, 2);
并附上OnImageAvailableListener这样的:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new processImage(reader.acquireNextImage()));
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用RGBA_8888Javacv 的格式按照这个帖子:https://github.com/bytedeco/javacv/issues/298但这对我不起作用.
所以我正在考虑使用Render脚本将这些Image转换为NV21(YUV_420_SP)格式(这是onPreviewFrame函数中相机的默认输出),因为这对我来说对camera库有用.
我还阅读了这个和本网站的帖子进行转换,但这些对我不起作用,我担心它们会太慢.此外,我对C的了解非常有限.基本上看起来我想要https://developer.android.com/reference/android/renderscript/ScriptIntrinsicYuvToRGB.html的反向操作
那么你怎么能从一个Image匹配onPreviewFrame函数输出的字节数组,即NV21(YUV_420_SP)格式?最好使用Renderscript,因为它更快.
我尝试过使用ImageFormat.YUV_420_888 …
camera android image-processing renderscript android-camera2
当我使用以下代码时,它最终会出现outofmemory异常.做了研究之后,Render脚本看起来像个好人.我在哪里可以找到类似操作的示例代码以及如何将其集成到我的项目中.
public Bitmap rotateBitmap(Bitmap image, int angle) {
if (image != null) {
Matrix matrix = new Matrix();
matrix.postRotate(angle, (image.getWidth()) / 2,
(image.getHeight()) / 2);
return Bitmap.createBitmap(image, 0, 0, image.getWidth(),
image.getHeight(), matrix, true);
}
return null;
}
Run Code Online (Sandbox Code Playgroud) 我现在在Android上编程,我想知道我们现在是否可以使用GPGPU for Android?我曾经听说Renderscript将来可能会在GPGPU上执行.但我想知道我们现在是否有可能在GPGPU上进行编程?如果我可以在Android GPGPU上编程,我在哪里可以找到一些教程或示例程序?感谢您的帮助和建议.
到目前为止,我知道OpenGL ES库现在加速使用GPU,但我想使用GPU进行计算.我想要做的是加速计算,以便我希望使用一些API库,如OpenCL.
我的问题是:我在Android中设置了一个摄像头并通过使用onPreviewFrame监听器接收预览数据,该监听器向我传递一个包含默认android YUV格式的图像数据的byte []数组(设备不支持R5G6B5-格式).每个像素由12位组成,这使得事情有点棘手.现在我想要做的是将YUV数据转换为ARGB数据,以便用它进行图像处理.这必须使用renderscript来完成,以保持高性能.
我的想法是在一个元素中传递两个像素(这将是24位= 3个字节),然后返回两个ARGB像素.问题是,在Renderscript中,u8_3(三维8位向量)存储在32位,这意味着最后8位未使用.但是当将图像数据复制到分配中时,使用了所有32位,因此最后8位丢失.即使我使用32位输入数据,最后8位也没用,因为它们只有2/3像素.在定义包含3字节数组的元素时,它实际上具有3个字节的实际大小.但是然后Allocation.copyFrom() - 方法没有用数据填充in-Allocation,认为它没有用byte []填充正确的数据类型.
renderscript文档指出,有一个ScriptIntrinsicYuvToRGB应该在API级别17中完全执行.但实际上该类不存在.我已经下载了API Level 17,即使它似乎不再可以下载了.有没有人有任何关于它的信息?有没有人尝试过ScriptIntrinsic?
总而言之,我的问题是:如何快速,快速地将摄像机数据转换为ARGB数据?
这是在Dalvik VM中如何做到这一点(在网上找到代码,它的工作原理):
@SuppressWarnings("unused")
private void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) …Run Code Online (Sandbox Code Playgroud) RenderScript无法在Android 2.3模拟器上运行.
04-04 15:37:39.146: W/dalvikvm(863): Unable to resolve superclass of Landroid/support/v8/renderscript/RenderScript$2; (316)
04-04 15:37:39.146: W/dalvikvm(863): Link of class 'Landroid/support/v8/renderscript/RenderScript$2;' failed
04-04 15:37:39.146: E/dalvikvm(863): Could not find class 'android.support.v8.renderscript.RenderScript$2', referenced from method android.support.v8.renderscript.RenderScript.setErrorHandler
04-04 15:37:39.146: W/dalvikvm(863): VFY: unable to resolve new-instance 890 (Landroid/support/v8/renderscript/RenderScript$2;) in Landroid/support/v8/renderscript/RenderScript;
04-04 15:37:39.146: D/dalvikvm(863): VFY: replacing opcode 0x22 at 0x0009
04-04 15:37:39.146: D/dalvikvm(863): VFY: dead code 0x000b-0012 in Landroid/support/v8/renderscript/RenderScript;.setErrorHandler (Landroid/support/v8/renderscript/RenderScript$RSErrorHandler;)V
04-04 15:37:39.146: W/dalvikvm(863): Unable to resolve superclass of Landroid/support/v8/renderscript/RenderScript$1; (317)
04-04 15:37:39.146: W/dalvikvm(863): Link of class 'Landroid/support/v8/renderscript/RenderScript$1;' …Run Code Online (Sandbox Code Playgroud)