gpt4 book ai didi

android - 如何加快我的Android-openCV应用程序的速度?

转载 作者:IT老高 更新时间:2023-10-28 23:18:58 25 4
gpt4 key购买 nike

我在使用SURF描述符的地方实现了一个openCV应用程序。代码工作正常,如下所示:

I reduce the input video stream size to speed it up


            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());

}

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

感谢您的时间和答复

最佳答案

But the calculation is still way too slow, so I need to find another method to reduce input video stream qualllity.



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

尽管如此,总有一些事情可以做,而在性能上几乎没有改变,就可以提高速度。

现在,我还在GalaxyS上计算OpenCV SURF,在320x240的图像中,我对200个功能的帧速率为1.5 fps,粗略阈值为1500。我承认这是糟糕的性能,但就我而言,我只是偶尔需要计算一次特征,因为我正在测量光流以进行跟踪。但是,非常奇怪的是,每4-5秒只能获得1帧。

1)首先,在我看来,您正在使用VideoCapture获取摄像机帧。好吧,我不是。我正在使用Android相机实现。我没有检查如何在OpenCV的Java端口中实现VideoCapture,但它似乎比某些教程中的实现要慢。但是,由于我没有测试过,因此我不能百分百确定。你是否?

2)将 native 调用减少到最小。 Java OpenCV native 调用非常耗时。另外,请遵循 Android-OpenCV best practices page中指定的所有准则。如果您有多个本地调用,请将它们全部合并到一个JNI调用中。

3)您还应该减小图像尺寸,并增加SURF粗略阈值。但是,这将减少检测到的特征的数量,但是出于识别和匹配的目的,它们将变得更强大,更强大。如果您说SURF是更强大的检测器(它也是最慢的,并且已申请专利),那您是对的。但是,如果这不是您的死锁,我建议您使用新的ORB检测器,它是Brief的一种变体,在旋转方面表现更好。但是,ORB有一些缺点,例如,检测到的关键点数量有限并且缩放不变性很差。 This是一个非常有趣的特征检测器算法比较报告。它还表明,在新的OpenCV 2.3.1版本中,SURF检测器的速度较慢,这可能是由于算法的某些更改所致,从而提高了鲁棒性。

4)现在的乐趣。已经广泛报道了ARM处理器体系结构(大多数Android手机都基于该处理器),因为它处理浮点计算的速度很慢,而功能检测器算法在很大程度上依赖于浮点计算。关于此问题已经有 very interesting discussions了,许多人说您应该尽可能使用定点计算。新的armv7-neon架构提供了更快的浮点计算,但并非所有设备都支持它。要检查您的设备是否支持它,请运行 adb shell cat proc/cpuinfo。您也可以使用NEON指令( LOCAL_ARM_NEON := true)来编译 native 代码,但是我怀疑这样做会不会有好处,因为显然很少有OpenCV例程是经过NEON优化的。因此,提高速度的唯一方法是使用NEON内在函数重建代码(这对我来说是完全未开发的基础,但是您可能会发现它值得一看)。在android.opencv组 it was suggested中, future 的OpenCV版本将具有更多经过NEON优化的库。这可能很有趣,但是我不确定是否值得为此工作或等待更快的CPU和使用GPU计算的优化系统。请注意,Android系统<3.0 do not use built-in hardware acceleration

5)如果您出于学术目的而这样做,请说服您的大学为您购买更好的设备^^。对于更快的SURF特征检测,这最终可能是最佳选择。另一种选择是重写算法。我知道英特尔实验室中的一些人做到了,但取得了一些成功,但是显然他们不会分享。
坦率地说,在调查了这个问题几周后,我意识到,对于我的特定需求(并且由于我既不是计算机科学工程师也不是算法专家),等待几个月才能获得更好的设备比敲击我的头有更多的值(value)。在墙上剖析算法并开发近汇编代码。

最好的问候,祝你好运!

关于android - 如何加快我的Android-openCV应用程序的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7916587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com