步骤:
- 下载opencv Android sdk(下载 Android pack):地址https://opencv.org/releases.html
- 解压下来,备用
- 新建Android工程,勾选支持c++选项
- 拷贝OpenCV-android-sdk\sdk\native\jni 目录下的include文件夹到工程的cpp目录下
拷贝OpenCV-android-sdk\sdk\native\libs 目录下的动态库到jniLibs下,此时项目结构
build.gradle添加
ndk {
abiFilters 'armeabi'//,'arm64-v8a','armeabi-v7a','mips','mips64','x86','x86_64'
}
- 配置CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
find_library( log-lib
log )
add_library( native-lib
SHARED
src/main/cpp/native-lib.cpp )
add_library( opencv_java3
SHARED
IMPORTED)
set_target_properties( opencv_java3
PROPERTIES IMPORTED_LOCATION
${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so
)
add_library(lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so)
include_directories(src/main/cpp/include/)
target_link_libraries( native-lib
opencv_java3
${log-lib} )
8.测试,MainActivity加载一张图片,通过opencv灰度化图片
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
static {
System.loadLibrary("opencv_java3");
System.loadLibrary("native-lib");
}
private ImageView imageView;
private Button button;
private Bitmap bmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public static native int[] grayProc(int[] pixels, int w, int h);
private void initView() {
imageView = findViewById(R.id.imageView);
button = findViewById(R.id.button);
bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
imageView.setImageBitmap(bmp);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
int w = bmp.getWidth();
int h = bmp.getHeight();
int[] pixels = new int[w*h];
bmp.getPixels(pixels, 0, w, 0, 0, w, h);
int[] resultInt = grayProc(pixels, w, h);
Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
imageView.setImageBitmap(resultImg);
break;
}
}
}
9.native-lib.cpp
#include <jni.h>
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_hbck_tiaoyitiao_MainActivity_grayProc(JNIEnv *env, jclass obj, jintArray buf, jint w, jint h) {
jboolean ptfalse = static_cast<jboolean>(false);
jint *srcBuf = env->GetIntArrayElements(buf, &ptfalse);
if (srcBuf == NULL) {
return 0;
}
int size = w * h;
Mat srcImage(h, w, CV_8UC4, (unsigned char *) srcBuf);
Mat grayImage;
cvtColor(srcImage, grayImage, COLOR_BGRA2GRAY);
cvtColor(grayImage, srcImage, COLOR_GRAY2BGRA);
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, srcBuf);
env->ReleaseIntArrayElements(buf, srcBuf, 0);
return result;
}
10.效果:
github demo地址:https://github.com/woshiqiang/TiaoYiTiao