OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

我会带着你远行 2024-03-24 22:21 115阅读 0赞

目录

1.下载OpenCV的SDK

2.创建Android Native C++项目

3.Android项目中导入OpenCV工程

4.导入OpenCV的库文件

5.实现opencv高斯模糊图像处理的demo


要在Android Studio中配置使用OpenCV库的C++方法,需要完成以下步骤:

1.下载OpenCV的SDK

首先,您可以从OpenCV官方网站(Releases - OpenCV )下载适用于Android的最新版本的OpenCV库,然后解压得到 OpenCV-android-sdk文件夹。 f6d6689684044138893b049609bd92a3.png

把解压得到的OpenCV-android-sdk文件夹放到D盘。

95c3634a9c66461da6f169152fe24526.png

2.创建Android Native C++项目

配置开发环境NDK:打开Android Studio,点击“Tools”,转到“SDK Manager”,选择“SDK Tools”选项卡,并选中“NDK”和“CMake”进行安装。

7d54451640154a8db1dd05836e1d119a.png

点击File—>New—>New Project,选择最后一项的Native C++,点击next

d586fd9e00214a68850a5a9ca13e6c1b.png

进入配置页面,默认,点击Next

631dce5f177f4e6aaa09f2f3c90a3629.png

C++标准根据自身需求设置,这里我选择默认工具链,点击Finish

a26b4b535a944a08a9c5d9dcbfd57d9d.png

项目建成后的项目是这样的,我们可以在真机/模拟器上运行测试一下。

3b4cece59666403f89308e31282bfdda.png

运行成功

9d98b1bcf26940edbb0019506cda8bb5.png

3.Android项目中导入OpenCV工程

将OpenCV库作为本地模块导入:在Android Studio中选择File -> New -> Import Module。

46a71c82b1d343bd993039105a8b2a3f.png

然后选择上面解压得到的OpenCV-android-sdk文件夹中的sdk文件夹,把Module name改为opencv。a1c107677d504bb6bd8a5e1c9214a85f.png

导入成功,出现新的工程opencv

e45e402521674540839106dd8101d28e.png

导入成功之后,会出现报错提示你修改,只需要进去opencv工程的build.gradle里面改一下,让compileSdkVersion,minSdkVersion和targetSdkVersionp与app工程的build.gradle的一致。

8438d373cbb7418e8d91f14502d7a108.png

然后,在这里我出现错误;

Build file ‘D:\DownLoad\Android\javadata\MyApplication7\opencv\build.gradle’ line: 92

A problem occurred evaluating project ‘:opencv’.

Plugin with id ‘kotlin-android’ not found.

解决方法:

删掉:apply plugin: ‘kotlin-android’

点击make project,不报错,修改好的opencv工程build.gradle如下图所示:

c64e86e0f19b40f3928f8d9f677ab557.png

点击File->Project Structure->Dependencies->app->右边的+->3 Module Dependency

11afef16fbe24427b8d6baa860bb538f.png

选择opencv,点击OK7adfdac224324f969686bbbc21722007.png

点击make project,如果不报错,则成功了。

4.导入OpenCV的库文件

1、把OpenCV-android-sdk下的OpenCV-android-sdk/sdk/native/jni/include文件夹拷贝到你项目

src/main下面,并修改名字为opencv_include。

10ab8e8c676a4299a5143dda1d48826b.png

2、把OpenCV-android-sdk下的OpenCV-android-sdk/sdk/native/libs文件夹拷贝到你项目src/main/

下面,并修改名字为opencv_libs。

620f0c0ead8347c09fe26594b9238d98.png

如图所示

46b6eb61381c457f8785de4315ff11d0.png

在您的Android项目src/main/cpp目录下的的CMakeLists.txt文件中,添加对OpenCV库的引用,配置如下:

  1. cmake_minimum_required(VERSION 3.22.1)
  2. project("myapplication")
  3. add_library( # Sets the name of the library.
  4. myapplication
  5. SHARED
  6. native-lib.cpp)
  7. #opencv
  8. set(OPENCV_LIBS_DIR ${CMAKE_SOURCE_DIR}/../opencv_include)
  9. set(OPENCV_LIBS ${CMAKE_SOURCE_DIR}/../opencv_lib)
  10. add_library(libopencv_java4
  11. SHARED
  12. IMPORTED )
  13. set_target_properties(libopencv_java4
  14. PROPERTIES IMPORTED_LOCATION
  15. ${OPENCV_LIBS}/${ANDROID_ABI}/libopencv_java4.so )
  16. #指定引入头文件目录
  17. include_directories(${OPENCV_LIBS_DIR})
  18. find_library( # Sets the name of the path variable.
  19. log-lib
  20. log)
  21. target_link_libraries( # Specifies the target library.
  22. myapplication
  23. libopencv_java4
  24. jnigraphics #JNI层,添加bitmap支持
  25. ${log-lib})
5.实现opencv高斯模糊图像处理的demo

在native-lib.cpp中调用opencv库实现图像处理的C/C++函数。

  1. #include <jni.h>
  2. #include <string>
  3. #include <android/bitmap.h>
  4. #include <opencv2/opencv.hpp>
  5. using namespace cv;
  6. extern "C"
  7. JNIEXPORT void JNICALL
  8. Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,
  9. jobject bitmap) {
  10. AndroidBitmapInfo info;
  11. void *pixels;
  12. CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);
  13. //判断图片是位图格式有RGB_565 、RGBA_8888
  14. CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
  15. info.format == ANDROID_BITMAP_FORMAT_RGB_565);
  16. CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);
  17. CV_Assert(pixels);
  18. //将bitmap转化为Mat类
  19. Mat image(info.height, info.width, CV_8UC4, pixels);
  20. // 高斯模糊
  21. GaussianBlur(image, image, Size(101, 101), 0);
  22. }

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity"
  8. android:orientation="vertical">
  9. <ImageView
  10. android:id="@+id/Original_image"
  11. android:layout_width="match_parent"
  12. android:layout_height="0dp"
  13. android:layout_weight="1"
  14. />
  15. <Button
  16. android:id="@+id/button"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:text="高斯模糊"/>
  20. <ImageView
  21. android:id="@+id/Image"
  22. android:layout_width="match_parent"
  23. android:layout_height="0dp"
  24. android:layout_weight="1"
  25. />
  26. </LinearLayout>

在您的Java代码中,使用JNI接口来调用您在native-lib.cpp中实现的C/C++函数。

  1. public class MainActivity extends AppCompatActivity {
  2. static {
  3. System.loadLibrary("myapplication");
  4. }
  5. private ActivityMainBinding binding;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. binding = ActivityMainBinding.inflate(getLayoutInflater());
  10. setContentView(binding.getRoot());
  11. Bitmap Original_bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img);
  12. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img);
  13. ImageView Original_image=findViewById(R.id.Original_image);
  14. Original_image.setImageBitmap(Original_bitmap);
  15. Button button=findViewById(R.id.button);
  16. button.setOnClickListener(new View.OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. opencv_test(bitmap);
  20. ImageView Image=findViewById(R.id.Image);
  21. Image.setImageBitmap(bitmap);
  22. }
  23. });
  24. }
  25. public static native void opencv_test(Object bitmap);
  26. }

运行效果图:

da37d55a162e43c7b132b33f61e0aa5c.png

发表评论

表情:
评论列表 (有 0 条评论,115人围观)

还没有评论,来说两句吧...

相关阅读