AS下配置OpenCV环境

本文详细介绍如何在Android Studio中配置OpenCV环境及使用JNI调用OpenCV进行图像轮廓提取的过程,包括设置依赖、编译NDK、创建本地库等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AS下配置OpenCV环境

1.下载OpenCV4Android安装包,本实例中使用OpenCV3.1。解压后问价目录如下:

  • apk:OpenCV_3.1.0_Manager_3.10安装包,Android OpenCV手机端使用
  • samples:样例代码
  • sdk:Android开发程序使用SDK

2.新建project,点击file->new modular,选择OpenCV-android-sdk\sdk\java目录,确认。
导入OpenCV modular

3.点击file->Project Structure,选择app,添加dependencies->modular dependency,选择OpenCV3.1,确认
Project Structure

添加modular dependency

4.最后修改openCVLibrary310下build.gradle中配置,使其与app目录下build.gradle相同。

//openCVLibrary310下build.gradle
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

至此AS下OpenCV配置已经结束,使用样例中的代码进行测试,此不赘述。

OpenCV JNI配置

1.本示例中对图像进行轮廓提取,程序主体使用c++实现。
在MainActivity中添加如下函数public static native int[] ImgFun(int []buf,int w,int h);

2.使用javah生成其所对应的头文件:
生成MainActivity所对应的头文件

3.在main目录下新建jni文件夹,将生成的头文件放入该文件夹下,向其中添加ImgFun.cpp Android.mk Application.mk文件。分别写入如下代码:

#Android.mk中添加代码:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
# include指向自己OpenCV-android-sdk\sdk\native\jni\OpenCV.mk对应位置
include D:\download\OpenCV-3.1.0-android-sdk\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif

LOCAL_MODULE := ImgFun
LOCAL_SRC_FILES := ImgFun.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
# Application.mk写入代码如下:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
  
  • 1
  • 2
  • 3
  • 4

4.向app目录下build.gradle android{}中加入如下代码:

    sourceSets.main{
        jniLibs.srcDir 'src/main/libs' //set .so files directory to libs
        jni.srcDirs = [] //disable automatic ndk-build call
    }
// call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {

            commandLine 'D:\\Users\\XXX\\AppData\\Local\\Android\\sdk\\ndk-bundle\\ndk-build.cmd', '-C', file('src/main').absolutePath//windows系统下的操作;将路径替换为自己NDK所在位置;

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

记得在gradle.property中加上:android.useDeprecatedNdk=true;
并且将NDK目录加入到local.properties中:

ndk.dir=D\:\\Users\\kangdekai\\AppData\\Local\\Android\\sdk\\ndk-bundle
sdk.dir=D\:\\Users\\kangdekai\\AppData\\Local\\Android\\sdk
  
  • 1
  • 2

此时build project便可以看到生成的ImgFun.so文件(第一次竟然因为项目名称有特殊符号没有成功)
生成so文件

5.定义ImgFun.cpp如下:

#include "com_example_jniopencv_MainActivity.h"
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
IplImage * change4channelTo3InIplImage(IplImage * src);

extern "C" {
JNIEXPORT jintArray JNICALL Java_com_example_jniopencv_MainActivity_ImgFun
        (JNIEnv *, jclass, jintArray, jint, jint);
JNIEXPORT jintArray JNICALL Java_com_example_jniopencv_MainActivity_ImgFun
        (JNIEnv *env, jclass obj, jintArray buf, jint w, jint h) {

    jint *cbuf;
    cbuf = env->GetIntArrayElements(buf, false);
    if (cbuf == NULL) {
        return 0;
    }

    Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);
    IplImage image=IplImage(myimg);
    IplImage* image3channel = change4channelTo3InIplImage(&image);

    IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);

    cvCanny(image3channel,pCannyImage,50,150,3);

    int* outImage=new int[w*h];
    for(int i=0;i<w*h;i++)
    {
        outImage[i]=(int)pCannyImage->imageData[i];
    }

    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, outImage);
    env->ReleaseIntArrayElements(buf, cbuf, 0);
    return result;
}
}

