下面图片脸上的字是什么意思图片???

SLAM:使用G2O-ORB-SLAM
SLAM:使用G2O-ORB-SLAM
&&&&&&&& 没有新雪,看看自己所做的事情,有没有前人做过。果然,EKF_SLAM的版本出现了Android版本的OpenEKFMonoSLAM, G2O-ORB SLAM也出现了VS2012版本。...
参考连接:ROS-Indigo版在Ubuntu上的安装
第一步: 软件源配置
1 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros)
sudo sh -c 'echo "deb
http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" & /etc/apt/sources.lis...
在图像分析处理领域,图像的逻辑描述形式是计算机处理图像的基础,逻辑形式在 逻辑层面 描述出:图像到底是什么?
1.几何空间:
&&&&&&&& 在几何数学中,空间作为集合的存在形式,根据不同的约束可以划分为不同的空间。具有拓扑结构的集合构成拓扑空间,局部可度量且正交的拓扑空间为流形,全部可度量的(只用一个坐标系即可标定)且元素集合为实数域上的线性空间为欧式空间。...
原文链接:http://blog.csdn.net/goodshot/article/details/8611178...
使用标记点地图构建SLAM的方法,有一种EKFmonocularSLAM的存在,详细方法和代码见官方网站:http://www.openslam.org/
&&&&&&& EKFSLAM使用EKF方法,所使用的方法参考两篇论文:
Long Description
&&&&& This code contains a complete EKF SLAM system from a...
SLAM系统的研究点介绍
&& & & & 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要。然后,我们再就各个小问题,讲讲经典的算法与分类。
1.  前言
& & & & 在《SLAM for Dummy》中,有一句话说的好:”SLAM并不是一种算法,而是一个概念。(SLAM is more like a concept than a sin...
二、根据EKF预测状态,更新特征信息!
//2. EKF prediction (state and measurement prediction)
o_EKfPreor.ekf_prediction(filter, features_info );
使用类:...
官方链接:http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_fast/py_fast.html#fast-algorithm-for-corner-detection
&&&&&& 原文链接:http://blog.csdn.net/candycat1992/article/details/...
在调试JNI程序时,所有的Shell都已经加载完成,而唯一真正核心的cv::SolvePnP却不能在JNI里面获得通行证,经过反复测试都不能运行,因此只能忍痛舍弃,自行编写一个具有相似功能的函数对其进行替代。
&&&&&&&&元函数是这样的:
void rec3D::reconstruct3D(const vector& image_points, Mat& rvecs, Mat& tvecs...
原文链接:/mythma/archive//vtk-6-new-null.html
&&&&&&& 在使用VTK6.0时候,会遇到X::New()返回为null的情况,需要全局初始化一下:
&#define&vtkRenderingCore_AUTOINIT&4(vtkInteractionStyle,vtkRende...
VTK作为医学显示库,得到较多使用。作为较为上层的设计,对OpenGL进行了封装,并且有Windows、Linux、安卓等开发版本,可移植性较强。...
VS2013社区版对个人开发者免费,终于可以不用该死的盗版了。Win10科技预览版X64系统开发版本下载,与Vs2013可以完美融合。
&&&&&&& PCL的源代码版本已经进化到1.8.0,不知道增加了多少新特性,还是拿来编译一下试一试。对于VS2012无法编译PCL1.7.2的问题,原因是OpenNI不支持1600以上数字的编译器,即最高支持到VC10。
&&&&&& 以下是注意事...
一:安装PCL
&&&&&&& 依据官网介绍:...
中国人真是太不知道分享了,
启发性链接:http://www.pcl-users.org/QT-PCLVisualizer-mostly-working-td3285187.html...
原文链接:http://blog.csdn.net/ikerpeng/article/details/
有少量修改,如有疑问,请访问原作者...
一:使用GPU进行点云分割,理论上可以极大地加快分割速度;
于是对PCL1.7.1进行了编译,回到32位...
过程:找完整个工程文件夹:
APS为资源文件;...
原文链接:/blog-.html
在互联网、计算机辅助设计(CAD)、分子生物学(3D蛋白质模型)、计算机图形学、医药以及考古学等不同领域中,大型的三维(3D)数据库变得越来越普遍。近期在激光扫描技术的进展使我们可以方便地构造一个物体精确的3D几何模型。这方面的应用包括对文化遗产的重建,例如斯坦福大学的数字米可朗...
萨维模型特征表示方法:
&&&&&& 计算机中表示三维形体的模型,按照几何特点进行分类,大体上可以分为三种:线框模型、表面模型和实体模型。如果按照表示物体的方法进行分类,实体模型基本上可以分为分解表示、构造表示CSG(Constructive Solid Geometry)和边界表示BREP(Boundary Representation)三大类。
& 常用的分解表示法有:四叉树、八叉...
ACM算法分类:/algorithm/1.html
(1):拟合一个平面:
& 空间平面方程的一般表达式为:
&& 对于空间中n个点(n3):
根据最小二乘法则用这n个点拟合上述平面方程,则要使下式的值最小:
发表评论:
馆藏&21260
TA的最新馆藏Efficacy of plasma exchange and immunoadsorption in systemic lupus erythematosus and... - Abstract - Europe PMC
Europe PMC requires Javascript to function effectively.
Either your web browser doesn't support Javascript or it is currently turned off. In the latter case, please
turn on Javascript support in your web browser and reload this page.
Search worldwide, life-sciences literature
Andreas Kronbichler
Vasculitis and Lupus Clinic, Addenbrooke's Hospital, Hills Road, CB2 0QQ Cambridge, United K Department of Internal Medicine IV (Nephrology and Hypertension), Medical University of Innsbruck, Anichstrasse 35, 6020 Innsbruck, Austria. Electronic address: andreas.kronbichler@i-med.ac.at.
Biljana Brezina
Vasculitis and Lupus Clinic, Addenbrooke's Hospital, Hills Road, CB2 0QQ Cambridge, United Kingdom.
Luis F Quintana
Vasculitis and Lupus Clinic, Addenbrooke's Hospital, Hills Road, CB2 0QQ Cambridge, United K Servicio de Nefrología y Trasplante Renal, Hospital Clínic, Institut d'Investigacions Biomèdiques August Pi I Sunyer (IDIBAPS), Universidad de Barcelona, Barcelona, Spain.
David R W Jayne
Vasculitis and Lupus Clinic, Addenbrooke's Hospital, Hills Road, CB2 0QQ Cambridge, United Kingdom.
Vasculitis and Lupus Clinic, Addenbrooke's Hospital, Hills Road, CB2 0QQ Cambridge, United K Department of Internal Medicine IV (Nephrology and Hypertension), Medical University of Innsbruck, Anichstrasse 35, 6020 Innsbruck, Austria. Electronic address: andreas.kronbichler@i-med.ac.at.
Journal Article, Review
10.1016/j.autrev.
Extracorporeal treatments have been used since the 1970s in the management of systemic lupus erythematosus (SLE). A randomised controlled trial comparing the efficacy of standard of care (SOC) combined with plasma exchange against SOC alone in patients with lupus nephritis revealed no difference in terms of renal outcome. Subsequently, initial expectations have been dampened and further experience with plasma exchange is mainly limited to observational studies and single case reports. Beneficial effects have been reported in patients with refractory disease course or in pregnancy with prior complications due to SLE and antiphospholipid syndrome. A more specific form of extracorporeal treatment, immunoadsorption (IAS), has emerged as a valuable option in the treatment of SLE. In line with the plasma exchange experience, IAS seems to have beneficial effects in patients with refractory disease, contraindications to standard immunosuppression or during pregnancy. The mechanism IAS relates to autoantibody removal but for plasma exchange removal of activated complement components, coagulation factors, cytokines and microparticles may also be relevant. Both treatment forms have good safety profiles although reactions to blood product replacement in plasma exchange and procedure related complications such as bleeding or catheter-related infections have occurred. There is a need to more clearly define the clinical utility of plasma exchange and IAS in refractory lupus and APS subgroups.
)- subscription required
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
Show all items
CitePeer Related ArticlesORB_SLAM2在Android上的移植过程
一直没时间写博客,最近抽时间写了些关于在ORB_SLAM2在Android上的移植过程,也算是点经验吧。
写完后一个手贱点了个链接,瞬间1 3工作量没了,深夜弄完也是醉了。。。
一直没时间写博客,最近抽时间写了些关于在ORB_SLAM2在上的移植过程,也算是点经验吧。
写完后一个手贱点了个链接,瞬间1/3工作量没了,深夜弄完也是醉了。。。
这篇博客讲述如何在Android平台上移植ORB_SLAM2,讲述过程包括基本的Android环境的搭建和NDK环境的配置,Android下移植的基本概念,ORB的具体移植步骤等。
Android平台搭建和NDK环境配置
:windows7 32bit
IDE:Eclipse Luna
环境工具: ADT24.0.2、Android SDK、NDK r10b
PS:不推荐使用集成了ADT环境的Eclipse版本,因为在NDK编译的时候可能会报各种莫名其妙的错。同时默认JDK环境已经装好。
下载地址:百度网盘(包括ADT、NDK。SDK太大,请自行下载)
安装Eclipse,注意区分Eclipse是32位还是64位的,下载对应版本安装即可。下载地址在前面给出。 下载ADT,不需要解压。打开安装好的Eclipse,在菜单栏点击Help&&Install new software,弹出如下界面: vcdBZGQss/bP1qO6PGJyIC8+DQo8aW1nIGFsdD0="这里写图片描述" src="/uploadfile/Collfiles/27.png" title="\" />
第一栏随便填个名字,例如ADT,第二栏点击Archive,选择你下载的ADT压缩包,确定。在出现的列表中,全部选中,并取消勾选Contact all update sites….。点击next,则开始了ADT的安装,大概需要10分钟。可能还需要accept 协议什么的,这里略过不表。安装完成后提示重启Eclipse即安装成功。 下载Android SDK,并解压(路径不要有中文)。在Eclipse中选择Window&&preferences。在左边栏选中Android,在SDK Location中填入你解压文件夹的根目录,点击apply和OK,则Android环境配置基本完成。这是你的菜单栏应该有了这两项
更新SDK。点击Window&&Android SDK manager,弹出如下界面:
可能由于墙的问题会弹出列表无法加载,需要用代理或镜像,当然如果你有梯子也可以。这里介绍些镜像吧:
g.cn:80,在SDK Manager 中点击tools&&options:
按照上图设置即可。其他的镜像源还有北京化工大学镜像站,请自行谷狗。设置好后点击Packages&&reload即可得到对应的镜像。有默认选中的一些选项,一般选中一个sdk tools,一份sdk build-platform-tools,一个sdk build tools,然后一个Android版本即可(一般4.0以上)。选中后点击Install就会从镜像中下载对应的SDK,这个过程有长有短,视网络而定。
当上述步骤都完成后,Android开发环境就配置好了。 NDK环境配置:从上面给的百度网盘中下载ndk,解压(规则同sdk),打开Eclipse,点击Window&&Preferences,选择Android&&NDK,在右边界面中填入NDK Location即可。
Android移植基础
NDK是集成的Android中调用C++代码的工具包,核心是JNI( Native Interface)技术,具体这里略过不表。只说说NDK开发的基本步骤:
1. 编写Java代码:在Java中定义一个类,比如说叫NDKHelper吧,里面定义几个java的方法,只需要声明,不需要实现,如下所示:
public class NDKHelper {
//NDK示例方法1
public static native void ndkOne(int a,long b);
//NDK示例方法2
public static native int ndkTwo(String a,String b);
native标识符表示该函数将会利用C++代码完成实现。
接下来在工程上右键,Android Tools&&Add native support,出现如下界面:
名字就是最后我们要生成的库的名字,随便填,可修改。点击确定就会给你的工程添加C++编译支持,菜单栏会多了个小锤子:
这个是用来编译C++的快捷键。在你的工程目录下会新建jni目录和obj目录,其中jni目录用来存放和C++代码有关的东西,obj则存放C++进行编译时产生的中间件,最后生成的library会写入到libs文件夹下。
在jni文件夹中生成了如下文件,一个.cpp,一个Android.mk,其中.cpp是自动生成的,是用来编写C++部分的,而Android.mk类似C++里面的CMakeList,用来指定需要编译的文件和编译生成的模块名,一个最简单的Android.mk文件如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= NDKTest
LOCAL_SRC_FILES := NDKTest.cpp
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH :=$(call my-dir)表示包含当前目录。
include $(CLEAR_VARS)表示清除全部非系统变量和部分系统变量;
LOCAL_MODULE := NDKTest 表示当前生成的模块名,最终会生成libNDKTest.so文件
LOCAL_SRC_FILES := NDKTest.cpp 表示当前需要编译的cpp文件;
include $(BUILD_SHARED_LIBRARY) 表示生成共享库,需要生成静态库请修改成BUILD_STATIC_LIBRARY。
其他基础命令:
LOCAL_C_INCLUDES:= 表示添加头文件进入编译环境
LOCAL_LDLIBS:= 表示添加系统静态库
LOCAL_SHARED_LIBRARIES:= 表示添加共享库
其他命令请自行查看API文档。
这里指定了进行编译时的各项条件,如果需要指定编译器版本和编译目标平台等信息,则需要在jni目录下新建Application.mk文件,基本语句如下:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
NDK_TOOLCHAIN_VERSION := 4.8
APP_ABI :=armeabi-v7a
APP_STL :=表示使用stl库,APP_CPPFLAGS表示一些CPP编译参数,NDK_TOOLCHAIN_VERSION 表示NDK使用的编译器版本,APP_ABI表示编译的目标平台,可以指定多个平台,平台之间用空格隔开,或者指定all则为全平台编译(armeabi,armeabi-v7a,mips,x86)。其他命令请自行查看API。
接下来编写对应的C++文件。
打开eclipse,点击Project&&build Project(若build automatically已勾选则会自动编译)打开命令行,cd到你的工程文件夹下的bin&&classes文件夹下,输入如下命令:
javah com.example.ndktest.NDKHelper
回车,则在你的classes文件夹下会生成对应的头文件。这里com.example.ndktest是你的package名字,NDKHelper是你的NDK函数的类名。
生成的头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
/* Header for class com_example_ndktest_NDKHelper */
#ifndef _Included_com_example_ndktest_NDKHelper
#define _Included_com_example_ndktest_NDKHelper
#ifdef __cplusplus
extern "C" {
com_example_ndktest_NDKHelper
* Signature: (IJ)V
JNIEXPORT void JNICALL Java_com_example_ndktest_NDKHelper_ndkOne
(JNIEnv *, jclass, jint, jlong);
com_example_ndktest_NDKHelper
* Signature: (Ljava/lang/SLjava/lang/S)I
JNIEXPORT jint JNICALL Java_com_example_ndktest_NDKHelper_ndkTwo
(JNIEnv *, jclass, jstring, jstring);
#ifdef __cplusplus
其他不用管,我们关注中间的两个函数声明:
JNIEXPORT void JNICALL Java_com_example_ndktest_NDKHelper_ndkOne(JNIEnv *, jclass, jint, jlong);
这个函数就是NDKHelper类中ndkOne函数对应的C++版本,其中JNIEXPORT和JNICALL是固定字段,void是函数返回值,函数名由Java字段+包名+类名+函数名组成,参数则多了几个JNI的系统参数JNIEnv 和jclass,其他的就是NDKHelper类中的对应参数,ndk会对该函数进行解析和链接,实现java和C++的对接。
将生成的.h头文件复制到jni目录下,新建对应的cpp文件,将该头文件include进来并对对应函数进行实现,实现过程就视函数功能而定。
这些工作完成后需要修改你的Android.mk文件,将刚刚新建的cpp和h文件包括进来。
然后点击开始那个小锤子或者直接项目右键RunAs&&Android Application,则C++部分会开始编译,编译具体过程可以在Eclipse下方Console窗口看到(如果没有Console窗口则点击Window&&Show Views,选择Console确定即可)。
编译完成后会生成对应的库存放在libs目录下,则你可以开始在Java里面调用刚才定义的ndkOne和ndkTwo函数实现具体的功能。
NDK基础到此为止,更深入的学习可以下载Android官方给的ndk samples.
ORB_SLAM2的移植
不想知道移植过程的童鞋可以直接下载我的Github: 直接按照步骤进行即可。
先看目录:
分为ORB和ThirdParty,其中ThirdParty包括boost clapack DBow2 g2o eigen3。
clapack和eigen来自于一个github的开源库: 这里集成了一些经典的C++库的ndk版本,下载即可使用。g2o和DBoW2则来自于ORB_SLAM2原作者的github地址,Boost是自己编译的lib,这里只介绍clapack和opencv的库配置。
clapack配置
从前述的开源库中将clapack目录拷贝到Thirdparty的对应目录下,clapack中已经包含了对当前目录极其子目录的编译过程,我们在jni目录下的Android.mk文件中加入如下内容:
include $(CLEAR_VARS)
MAINDIR:= $(LOCAL_PATH)
include $(MAINDIR)/Thirdparty/clapack/Android.mk
LOCAL_PATH := $(MAINDIR)
include $(CLEAR_VARS)
MAINDIR:= $(LOCAL_PATH)
LOCAL_MODULE:= lapack
LOCAL_SHORT_COMMANDS := true
LOCAL_STATIC_LIBRARIES := tmglib clapack blas f2c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_PATH := $(MAINDIR)
include $(BUILD_SHARED_LIBRARY)
这里的基本命令之前都已经讲过了,只补充如下几点内容:
LOCAL_SHORT_COMMANDS是为了防止Windows对G++编译命令长度的限制而设置的参数,该参数会拖慢整个编译过程,因此请谨慎使用; LOCAL_EXPORT_C_INCLUDES表示将当前库的头文件EXPORT给系统,让程序代码中能实现&&的调用过程,若不设置这一参数则在cpp文件中可能无法引用该库; LOCAL_STATIC_LIBRARIES := tmglib clapack blas f2c是引用lapack子目录中编译好的一些依赖模块
这里会编译出一个名为lapack的库工程,该工程就可以作为依赖项被ORB所引用。
OpenCV的编译
opencv4Android是opencv官网为了对Android的支持而推出的一个工具集,可以在opencv官网进行下载。其目录结构如下:
其中sdk为核心部分,opencv4Android包含两个版本,一个是opencv为java做的本地化sdk,另一个是opencv利用ndk编译C++版本得到的库工程。我们将opencv4android解压后放置到ORB_SLAM2项目的同级目录下,如下所示:
之后在jni目录下的Android.mk中需要引用到OpenCV的地方加入如下代码:
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include E:/ORB_SLAM2/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
include $(OPENCV_MK_PATH)
这里opencv.mk我给的是绝对地址,其实相对地址也是可以的。上面这段引用会将opencv进行编译并引入到当前的工作模块上来,这里就完成了opencv库的基本调用。如果为了方便还可以将opencv自身单独编译成一个库工程并开放给其他模块引用。
其他libraries的编译过程和上述工程大同小异,其主要步骤可以概括如下:
将当前库复制到jni的特定目录下; 在Android.mk中新建一个模块并对模块进行命名; LOCAL_C_INCLUDE引入库的头文件,LOCAL_SRC_FILES引入库的cpp文件; LOCAL_LDLIBS/LOCAL_SHARED_LIBRARIES/LOCAL_STATIC_LIBRARIES引入依赖库; LOCAL_C_FLAGS设置编译参数;
ORB_SLAM2的编译
这里我们将ORB_SLAM2的源文件也编译为一个library以供调用,其编译过程和上面雷同,需要注意的是,由于pangolin编译有问题,我拆了源文件的pangolin部分并注释了对应的部分代码,同时引入了opengl es 来进行map和pose的绘制。同时,为了完成特征检测图像的回调,我改变了System.cc中TrackMonocular的返回值,将其返回值改成了Mat。
当上述过程完成后,我们的C++编译工作就基本完成了,最后也是最重要的一步是为Java中定义的native方法做C++的实现,在JAVA中,我定义了如下native函数:
* jni中初始化SLAM系统
* @param VOCPath
* @param calibrationPath
public static native void initSystemWithParameters(String VOCPath,String calibrationPath);
* Dataset模式中ORB系统的start函数
* @param curTimeStamp
* @param data
* @param w
* @param h
public static native int[] startCurrentORB(double curTimeStamp,int[] data,int w,int h);
* Camera模式中ORB系统的start
* @param curTimeStamp
* @param addr
* @param w
* @param h
public native static int[] startCurrentORBForCamera(double curTimeStamp,long addr,int w,int h);
* Opengl es 的初始化
public native static void glesInit();
* opengl es绘制更新
public native static void glesRender();
* 防止opengl es窗口resize带来的影响
* @param width
* @param height
public native static void glesResize(int width, int height);
其对应的C++代码为:
orb_slam2_android_nativefunc_OrbNdkHelper
initSystemWithParameters
* Signature: (Ljava/lang/SLjava/lang/S)V
JNIEXPORT void JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_initSystemWithParameters
(JNIEnv * env, jclass cls, jstring VOCPath, jstring calibrationPath) {
const char *calChar = env-&GetStringUTFChars(calibrationPath, JNI_FALSE);
const char *vocChar = env-&GetStringUTFChars(VOCPath, JNI_FALSE);
// use your string
std::string voc_string(vocChar);
std::string cal_string(calChar);
env-&GetJavaVM(&jvm);
jvm-&AttachCurrentThread(&env, NULL);
s=new ORB_SLAM2::System(voc_string,cal_string,ORB_SLAM2::System::MONOCULAR,true);
env-&ReleaseStringUTFChars(calibrationPath, calChar);
env-&ReleaseStringUTFChars(VOCPath, vocChar);
orb_slam2_android_nativefunc_OrbNdkHelper
startCurrentORB
* Signature: (DDD[I)[I
JNIEXPORT jintArray JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_startCurrentORB(
JNIEnv * env, jclass cls, jdouble curTimeStamp, jintArray buf, jint w,
cbuf = env-&GetIntArrayElements(buf, false);
if (cbuf == NULL) {
int size = w *
cv::Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);
cv::Mat ima = s-&TrackMonocular(myimg, curTimeStamp);
jintArray resultArray = env-&NewIntArray(ima.rows * ima.cols);
jint *resultP
resultPtr = env-&GetIntArrayElements(resultArray, false);
for (int i = 0; i & ima. i++)
for (int j = 0; j & ima. j++) {
int R = ima.at & Vec3b & (i, j)[0];
int G = ima.at & Vec3b & (i, j)[1];
int B = ima.at & Vec3b & (i, j)[2];
resultPtr[i * ima.cols + j] = 0xff000000 + (R && 16) + (G && 8) + B;
env-&ReleaseIntArrayElements(resultArray, resultPtr, 0);
env-&ReleaseIntArrayElements(buf, cbuf, 0);
return resultA
orb_slam2_android_nativefunc_OrbNdkHelper
* Signature: ()V
JNIEXPORT void JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_glesInit
(JNIEnv *env, jclass cls) {
// 启用阴影平滑
glShadeModel(GL_SMOOTH);
// 黑色背景
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
// 设置深度缓存
glClearDepthf(1.0f);
// 启用深度测试
glEnable(GL_DEPTH_TEST);
// 所作深度测试的类型
glDepthFunc(GL_LEQUAL);
// 告诉系统对透视进行修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
orb_slam2_android_nativefunc_OrbNdkHelper
glesRender
* Signature: ()V
JNIEXPORT void JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_glesRender
(JNIEnv * env, jclass cls) {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
if(init_end)
s-&drawGL();
orb_slam2_android_nativefunc_OrbNdkHelper
glesResize
* Signature: (II)V
JNIEXPORT void JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_glesResize
(JNIEnv *env, jclass cls, jint width, jint height) {
//图形最终显示到屏幕的区域的位置、长和宽
glViewport (0,0,width,height);
//指定矩阵
glMatrixMode (GL_PROJECTION);
//将当前的矩阵设置为glMatrixMode指定的矩阵
glLoadIdentity ();
glOrthof(-2, 2, -2, 2, -2, 2);
orb_slam2_android_nativefunc_OrbNdkHelper
readShaderFile
* Signature: (Landroid/content/res/AssetM)V
JNIEXPORT jintArray JNICALL Java_orb_slam2_android_nativefunc_OrbNdkHelper_startCurrentORBForCamera
(JNIEnv *env, jclass cls,jdouble timestamp, jlong addr,jint w,jint h) {
const cv::Mat *im = (cv::Mat *)
cv::Mat ima = s-&TrackMonocular(*im, timestamp);
jintArray resultArray = env-&NewIntArray(ima.rows * ima.cols);
jint *resultP
resultPtr = env-&GetIntArrayElements(resultArray, false);
for (int i = 0; i & ima. i++)
for (int j = 0; j & ima. j++) {
int R = ima.at & Vec3b & (i, j)[0];
int G = ima.at & Vec3b & (i, j)[1];
int B = ima.at & Vec3b & (i, j)[2];
resultPtr[i * ima.cols + j] = 0xff000000 + (R && 16) + (G && 8) + B;
env-&ReleaseIntArrayElements(resultArray, resultPtr, 0);
return resultA
这里解释下Dataset和Camera模式下start方法的区别。其实就是图像参数传递的方式不一样。在DataSet模式中,我们是用ImageView显示图片,用Bitmap读取文件中的图片,而非基本类型的数据都是不能被jni接口所接受的因此我们需要利用Bitmap的getPixels方法将其转换成intp[型数据进行传递,在jni中int[]对应的数据类型为jintArray,我们可以在获取到数据后将jintArray转换成Mat进行后续处理;而在Camera模式中我们是利用opencv android sdk中的cvCameraView 来直接进行摄像头的调用和图像的显示。其onCameraFrame(CvCameraViewFrame inputFrame)中的inputfram可以通过rgba()方法转换成Mat类型数据,而Mat类型同样不被jni识别,因此需要利用Mat的getNativeObjAddr方法获取Mat数据的long型指针传递到jni中进行处理。
当上述步骤都完成后,我们会得到最终生成的sdk。Android部分的布局文件和对应activity文件在这里也略过不表。当得到最终生成的apk后,我们如果要测试Camera模式,需要先将opencv4Android中apk文件夹中对应类型的opencv manager安装到手机中并预先打开才能使用,否则会提示找不到opencv的支持库;若只需测试Dataset模式则无需上述步骤。
水平有限,如有错误请不吝指正,谢谢。

我要回帖

更多关于 脸上的字是什么意思图片? 的文章

 

随机推荐