环境:
AS:4.0
CV:4.5
新建项目
设置build文件中的版本
sync一下,看看是否编译成功
无报错,运行一遍初始代码,Run一下
运行成功
手机上的软件打开显示的 “hello from C++"
接下来配置Cmake文件
cmake_minimum_required(VERSION 3.4.1) # ##################### OpenCV 环境 ############################ #设置OpenCV-android-sdk路径 set( OpenCV_DIR F:/opencv/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)
注意改一下路径
修改xml文件
<?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>
修改mainactivity文件
package com.demo.opencv; 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.test); imageView.setImageBitmap(bitmap); } else { Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test); getEdge(bitmap); imageView.setImageBitmap(bitmap); } } //获得Canny边缘 native void getEdge(Object bitmap); }
将一张名为test.jpg的图片放置在drawable目录下
生成头文件
打开Android Studio下方Terminal栏,输入cd app\src\main\java
(所有应用都一样),回车。然后输入javah -encoding UTF-8 包名.类名
(我们这里输入的是javah -encoding UTF-8 com.demo.opencv.NativeActivity
,注意,类名后面不要加.java或.class),回车后,将在app\src\main\java
目录下生成一个头文件,如果提示类文件不存在,则需先build,再执行上述操作。最后将该头文件移动到app\src\main\cpp
目录下。
或者,在设置里面新建一个javah
Progarm:JDKPath\......
Arguments:FilesClass
Working directory:Module\......
在对mainactivity操作
将生成的.h文件剪切至cpp文件夹目录下
编写native-lib.cpp文件
#include "com_demo_opencv_MainActivity.h" #include <android/bitmap.h> #include <opencv2/opencv.hpp> using namespace cv; extern "C" JNIEXPORT void JNICALL Java_com_demo_opencv_MainActivity_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); }
运行程序
调试
检验结果