IplImage * change4channelTo3InIplImage(IplImage * src) {
    if (src->nChannels != 4) {
        return NULL;
    }

    IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
    for (int row = 0; row < src->height; row++) {
        for (int col = 0; col < src->width; col++) {
            CvScalar s = cvGet2D(src, row, col);
            cvSet2D(destImg, row, col, s);
        }
    }

    return destImg;
}
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

定义MainActivity如下:

static {
        System.loadLibrary("ImgFun");
    }
    public static native int[] ImgFun(int []buf,int w,int h);

    ImageView mIv;
    Button btnNdk,btnRtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView mtv=(TextView)findViewById(R.id.tv1);
//        Test mytest=new Test();
//        mtv.setText(mytest.myFun());
        mtv.setText("你好!");

        btnNdk=(Button)findViewById(R.id.button1);
        btnRtn=(Button)findViewById(R.id.button2);
        btnRtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mIv=(ImageView)findViewById(R.id.iV);
                Bitmap img = ((BitmapDrawable) getResources().getDrawable(R.drawable.image)).getBitmap();
                mIv.setImageBitmap(img);
            }
        });
        btnNdk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                long current = System.currentTimeMillis();
                Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(
                        R.drawable.image)).getBitmap();
                int w = img1.getWidth(), h = img1.getHeight();
                int[] pix = new int[w * h];
                img1.getPixels(pix, 0, w, 0, 0, w, h);
                int[] resultInt = ImgFun(pix, w, h);
                Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
                resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
                long performance = System.currentTimeMillis() - current;
                mIv.setImageBitmap(resultImg);
            }
        });
    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

6.运行程序,便可看到如下效果了~
运行结果

参考博文:
1.android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
2.Android Studio 配置OpenCV、NDK,并用Jni调用OpenCV
3.在Android中使用JNI调用Opencv本地代码 配置方式 边缘检测 范例代码
4.OpenCV在Android环境下的使用方法
5.OpenCV4Android Samples

### VSCode 中设置 OpenCV 和 Python 开发环境 #### 安装 Python 确保已安装最新版本的 Python。可以从官方网站下载并按照说明完成安装过程[^2]。 #### 安装 Visual Studio Code (VSCode) 如果尚未安装 VSCode,访问其官网获取适合操作系统的安装包,并遵循指引完成安装。 #### 安装 Python 扩展插件 启动 VSCode 后,在扩展市场中搜索 “Python”,找到由 Microsoft 提供的支持 Python 的官方扩展并点击安装按钮。 #### 创建虚拟环境(可选) 为了保持项目的独立性和整洁度,建议创建一个新的虚拟环境来管理项目依赖项: ```bash python -m venv myenv source myenv/bin/activate # Linux/MacOS 或者 Windows 使用 `myenv\Scripts\activate.bat` ``` #### 安装 OpenCV 库 激活虚拟环境后,通过 pip 工具安装 OpenCV-Python 包: ```bash pip install opencv-python ``` #### 测试安装是否成功 创建一个简单的测试脚本来验证 OpenCV 是否正常工作: ```python import numpy as np import cv2 img = cv2.imread('1.jpg', cv2.IMREAD_UNCHANGED) if img is None: print("图像加载失败,请确认路径正确") else: cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码尝试读取当前目录下的图片文件 '1.jpg' 并显示它;如果没有发现指定名称的图片,则会给出提示信息[^3]。 #### 调整 VSCode 设置 为了让编辑器更好地支持 Python 编程体验,可以在 `.vscode/settings.json` 文件内加入如下配置片段以便自动补全和其他特性生效: ```json { "python.pythonPath": "${workspaceFolder}/myenv/bin/python", // 如果是在Windows上, 则应改为"${workspaceFolder}\\myenv\\Scripts\\python.exe" } ``` 以上步骤完成后,应该能够在 VSCode 中顺利地编写和运行涉及 OpenCV 的 Python 程序了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值