AndroidStudio cmake集成OpenCV

步骤:

  1. 下载opencv Android sdk(下载 Android pack):地址https://opencv.org/releases.html
  2. 解压下来,备用
    这里写图片描述
  3. 新建Android工程,勾选支持c++选项
  4. 拷贝OpenCV-android-sdk\sdk\native\jni 目录下的include文件夹到工程的cpp目录下
  5. 拷贝OpenCV-android-sdk\sdk\native\libs 目录下的动态库到jniLibs下,此时项目结构
    这里写图片描述

  6. build.gradle添加

 ndk {
            abiFilters 'armeabi'//,'arm64-v8a','armeabi-v7a','mips','mips64','x86','x86_64'
        }
  1. 配置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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值