欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android studio 中基于c++的OpenCV 配置

程序员文章站 2022-03-21 18:48:55
Android studio 中基于c++的OpenCV 配置最近在做文字识别的App,需要调用图像处理的c++代码,关于OpenCV的配置遇到很多坑,因此记录一下配置流程。配置版本:Android studio:3.6.3(版本查看:Help–>About)Opencv :4.1.2(Android版),下载后解压即可若opencv版本不同也可以,但需要注意后续中配置进行相应更改。1.新建Native C++工程File–>New–>New Project,选择Native...

Android studio 中基于c++的OpenCV 配置

最近在做文字识别的App,需要调用图像处理的c++代码,关于OpenCV的配置遇到很多坑,因此记录一下配置流程。

配置版本:Android studio:3.6.3(版本查看:Help–>About)
Opencv :4.1.2(Android版),下载后解压即可

若opencv版本不同也可以,但需要注意后续中配置进行相应更改。

1.新建Native C++工程
File–>New–>New Project,选择Native C++;
Android studio 中基于c++的OpenCV 配置
2.导入opencv
选择File --> New -->Import Module,导入刚刚解压的opencv-4.1.2-android-sdk,选择OpenCV-android-sdk\sdk\java.
Android studio 中基于c++的OpenCV 配置
3.修改build.gradle (opencv)
将文件中的 ‘application’ 改为‘library’ ,将defaultConfig中的“applicationId” org.opencv ”一行 删除;(如果是opencv3就不需要更改,自动生成library)
Android studio 中基于c++的OpenCV 配置
4.build.gradle (: app) 和build.gradle (: opencv)修改
两个文件中的 compileSdkVersion和build ToolsVersion 需要保持一致
Android studio 中基于c++的OpenCV 配置
5.将opencv作为dependencies加到app中
选择File --> Project Structure --> Dependencies,选择app后点+号,选择opencv
Android studio 中基于c++的OpenCV 配置
6.在src/main/下新建JNI Folder
文件名为jniLibs,并将D:\soft\opencv-4.1.2-android-sdk\OpenCV-android-sdk\sdk \ native \ libs下的四个文件复制过去(opencv3版本也是复制下图的四个文件)
Android studio 中基于c++的OpenCV 配置
结果如下图所示
Android studio 中基于c++的OpenCV 配置
7.修改gradle.properties文件
加入opencv的路径

opencvsdk=D\:/soft/opencv-4.2.1-android-sdk/OpenCV-android-sdk

Android studio 中基于c++的OpenCV 配置

8.修改 Settings.gradle文件
添加如下内容,project中的内容为导入opencv时的命名。

include ':opencv4'
project(':opencv4').projectDir = new File(opencvsdk + '/sdk')

9.修改Build.gradle(:app)文件
在externalNativeBuild中添加如下内容:

externalNativeBuild {
cmake {
	cppFlags "-frtti -fexceptions"
	abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
	arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native"
   }
}

结果如下图
Android studio 中基于c++的OpenCV 配置
修改sourceSets部分如下:
Android studio 中基于c++的OpenCV 配置

10. 修改CMakeList.txt文件
在add_library上面添加如下内容:
opencv4版本

include_directories(${OpenCV_DIR}/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so)

opencv3版本

include_directories(${OpenCV_DIR}/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so)

在target_link_libraries加入lib_opencv
Android studio 中基于c++的OpenCV 配置
11.测试代码

Native-lib.cpp

#include <jni.h>
#include <string>
#include <opencv2/core.hpp>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_test_MainActivity_opencvTest(JNIEnv *env, jobject thiz, jlong mad_addr_gr,jlong mat_addr_rgba) {
    cv::Rect();
    cv::Mat();
    std::string hello2="hello from opencvtest";
    return env->NewStringUTF(hello2.c_str());
    // TODO: implement validate()
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_test_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement stringFromJNI()
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

12.MainActiviy.java代码

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.opencv.android.OpenCVLoader;

public class MainActivity extends AppCompatActivity {

            private static String TAG="MainActivity";
            static {
                System.loadLibrary("native-lib");
                System.loadLibrary("opencv_java4");//opencv4版本
                //System.loadLibrary("opencv_java3");opencv3版本
            }

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                TextView textView=(TextView) findViewById(R.id.sample_text);
                textView.setText(stringFromJNI());

                // Example of a call to a native method
                TextView tv = findViewById(R.id.sample_text);
                tv.setText(stringFromJNI());

        if (OpenCVLoader.initDebug()) {
            textView.setText(textView.getText()+"\n OPENCV LOADED SUCCESSFULLY");
            textView.setText(textView.getText()+"\n"+validate(500,500));

        } else {
            Log.d(TAG, "OPENCV DİD NOT LOAD");

        }
    }
    public native String stringFromJNI();
    public native String opencvTest(long madAddrGr,long matAddrRgba);
}

测试结果如下:
Android studio 中基于c++的OpenCV 配置
ps:opencv3版需要用NDK16,具体原因暂时不知。

若有错误请指正。

本文地址:https://blog.csdn.net/qq_42881467/article/details/107567570