我想知道是否有一种简单的方法来获取原生Android代码的当前时间.最佳地,它可以与System.getTimeMillies()相媲美.我将只使用它来查看某些函数调用将花费多长时间,所以一个长变量与当前时间(以毫秒为单位)将是我的最佳解决方案.
提前致谢!
我正在研究Android上的基本增强现实应用程序.到目前为止我所做的是用opencv检测一个正方形然后使用cvFindExtrinsicCameraParams2()我计算了一个旋转和平移向量.为此,我使用了4个对象点,它们只是(0,0,0)方形的角和图像中方形的4个角.
这给我一个非常好的旋转和平移矩阵.我还用cvRodrigues2()计算了旋转矩阵,因为使用它比旋转矢量更容易.只要我用它们在图像中绘制一些点就可以了.然而,我的下一步是将这些向量和矩阵传递回java,然后使用它们与OpenGL在OpenGLView中绘制一个正方形.正方形应该恰好位于OpenGLView后面显示的图像中的正方形.
我的问题是我找不到在OpenGL中使用旋转矩阵和平移向量的正确方法.我开始使用与openCV函数完全相同的对象点.然后我以几乎任何可能的方式应用旋转矩阵和平移向量.遗憾的是,这些方法都没有产生任何接近我希望的结果.谁能告诉我如何正确使用它们?
到目前为止,我得到的"最接近"的结果是将整个矩阵随机乘以-1.但大多数情况下,方块仍然看起来镜像反转或旋转180度.所以我想这只是一个幸运的打击,但不是正确的方法.
我现在已经使用Java for Android编程了很多.由于性能对于我正在研究的东西非常重要,我最终只是在发送垃圾邮件给全局变量.我想现在每个人都会冲进去告诉我这是有史以来最糟糕的风格,但是让我们保持简单.对于Android,局部变量意味着垃圾收集和垃圾收集是杀死性能的东西.
最近我开始使用NDK.现在我觉得实际上采取所有局部变量并将它们更改为全局变量的冲动.我想知道如果这在c代码中有任何意义.显然这不是好风格,但如果速度需要,我会很乐意牺牲风格.
我已经浏览过关于本地和全球的旧线程,但我还没有找到关于速度的任何信息.所以我的问题是,如果我经常调用一个函数,它是否与创建局部变量的速度相关并在函数完成后死亡?或者根本不重要,我可以愉快地继续使用局部变量.
我会自己测试一下,但由于某种原因,我的应用程序的性能像过山车一样上下起伏,我怀疑我是否能真正理解数据.我希望有人可以在我重写整个代码之前帮助我:)
之前我和OpenCV一起使用过Android,而我一直试图做的是尽可能少地使用我的本机代码和我的java代码之间的调用.当我查看Android 的OpenCV 端口时,看起来他们只是为每个本机函数创建一个包装器函数并从java调用它们.现在,除非我完全误解swig包装器的原理和这个端口的整个想法,这不会比在本机代码中进行实际编码慢得多吗?我注意到在本机代码和java代码之间传递数据真的很慢,所以我不明白为什么它似乎是这个端口中最正常的东西.
我自己使用它,但我只是决定忽略所有的包装器并按原样使用代码,并使用Android教程提供的常规方法创建自己的包装器.
所以我的问题是,我对错误的看法是错的吗?或者他们实际上是在那里使用OpenCV的真正优势是什么?我知道这些问题有点不正式,但我希望你们可以帮助我.
我完全不熟悉脚本,但我厌倦了手动编译Android的本机代码,所以我写了一个.sh脚本和一个.bat文件来运行cygwin中的这个脚本.两个文件都放在项目的根目录中,在.sh文件中设置了NDK目录,然后通过运行.bat文件编译我的本机代码.
问题是我想动态地这样做,所以我使用%CD%来获取当前目录(应该是项目文件夹)并启动该目录中的.sh文件.
这两个文件:
.bat:
@echo off
::Used to surpess a warning about dos directory format.
set CYGWIN=nodosfilewarning
C:\cygwin\bin\bash --login -i %CD%\./compile.sh
pause
Run Code Online (Sandbox Code Playgroud)
.SH:
#!/bin/bash
#Run this script through compileNative.bat This will compile the native code of this Project
#IF this file is changed under windows use "tr -d '\r' < edited.sh > final.sh " to remove the bad line endings.
#Keep both this and the .bat file in the project root.
# Set this to the base NDKDir
NDKDIR=C:/Android/NDK/
#Get …Run Code Online (Sandbox Code Playgroud) 今天我遇到了一个问题,访问矢量元素减慢了矢量的大小.由于这不是我的代码,我无法发布,所以请耐心等待.我将尝试尽可能详细地描述它.
代码的功能如下:1.数据集类,采用.txt文件,其中包含文件名.这些指向需要加载的标准png图像.这是由一个Image<T>班级完成的.图像被加载Image<unsigned char>并推回到std::Vector.2.完成数据加载后.我可以访问我的数据集中的向量,以便使用它.所以它看起来像这样:
Dataset d;
d.init("filenames_list.txt"); //Loads the images
for(int i=0; i< d.getDatavector().size(); i++){
Image<unsigned char> current = d.getDatavector()[i];
//Do work on current image here.
}
Run Code Online (Sandbox Code Playgroud)
这里getDatavector()将返回一个std::Vector<Image<unsigned char> >.对于宽度,高度和通道数,图像保持三个整数,并且还包含指向交错数据的Boost共享指针.
对于小型测试,我有一个包含大约150个图像的文件列表.使用此程序运行程序工作正常,速度测量告诉我
Image<unsigned char> current = d.getDatavector()[i];
大约需要10毫秒才能完成.但是,如果我想处理1500张图像的完整数据集,则上述行需要大约500毫秒才能完成.我试图做很多不同的事来解决它,但我受到代码的一般结构和内存的限制.因为如果我做以下事情:
const std::Vector<Image<unsigned char> > data = d.getDatavector();
在循环之前,它运行得非常快,但我很快就会耗尽内存.
我知道我的问题描述有点模糊,我不希望得到确切的解决方案,但我希望有一些关于在哪里寻找的提示.我搜索了类似的问题,但人们似乎只关心向量与数组的一般速度.我的问题是,速度会随着矢量的长度而降低!如果有人看到过这种问题,我们非常欢迎任何建议!
到目前为止,我尝试使用std :: vector :: iterator或使用(d.getDatavector().data())作为指针来访问内容.似乎没有什么能提高它的速度.
android-ndk ×3
android ×2
opencv ×2
performance ×2
batch-file ×1
c ×1
c++ ×1
eclipse ×1
opengl-es ×1
shell ×1
stdvector ×1
stl ×1
swig ×1