草庐IT

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

coder 2023-06-09 原文

我在使用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/

有关android - 如何加快我的Android-openCV应用程序的速度?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

随机推荐