我需要做的很简单,我想使用相机回调手动显示来自相机的预览,我想在真实设备上获得至少15fps.我甚至不需要颜色,我只需要预览灰度图像.来自相机的图像是YUV格式,你必须以某种方式处理它,这是主要的性能问题.我正在使用API 8.
在所有情况下,我都使用camera.setPreviewCallbackWithBuffer(),它比camera.setPreviewCallback()更快.如果我没有显示预览,我似乎无法在这里获得大约24 fps.所以没有问题.
我试过这些解决方案:
1.在SurfaceView上将相机预览显示为位图.它有效,但性能约为6fps.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
Run Code Online (Sandbox Code Playgroud)
2.在GLSurfaceView上将相机预览显示为纹理.这里我只显示亮度数据(灰度图像),这非常简单,每帧只需要一个arraycopy().我可以得到大约12fps,但我需要在预览中应用一些过滤器,看起来,它无法在OpenGL ES 1中快速完成.所以我不能使用这个解决方案.另一个问题中的一些细节.
3.使用NDK在(GL)SurfaceView上显示相机预览以处理YUV数据.我在这里找到了一个使用一些C函数和NDK 的解决方案.但我没有设法使用它,这里有更多细节.但无论如何,这个解决方案是为了返回ByteBuffer在OpenGL中将其显示为纹理,并且它不会比之前的尝试更快.所以我必须修改它以返回int []数组,可以使用canvas.drawBitmap()绘制,但我不理解C足以执行此操作.
那么,我有没有其他方法可以避免或尝试一些改进?
假设我在java中有一个2D累加器数组int[][] array.该数组可能如下所示:
(x和z轴表示数组中的索引,y轴表示值 - 这些是int[56][56]具有0~4500值的图像)

要么

我需要做的是在阵列中找到峰值 - 第一个峰值有2个峰值,第二个阵列有8个峰值.这些峰值总是"明显的"(峰值之间始终存在间隙),但它们不必像这些图像那样相似,它们可能或多或少是随机的 - 这些图像不是基于真实数据,只是样本.真正的阵列可以有5000x5000的大小,峰值从几千到几十......算法必须是通用的,我不知道阵列或峰值有多大,我也不知道那里有多少个峰值是.但我确实知道某种阈值 - 峰值不能小于给定值.
问题是,一个峰可以由附近的几个较小的峰组成(第一个图像),高度可以是非常随机的,并且在一个阵列中大小可以显着不同(大小 - 我的意思是它在阵列中占用的单位数 - 一个峰值可以包含6个单位,其他峰值可以包含90个单位.它也必须快速(所有在1次迭代中完成),阵列可能非常大.
任何帮助表示赞赏 - 我不希望你的代码,只是正确的想法:)谢谢!
我或多或少是Java程序员,所以这可能是一个愚蠢的问题,但我找不到任何简单的解决方案.
我在C++中有这样的类:
template<class T> class Node {...}
Run Code Online (Sandbox Code Playgroud)
我需要T才能具有可比性 - 至少要定义== <>运算符.有没有简单的方法来做到这一点 - 或者最佳做法是什么?在Java中,它将是这样的:
public class Node<T extends Comparable> { ... }
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
Is it safe to emit a signal on an object from another thread (if the slot is connected as QueuedConnection)? I couldn't find a specific piece of documentation that would mention this, the most relevant quote I found is this:
QObject 是可重入的。它的大多数非 GUI 子类,例如 QTimer、QTcpSocket、QUdpSocket 和 QProcess,也是可重入的,从而可以同时从多个线程使用这些类。请注意,这些类旨在从单个线程中创建和使用;在一个线程中创建一个对象并从另一个线程调用它的函数不能保证工作。
这表明它可能不行,这也适用于信号吗?有一个QMutexLockerinside QMetaObject::activate,所以在我看来它可能是线程安全的......?
#include <QCoreApplication>
#include <QTimer>
#include <thread>
#include <iostream>
struct Foo : public QObject
{
Q_OBJECT
public:
Foo(QObject* parent) : QObject(parent) {}
public slots:
void run() …Run Code Online (Sandbox Code Playgroud) 我使用最小二乘法将平面拟合到3D点集.我已经有了算法来做到这一点,但我想修改它以使用加权最小二乘法.意思是每个点都有一个重量(重量越大,平面越接近该点).
当前算法(无重量)如下所示:
计算总和:
for(Point3D p3d : pointCloud) {
pos = p3d.getPosition();
fSumX += pos[0];
fSumY += pos[1];
fSumZ += pos[2];
fSumXX += pos[0]*pos[0];
fSumXY += pos[0]*pos[1];
fSumXZ += pos[0]*pos[2];
fSumYY += pos[1]*pos[1];
fSumYZ += pos[1]*pos[2];
}
Run Code Online (Sandbox Code Playgroud)
而不是制作矩阵:
double[][] A = {
{fSumXX, fSumXY, fSumX},
{fSumXY, fSumYY, fSumY},
{fSumX, fSumY, pointCloud.size()}
};
double[][] B = {
{fSumXZ},
{fSumYZ},
{fSumZ}
};
Run Code Online (Sandbox Code Playgroud)
比解Ax = B,解的3个分量是拟合平面的系数...
那么,你能帮助我如何修改它来使用权重吗?谢谢!
我有一个3D数据,存储在一维数组中.我像这样计算1D索引:
index = i + j * WIDTH + k * WIDTH * HEIGHT
Run Code Online (Sandbox Code Playgroud)
比我需要从原来的i,j,k索引回来index.显而易见的方法是这样的:
k = index / (WIDTH * HEIGHT)
j = (index % (WIDTH * HEIGHT)) / WIDTH
i = index - j * WIDTH - k * WIDTH * HEIGHT
Run Code Online (Sandbox Code Playgroud)
但我想知道,有没有更有效的方法来做到这一点?至少没有模数......
这个问题的上下文 - 我在CUDA中有一个内核,我访问数据和计算i, j, k索引(index对应于唯一的线程ID).那么也许有一些特定于CUDA的方法可以做到这一点?我想这是很常见的问题,但我找不到更好的方法来做到这一点......
谢谢你的想法!
我想用android相机创建一个色度键效果.我不需要一步一步,但我想知道劫持Android相机并应用过滤器的最佳方法.我已经检查了API,并没有找到任何关于如何操纵来自相机的数据的超级权威.起初我研究过使用表面纹理,但我不完全清楚它是如何帮助或如何使用它.然后我使用GLSurfaceView检查,这可能是正确的方向,但不是很确定.
另外,要添加到我的问题,我将如何处理图像的预览和保存?我会以最少两次处理图像吗?一次预览和一次保存?我认为这可能是最好的解决方案.
最后,创建一个C/++包装器来处理优化速度的处理是否有意义?
任何帮助都将非常感激.一些例子的链接也将非常感激.
谢谢.
android opengl-es image-processing android-camera opengl-es-2.0
我有两个活动 - 活动A开始活动B.然后活动B从数据库加载一些东西,并可视化数据.完全初始化B中的所有内容需要一些时间(5-10秒).
我的问题是,如果我按下B中的后退按钮,它会破坏B活动(调用onDestroy)并返回活动A.我仍然想要返回活动A,但不会破坏B,因为如果我再次启动B,我必须在它做所有的事情之前再次等待(这很烦人).这有可能吗?
谢谢你的帮助!