dlib 18 android编译dlib库,运行matrix_ex demo
来源:互联网 发布:淘宝下拉菜单小图标 编辑:程序博客网 时间:2024/05/29 04:45
01 android studio 创建支持c++项目
打开android studio后,构建一个支持c++的项目,具体步骤如下:
01.01 Start a new Android Studio project
01.02 Configure your new project
Application name:dlib-android-buildCompany domain:soft.example.com勾选 Include C++ supportProject location:D:\git\dlib\build\dlib-android-build
01.03 Target Android Devices选择默认项
01.04 Add an Activity to Mobile 选择Basic Activity
01.05 Customize the Activity选择默认值
01.06 Customize C++ Support
C++ Standard 选择C++11勾选 Exceptions Support(-fexceptions)勾选 Runtime Type Information Support (-frtti)
02 导入dlib库,配置android属性
02.01 导入dlib库源码
把下载好的dlib目录中的dlib子目录,拷贝到D:\git\dlib\build\dlib-android-build\app\src\main\cpp中。
02.02 修改CMakeLists.txt配置项
修改D:\git\dlib\build\dlib-android-build\app\CMakeLists.txt配置项。
在add_library和find_library之间加入一句include(src/main/cpp/dlib/cmake)
在target_link_libraries中添加dlib
02.03 配置build.gradle
配置D:\git\dlib\build\dlib-android-build\app\build.gradle
在build.gradle的externalNativeBuild的cmake中添加arguments "-DANDROID_STL=c++_shared"
03 导入C++demo中的 matrix_ex
创建这个android项目,默认已经有native-lib.cpp文件,内容如下:
#include <jni.h>#include <string>extern "C"JNIEXPORT jstring JNICALLJava_com_example_soft_dlib_1android_1build_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}
dlib的github下载的源代码中,有dlib\examples\matrix_ex.cpp。因为stringFromJNI返回值是string类型,把matrix_ex 内容稍作修改,把默认输出改为字符串。拷贝到native-lib.cpp,最后native-lib.cpp的内容如下:
#include <jni.h>#include <string>#include <iostream>#include <dlib/matrix.h>#include <sstream>using namespace dlib;using namespace std;// ----------------------------------------------------------------------------------------string matrix_ex(){ stringstream ssout; // Let's begin this example by using the library to solve a simple // linear system. // // We will find the value of x such that y = M*x where // // 3.5 // y = 1.2 // 7.8 // // and M is // // 54.2 7.4 12.1 // M = 1 2 3 // 5.9 0.05 1 // First let's declare these 3 matrices. // This declares a matrix that contains doubles and has 3 rows and 1 column. // Moreover, it's size is a compile time constant since we put it inside the <>. matrix<double,3,1> y; // Make a 3 by 3 matrix of doubles for the M matrix. In this case, M is // sized at runtime and can therefore be resized later by calling M.set_size(). matrix<double> M(3,3); // You may be wondering why someone would want to specify the size of a // matrix at compile time when you don't have to. The reason is two fold. // First, there is often a substantial performance improvement, especially // for small matrices, because it enables a number of optimizations that // otherwise would be impossible. Second, the dlib::matrix object checks // these compile time sizes to ensure that the matrices are being used // correctly. For example, if you attempt to compile the expression y*y you // will get a compiler error since that is not a legal matrix operation (the // matrix dimensions don't make sense as a matrix multiplication). So if // you know the size of a matrix at compile time then it is always a good // idea to let the compiler know about it. // Now we need to initialize the y and M matrices and we can do so like this: M = 54.2, 7.4, 12.1, 1, 2, 3, 5.9, 0.05, 1; y = 3.5, 1.2, 7.8; // The solution to y = M*x can be obtained by multiplying the inverse of M // with y. As an aside, you should *NEVER* use the auto keyword to capture // the output from a matrix expression. So don't do this: auto x = inv(M)*y; // To understand why, read the matrix_expressions_ex.cpp example program. matrix<double> x = inv(M)*y; cout << "x: \n" << x << endl; ssout << "x: \n" << x << endl; // We can check that it really worked by plugging x back into the original equation // and subtracting y to see if we get a column vector with values all very close // to zero (Which is what happens. Also, the values may not be exactly zero because // there may be some numerical error and round off). cout << "M*x - y: \n" << M*x - y << endl; ssout << "M*x - y: \n" << M*x - y << endl; // Also note that we can create run-time sized column or row vectors like so matrix<double,0,1> runtime_sized_column_vector; matrix<double,1,0> runtime_sized_row_vector; // and then they are sized by saying runtime_sized_column_vector.set_size(3); // Similarly, the x matrix can be resized by calling set_size(num rows, num columns). For example x.set_size(3,4); // x now has 3 rows and 4 columns. // The elements of a matrix are accessed using the () operator like so: cout << M(0,1) << endl; ssout << M(0,1) << endl; // The above expression prints out the value 7.4. That is, the value of // the element at row 0 and column 1. // If we have a matrix that is a row or column vector. That is, it contains either // a single row or a single column then we know that any access is always either // to row 0 or column 0 so we can omit that 0 and use the following syntax. cout << y(1) << endl; ssout << y(1) << endl; // The above expression prints out the value 1.2 // Let's compute the sum of elements in the M matrix. double M_sum = 0; // loop over all the rows for (long r = 0; r < M.nr(); ++r) { // loop over all the columns for (long c = 0; c < M.nc(); ++c) { M_sum += M(r,c); } } cout << "sum of all elements in M is " << M_sum << endl; ssout << "sum of all elements in M is " << M_sum << endl; // The above code is just to show you how to loop over the elements of a matrix. An // easier way to find this sum is to do the following: cout << "sum of all elements in M is " << sum(M) << endl; ssout << "sum of all elements in M is " << sum(M) << endl; // Note that you can always print a matrix to an output stream by saying: cout << M << endl; ssout << M << endl; // which will print: // 54.2 7.4 12.1 // 1 2 3 // 5.9 0.05 1 // However, if you want to print using comma separators instead of spaces you can say: cout << csv << M << endl; ssout << csv << M << endl; // and you will instead get this as output: // 54.2, 7.4, 12.1 // 1, 2, 3 // 5.9, 0.05, 1 // Conversely, you can also read in a matrix that uses either space, tab, or comma // separated values by uncommenting the following: // cin >> M; // ----------------------------- Comparison with MATLAB ------------------------------ // Here I list a set of Matlab commands and their equivalent expressions using the dlib // matrix. Note that there are a lot more functions defined for the dlib::matrix. See // the HTML documentation for a full listing. matrix<double> A, B, C, D, E; matrix<int> Aint; matrix<long> Blong; // MATLAB: A = eye(3) A = identity_matrix<double>(3); // MATLAB: B = ones(3,4) B = ones_matrix<double>(3,4); // MATLAB: B = rand(3,4) B = randm(3,4); // MATLAB: C = 1.4*A C = 1.4*A; // MATLAB: D = A.*C D = pointwise_multiply(A,C); // MATLAB: E = A * B E = A*B; // MATLAB: E = A + B E = A + C; // MATLAB: E = A + 5 E = A + 5; // MATLAB: E = E' E = trans(E); // Note that if you want a conjugate transpose then you need to say conj(trans(E)) // MATLAB: E = B' * B E = trans(B)*B; double var; // MATLAB: var = A(1,2) var = A(0,1); // dlib::matrix is 0 indexed rather than starting at 1 like Matlab. // MATLAB: C = round(C) C = round(C); // MATLAB: C = floor(C) C = floor(C); // MATLAB: C = ceil(C) C = ceil(C); // MATLAB: C = diag(B) C = diag(B); // MATLAB: B = cast(A, "int32") Aint = matrix_cast<int>(A); // MATLAB: A = B(1,:) A = rowm(B,0); // MATLAB: A = B([1:2],:) A = rowm(B,range(0,1)); // MATLAB: A = B(:,1) A = colm(B,0); // MATLAB: A = [1:5] Blong = range(1,5); // MATLAB: A = [1:2:5] Blong = range(1,2,5); // MATLAB: A = B([1:3], [1:2]) A = subm(B, range(0,2), range(0,1)); // or equivalently A = subm(B, rectangle(0,0,1,2)); // MATLAB: A = B([1:3], [1:2:4]) A = subm(B, range(0,2), range(0,2,3)); // MATLAB: B(:,:) = 5 B = 5; // or equivalently set_all_elements(B,5); // MATLAB: B([1:2],[1,2]) = 7 set_subm(B,range(0,1), range(0,1)) = 7; // MATLAB: B([1:3],[2:3]) = A set_subm(B,range(0,2), range(1,2)) = A; // MATLAB: B(:,1) = 4 set_colm(B,0) = 4; // MATLAB: B(:,[1:2]) = 4 set_colm(B,range(0,1)) = 4; // MATLAB: B(:,1) = B(:,2) set_colm(B,0) = colm(B,1); // MATLAB: B(1,:) = 4 set_rowm(B,0) = 4; // MATLAB: B(1,:) = B(2,:) set_rowm(B,0) = rowm(B,1); // MATLAB: var = det(E' * E) var = det(trans(E)*E); // MATLAB: C = pinv(E) C = pinv(E); // MATLAB: C = inv(E) C = inv(E); // MATLAB: [A,B,C] = svd(E) svd(E,A,B,C); // MATLAB: A = chol(E,'lower') A = chol(E); // MATLAB: var = min(min(A)) var = min(A); return ssout.str();}extern "C"JNIEXPORT jstring JNICALLJava_com_example_soft_dlib_1android_1build_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { //std::string hello = "Hello from C++"; std::string hello = matrix_ex(); return env->NewStringUTF(hello.c_str());}
04 编译,调试
04.01 编译
选择Build==>Make Project菜单,或者Ctrl+F9
键编译。
04.02 调试
选择Run==>Debug ‘app’菜单,或者Shift+F9
键调试。
04.03 运行结果
阅读全文
0 0
- dlib 18 android编译dlib库,运行matrix_ex demo
- dlib-android编译
- 【dlib】Dlib编译安装
- dlib 11 dlib自带demo ResNet
- ubuntu16.04编译dlib for Android
- dlib 编译安装(包含android版本)
- dlib 01 dlib vs2015 编译 win10
- windows编译mxnet,boost,dlib库
- Dlib机器学习库编译以及安装
- dlib 人脸识别库编译
- windows下编译dlib
- dlib的编译
- Dlib编译与搭建
- Dlib的编译
- dlib 12 dlib自带demo DNN基础demo
- 移植dlib到android
- 移植dlib到android
- 在Python27中运行pip install dlib装载库dlib所引起的问题解决
- 在elasticsearch 5.X下配置单机多节点
- js中DOM, DOCUMENT, BOM, WINDOW 区别
- luoguP2066 机器分配 题解
- 常用linux命令实战
- C#实现本地文本日志
- dlib 18 android编译dlib库,运行matrix_ex demo
- C++关于指针、const、引用三者的体会
- php运行原理
- vue.js阻止事件冒泡和默认事件
- Selenium WebDriver API常用方法解释
- log4j的使用
- ES6学习笔记:字符串、正则、数值、函数和数组的扩展
- 32位程序如何使用ADO访问64位Oracle数据库[转]
- Activity的启动流程源码分析