版本:AndroID 3.5.2SDK 28.0.2opencv 3.4.10ndk r16b
1、安装AndroID Studio 以及 OpenCV1.1 下载安装包:(1)去Android Studio中文社区下载androID-studio-IDe-191.5977832-windows.exe
(2)去OpenCV官网,下载OpenCV-3.4.10-androID-sdk
(3)去NDK官网下载 androID-ndk-r16b-windows-x86_64
双击androID-studio-IDe-191.5977832-windows.exe
开始安装,过程如下:
把两个都勾上,下一步:
改成自己的文件夹,注意路径中务必不能有空格:
直接下一步:
继续下一步:
点击finish,同时开启AS:
启动界面如下:
d出如下报错框,正常,点击Cancel取消该框:
选Custom:
勾上,更改SDK位置,点next:
点finish:
出现如下界面,点击Configure按钮:
选择SDK Manager:
我的电脑内存8G,所选的默认虚拟机内存大小2G:
点击finish:
下载好了之后,点finish:
1.3 第一次新建工程项目
在下面这个界面里,点击第一项 Start a new AndroID Studio project
:
滑到最后,选择原生C++模板:
改名后,选择java模板,next:
修改为C++14,finish:
这里,正在下载gradle,如果网不好,可以叉掉整个界面,等会用离线方式下载gradle。
在gradle官网下载gradle-5.4.1-all.zip
:
下载好后,把压缩包文件
gradle-5.4.1-all.zip
拷贝到文件夹,删除文件夹中原来的两个半成品文件,最后如图所示:打开AS:
将左侧AndroID模式切换成Project模式,点击右侧小象按钮,开始解压…
此时可以做其他工作:
file—>Settings—>Appearance & Behavior—>System Settings—>取消勾选Reopen last project on startup(省的每次都打开最近项目,勾掉后,每次打开启动页面,进入选择页面而非项目页面)
做好了其他工作回来发现报错了:ERROR: Failed to install the following AndroID SDK packages as some licences have not been accepted.
解决办法:进入SDK的目录,在目录的地址栏D:\AndroID2\SDK\tools\bin
输入cmd,回车打开命令行终端,这里面有个windows批处理文件sdkmanager.bat
。运行下面的命令,然后就有一大堆的 license 等着你输入yes,统计了一下,总共要输入8个y:
sdkmanager --licenses
关闭命令行终端窗口,重新点击AS中的右上角小象图标。开始重新解压缩,解压缩完毕后是下面这样:
继续报错:ERROR: CMake ‘3.10.2’ was not found in PATH or by cmake.dir property.
报错原因是没有安装cmake工具,在如下位置安装即可:(file—>Settings)
等着下载结束,安装完成后,点finish。此时重新点小象按钮重新解压,还是会出错。关掉整个AS,重新打开项目,点击小象按钮,一切正常:
1.4 修改项目的NDK版本
官方给的版本过高r20,需要调整为r16
file—>Project Structure—>SDK Location—> 选择本地的NDK,然后点击Apply和OK。又开始一轮编译,等完成。
参考牛人链接:OpenCV On Android最佳环境配置指南(Android Studio篇)
2.1 CMake文件cmake_minimum_required(VERSION 3.4.1)# ##################### OpenCV 环境 #############################设置OpenCV-androID-sdk路径set( OpenCV_DIR D:/AndroIDData/opencv-3.4.10-androID-sdk/OpenCV-androID-sdk/sdk/native/jni )find_package(OpenCV required )if(OpenCV_FOUND) include_directorIEs(${OpenCV_INCLUDE_Dirs}) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " librarIEs: ${OpenCV_liBS}") message(STATUS " include path: ${OpenCV_INCLUDE_Dirs}")else(OpenCV_FOUND) message(FATAL_ERROR "OpenCV library not found")endif(OpenCV_FOUND)# ###################### 项目原生模块 ###########################add_library( native-lib SHARED native-lib.cpp)target_link_librarIEs( native-lib ${OpenCV_liBS} log jnigraphics)
路径的修改参考的是本地OpenCV包中的以下位置:
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent"> <ImageVIEw androID:ID="@+ID/imageVIEw" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" /> <linearLayout androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_alignParentBottom="true" androID:orIEntation="horizontal"> <button androID:ID="@+ID/show" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_weight="1" androID:text="show" /> <button androID:ID="@+ID/process" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_weight="1" androID:text="process" /> </linearLayout></relativeLayout>
2.3 MainActivity.javapackage com.example.opencvdemo;import androIDx.appcompat.app.AppCompatActivity;import androID.graphics.Bitmap;import androID.graphics.BitmapFactory;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.Widget.ImageVIEw;import androID.Widget.TextVIEw;public class MainActivity extends AppCompatActivity implements VIEw.OnClickListener { private ImageVIEw imageVIEw; static {//加载so库 System.loadlibrary("native-lib"); } @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); imageVIEw = findVIEwByID(R.ID.imageVIEw); findVIEwByID(R.ID.show).setonClickListener(this); findVIEwByID(R.ID.process).setonClickListener(this); } @OverrIDe public voID onClick(VIEw v) { if (v.getID() == R.ID.show) { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat); imageVIEw.setimageBitmap(bitmap); } else { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.cat); getEdge(bitmap); imageVIEw.setimageBitmap(bitmap); } } //获得Canny边缘 native voID getEdge(Object bitmap);}
这几个文件的修改顺序如下,其中,JAVA中,cat是张图片。
应用层写好了,现在开始原生层 *** 作:
2.4.1 生成头文件打开AndroID Studio下方Terminal
栏,输入cd app\src\main\java
(所有应用都一样,进入java文件夹即可),回车。然后输入javah -enCoding UTF-8 包名.类名
,这里输入的是
javah -enCoding UTF-8 com.example.opencv.MainActivity
回车后,将在app\src\main\java
目录下生成一个头文件,如下图所示,之后将该头文件移动到app\src\main\cpp
目录下。
修改native-lib.cpp
内容,最终结果如下面代码所示:
#include "com_example_opencvdemo_MainActivity.h"#include <androID/bitmap.h>#include <opencv2/opencv.hpp>using namespace cv;extern "C" JNIEXPORT voIDJNICALL Java_com_demo_opencv_NativeActivity_getEdge (jnienv *env, jobject obj, jobject bitmap) { AndroIDBitmAPInfo info; voID *pixels; CV_Assert(AndroIDBitmap_getInfo(env, bitmap, &info) >= 0); CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565); CV_Assert(AndroIDBitmap_lockPixels(env, bitmap, &pixels) >= 0); CV_Assert(pixels); if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) { Mat temp(info.height, info.wIDth, CV_8UC4, pixels); Mat gray; cvtcolor(temp, gray, color_RGBA2GRAY); Canny(gray, gray, 45, 75); cvtcolor(gray, temp, color_GRAY2RGBA); } else { Mat temp(info.height, info.wIDth, CV_8UC2, pixels); Mat gray; cvtcolor(temp, gray, color_RGB2GRAY); Canny(gray, gray, 45, 75); cvtcolor(gray, temp, color_GRAY2RGB); } AndroIDBitmap_unlockPixels(env, bitmap);}
2.4.3 build.gradle修改app
下的build.gradle
,部分内容需要修改成:
... externalNativeBuild { cmake { cppFlags "-std=c++14 -frtti -fexceptions" arguments "-DANDROID_STL=gnustl_shared" } }...
完整build.gradle如下:
apply plugin: 'com.androID.application'androID { compileSdkVersion 29 buildToolsversion "29.0.3" defaultConfig { applicationID "com.example.opencvdemo" minSdkVersion 15 targetSdkVersion 29 versionCode 1 versionname "1.0" testInstrumentationRunner "androIDx.test.runner.AndroIDJUnitRunner" externalNativeBuild { cmake { cppFlags "-std=c++14 -frtti -fexceptions" arguments "-DANDROID_STL=gnustl_shared" } } } buildTypes { release { MinifyEnabled false proguardfiles getDefaultProguardfile('proguard-androID-optimize.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.10.2" } }}dependencIEs { implementation filetree(dir: 'libs', include: ['*.jar']) implementation 'androIDx.appcompat:appcompat:1.0.2' implementation 'androIDx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androIDTestImplementation 'androIDx.test.ext:junit:1.1.0' androIDTestImplementation 'androIDx.test.espresso:espresso-core:3.1.1'}
点击右上角sync Now
,重新编译一下。
编译完成后,为了增加兼容性,在已有的CMakeLists.txt
文件中,添加如下语句,增加兼容性:
set(CMAKE_SHARED_linkER_FLAGS "${CMAKE_SHARED_linkER_FLAGS} -wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a") #增加兼容性
添加完后的完整CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.4.1)# ##################### OpenCV 环境 #############################设置OpenCV-androID-sdk路径set( OpenCV_DIR D:/AndroIDData/opencv-3.4.10-androID-sdk/OpenCV-androID-sdk/sdk/native/jni )find_package(OpenCV required )if(OpenCV_FOUND) include_directorIEs(${OpenCV_INCLUDE_Dirs}) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " librarIEs: ${OpenCV_liBS}") message(STATUS " include path: ${OpenCV_INCLUDE_Dirs}")else(OpenCV_FOUND) message(FATAL_ERROR "OpenCV library not found")endif(OpenCV_FOUND)set(CMAKE_SHARED_linkER_FLAGS "${CMAKE_SHARED_linkER_FLAGS} -wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a") #增加兼容性# ###################### 项目原生模块 ###########################add_library( native-lib SHARED native-lib.cpp)target_link_librarIEs( native-lib ${OpenCV_liBS} log jnigraphics)
有的时候,做的多了未必是好事,比如这里就是,加上这句看似能增加兼容性的代码,反而各种报错,我现在能力不足以解决这个问题,先放在这,后面在解决。
2.4.5 安装更多组件Tools—>SDK Manager—>Appearance & Behavior–>System Settings—>AndroID SDK—>SDK Tools—>在右下角勾上Show Package Details—>选中:
AndroID SDK 28.0.2NDK(SIDe By SIDe)16.1.4479499CMake3.6.4111459
点击Apply,安装完成:
运行程序,安装在真机上:点击show,出现喵喵小可爱!
点击处理按钮,出现喵喵小可爱的轮廓:
至此,完成在AndroID Studio中配置OpenCV的整个过程,置于后续的使用和美化,需要进一步的学习。
十分有用的b站教程:
第一集
第二集
其余参考文件(都没能帮上啥忙):
android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
opencv在android平台下的开发【1】-android studio集成opencv-sdk
Android 接入 OpenCV库的三种方式
以上是内存溢出为你收集整理的【Android+OpenCV】Android Studio的安装全过程+在Android Studio中配置OpenCV全部内容,希望文章能够帮你解决【Android+OpenCV】Android Studio的安装全过程+在Android Studio中配置OpenCV所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)