我如何提高Android openCV应用程序的速度?

我如何提高Android openCV应用程序的速度?,android,opencv,Android,Opencv,我已经实现了一个openCV应用程序,其中我使用了SURF描述符。工作正常代码如下所示: 我减小了输入视频流的大小以加快速度 但是计算仍然太慢,所以我需要找到另一种方法来降低输入视频流的质量。或者,如果您知道另一种加速方法,请随时与我分享;) 感谢您的时间和解答您的应用程序是否需要使用冲浪功能/描述符?冲浪是有吸引力的,因为它匹配得很好,但正如你所发现的,它有点慢。如果您只是通过视频跟踪点,您可以假设点在帧与帧之间变化不大,因此您可以检测并匹配Harris/FAST角点,然后过滤匹配,使其仅在原

我已经实现了一个openCV应用程序,其中我使用了SURF描述符。工作正常代码如下所示:

我减小了输入视频流的大小以加快速度

但是计算仍然太慢,所以我需要找到另一种方法来降低输入视频流的质量。或者,如果您知道另一种加速方法,请随时与我分享;)


感谢您的时间和解答

您的应用程序是否需要使用冲浪功能/描述符?冲浪是有吸引力的,因为它匹配得很好,但正如你所发现的,它有点慢。如果您只是通过视频跟踪点,您可以假设点在帧与帧之间变化不大,因此您可以检测并匹配Harris/FAST角点,然后过滤匹配,使其仅在原始点的x像素半径范围内有效

OpenCV有一个(尽管有点有限)和的选择,如果您还没有选择,那么值得研究这些选项

但是计算还是太慢了,所以我需要另找一个 降低输入视频流质量的方法

这个问题的真正答案更接近于“你无能为力”,而不是其他任何问题。我们必须承认,手机还没有像任何台式机那样强大的处理能力。世界上大多数安卓手机仍在使用该系统的早期版本,最重要的是:它们是单核设备,时钟频率低于1GHz,内存有限,等等

尽管如此,您仍然可以在性能变化不大的情况下提高速度

现在,我还在GalaxyS上计算OpenCV SURF,在320x240图像中,200个特征的帧速率为1.5 fps,hessian阈值为1500。我承认这是糟糕的性能,但在我的情况下,我只需要每隔一段时间计算一次特征,因为我测量光流是为了跟踪。然而,非常奇怪的是,每4-5秒只能获得1帧

1) 首先,在我看来,您似乎正在使用视频捕获来获取相机帧。嗯,我不是。我正在使用Android摄像头实现。我没有检查VideoCapture是如何在OpenCV的Java端口中实现的,但它似乎比在一些教程中使用该实现要慢。然而,我不能100%肯定这一点,因为我还没有测试过它。是吗

2) 尽可能减少本机调用。Java OpenCV本机调用花费时间。此外,请遵循中指定的所有指南。如果您有多个本机调用,请在一个JNI调用中加入它们

3) 您还应该减小图像大小并增加SURF hessian阈值。然而,这将减少检测到的特征的数量,但对于识别和匹配而言,它们将更强大、更健壮。当你说SURF是更健壮的检测器时,你是对的(它也是最慢的,并且是专利)。但是,如果这对你来说不是一个死锁,我建议你使用新的球体探测器,一种在旋转方面表现更好的简短的变体。然而,ORB也有缺点,例如检测到的关键点数量有限,尺度不变性差。是一个非常有趣的特征检测器算法比较报告。它还表明,在新的OpenCV 2.3.1版本中,SURF检测器速度较慢,这可能是由于算法中的一些更改,以增强鲁棒性

4) 现在是有趣的部分。ARM处理器体系结构(大多数Android手机都基于该体系结构)因其处理浮点计算的速度慢而广为报道,其中特征检测器算法严重依赖于该体系结构。关于这个问题,已经有很多人提出,只要有可能,就应该使用定点计算。新的armv7 neon体系结构提供了更快的浮点计算,但并非所有设备都支持它。要检查您的设备是否支持它,请运行
adb shell cat proc/cpuinfo
。您也可以使用NEON指令编译本机代码(
LOCAL\u ARM\u NEON:=true
),但我怀疑这会有什么好处,因为显然很少有OpenCV例程经过NEON优化。因此,提高速度的唯一方法是使用NEON Intrinsic重建代码(这对我来说是完全未经探索的领域,但您可能会发现它值得一看)。在android.opencv组中,未来的opencv版本将有更多的NEON优化库。这可能会很有趣,但我不确定是否值得进行研究,或者等待更快的CPU和使用GPU计算的优化系统。请注意,Android系统<3.0

5) 如果你这样做是为了学术目的,说服你的大学给你买一个更好的设备。这最终可能是更快的冲浪特征检测的最佳选择。另一个选择是重写算法。我知道英特尔实验室的一些人做了这件事,取得了一些成功,但显然他们不会分享。 老实说,在对这个问题进行了几周的调查之后,我意识到,对于我的特殊需求(而且我既不是计算机科学工程师,也不是算法专家),等待几个月来寻找更好的设备比把头撞在墙上解剖算法和开发近乎汇编的代码更有价值


祝你好运

你的帧速率是多少?我没有设置它是deffault,但我不知道如何设置它,或者什么是Performance/Vision的最佳值,但是如果你想输出视频FPS,它是每4-5秒1帧,所以很糟糕。你进行了分析吗?我发现来自davlik的本地电话相当昂贵。访问从摄像头应用程序分配的MMAMED内存也很昂贵。我不太理解你的问题,但答案是否定的。是的,我知道,但冲浪更强大,我可以使用FAST或Harris Corner。。。日分
            capture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, display.getWidth());
            capture.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, display.getHeight());

            capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

            try{

          //-- Step 1: Detect the keypoints using SURF Detector

            surfDetector.detect( mRgba, vector1 );

            for (KeyPoint t : vector1)
                Core.circle(mRgba, t.pt, 10, new Scalar(100, 100,100));    

          //-- Step 2: Calculate descriptors (feature vectors)
            //extractor.compute(mRgba, vector1, descriptor1);

          //-- Draw matches
            //Mat img_matches;
            //drawMatches( mRgba, vector1, mRgba, vector1, matches, img_matches );


            }catch(Exception e){
                Log.e( "ERROR", e.toString());

            }