AndroidStudio 导入OpenCV 教程

一、OpenCV 包下载

下载链接:OpenCV。选择Android pack下载。然后解压。我下载的是最新版本3.4.0。

二、导入OpenCV
第一步

新建一个android application 项目OpenCVTest。

第二步

选择File—>New—>Import Module…
在这里插入图片描述

然后路径选择解压目录—>opencv-3.4.0-android-sdk—>OpenCV-android-sdk—>sdk—>java。因为我已经导入过了,所以提醒项目中已经存在一个同名的module。
在这里插入图片描述

第三步

修改OpenCVLibrary340的build.gradle,使其和OpenCVTest的build.gradle对应项一致。可以在OpenCVTest的工程目录下找到OpenCVLibrary340的build.gradle文件。重新clean一下项目。
在这里插入图片描述

三、将OpenCV应用到自己的项目
第一步

点击File-Project Structure会出现下图:Modules下边找你新建的android项目后点击Dependencies。点击右边的+ 号,选择Module dependcy,选择openCVLibrary340,导入。
在这里插入图片描述

第二步

设计一个简单的UI界面,做一张图片的灰度处理。
Layout文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp"
    tools:context="com.example.dx.opencvtest.MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="原图"
                android:id="@+id/textView" />

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/imageView_before"
                android:src="@drawable/duling"
                android:scaleType="fitXY" />
        </LinearLayout>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="@color/material_grey_900"></LinearLayout>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="灰度化"
                android:id="@+id/textView_togray" />

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/imageView_after" />
        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

MainActivity.java文件:

package com.example.dx.opencvtest;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    ImageView img_after;
    TextView text_togray;
    Bitmap srcBitmap;
    Bitmap grayBitmap;
    private static boolean flag = true;
    //private static boolean isFirst = true;
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img_after=(ImageView)findViewById(R.id.imageView_after);
        text_togray=(TextView)findViewById(R.id.textView_togray);
         text_togray.setOnClickListener(this);

    }
    //OpenCV库加载并初始化成功后的回调函数
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

        @Override
        public void onManagerConnected(int status) {
            // TODO Auto-generated method stub
            switch (status){
                case BaseLoaderCallback.SUCCESS:
                    Log.i(TAG, "成功加载");
                    Toast toast = Toast.makeText(getApplicationContext(),
                            "成功加载!", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                    break;
                default:
                    super.onManagerConnected(status);
                    Log.i(TAG, "加载失败");
                    Toast toast1 = Toast.makeText(getApplicationContext(),
                            "加载失败!", Toast.LENGTH_LONG);
                    toast1.setGravity(Gravity.CENTER, 0, 0);
                    toast1.show();
                    break;
            }

        }
    };

    public void procSrc2Gray(){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.duling);
        grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
        Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
        Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
        Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
        Log.i(TAG, "procSrc2Gray sucess...");
    }
    @Override
    public void onClick(View v)
    {
      switch(v.getId())
      {
          case R.id.textView_togray:
              procSrc2Gray();
              img_after.setImageBitmap(grayBitmap) ;
              break;
      }
    }

    @Override
    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }
}

编译成功以后,将.apk文件发到手机上安装,打开,提示要安装opencv manager的apk,但是你不可能开发一个APP以后还要别人必须安装这个APP才能运行。所以将opencv manager拼接到你的项目中,具体方法如下:

四、拼接opencv manager
第一步

把OpenCV sdk for Android文件下F:\OpenCV-android-sdk\sdk\native下的libs文件夹拷贝到你的安卓项目下,即自己的项目\src\main下面,并且将libs改名为:jniLibs。

第二步

将OpenCV-android-sdk\samples\image-manipulations\res\layout下的xml文件拷贝到自己的项目\src\main\res下面

第三步

将OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations下的java文件拷到自己的项目\src\main\java\你MainActivity所在的包名,即和MainActivity同级目录
至此,我的项目目录如下所示:
在这里插入图片描述
可以发现,我的jniLibs下面只有一个文件夹。因为我把其他的给删掉了,保留了一个适合自己手机CPU的lib,如果都添加进来的话,apk会有70多M,非常大,这里剪切一下,可减少包的体积,不过适配性能会有所降低。调试已经足够了。

第四步

修改项目的Manifest.xml。因为新添加了Activity,这个Activity用到了相机权限等,所以要注册权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dx.opencvtest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ImageManipulationsActivity"
            android:label="MyTest"
            android:screenOrientation="landscape"
            android:configChanges="keyboardHidden|orientation"></activity>

    </application>

    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera.front"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera.front.autofocus"
        android:required="false" />

</manifest>
五、实现效果

华为荣耀8测试通过。项目链接:OpenCVTest 提取密码:vdp0
在这里插入图片描述

  • 8
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android Studio导入OpenCV,您需要执行以下步骤: 1. 下载OpenCV Android SDK并解压缩。 2. 打开Android Studio并创建一个新项目。 3. 在项目的根目录下创建一个名为“libs”的文件夹。 4. 将解压缩的OpenCV Android SDK中的“libs”文件夹中的所有文件复制到您创建的“libs”文件夹中。 5. 在项目的根目录下创建一个名为“jniLibs”的文件夹。 6. 将解压缩的OpenCV Android SDK中的“jni”文件夹中的所有文件复制到您创建的“jniLibs”文件夹中。 7. 在项目的根目录下创建一个名为“build.gradle”的文件。 8. 在“build.gradle”文件中添加以下代码: ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'jniLibs', include: ['*.so']) } ``` 9. 在您的项目中使用OpenCV库。 以上就是在Android Studio导入OpenCV的步骤。 ### 回答2: Android Studio是一款广泛使用的Android应用程序开发工具,而OpenCV是一个开放源代码的计算机视觉和机器学习库,通过它可以在Android应用中实现许多现实世界的计算机视觉应用。目前,越来越多的开发者开始使用OpenCVAndroid应用中实现激进建模、人脸识别、物体检测等功能。接下来,将详细介绍如何在Android Studio导入OpenCV。 1.下载OpenCV SDK:首先需要到OpenCV官网下载OpenCV SDK,下载页面提供了多个版本的OpenCV SDK,我们需要选择最适合我们的版本; 2.创建Android工程:在Android Studio上创建一个空白Android工程,依次选择File -> New -> New Project,填写工程名、包名、保存路径等信息,最后点击Finish完成创建; 3.导入OpenCV SDK:将下载好的OpenCV SDK解压,复制其中的两个文件夹(Java和native)到新建的Android工程的主模块目录下; 4.配置工程:在build.gradle配置文件中添加OpenCV库; 在build.gradle(Module:app)中添加以下代码: ``` import org.gradle.internal.os.OperatingSystem def opencvdir = "$rootDir/OpenCV-android-sdk" def libname_first = "libopencv_java4" android { // ... } dependencies { // ... if (!isWindows()) { implementation files("$opencvdir/native/libs/${getOpenCvArch()}/$libname_first.so") } else { implementation files("$opencvdir/native/libs/${getOpenCvArch()}/$libname_first.dll") } } static def isWindows() { return OperatingSystem.current().windows } static def getOpenCvArch() { def arch = System.getProperty('os.arch') switch (arch) { case 'x86': case 'i386': case 'i486': case 'i586': case 'i686': return "x86" case 'amd64': case 'x86_64': return "x86_64" case 'arm': case 'armv5': return "armeabi-v7a" case 'armv6': return "armeabi-v6" case 'arm64': case 'aarch64': return "arm64-v8a" default: println "WARNING: CPU arch '$arch' was not recognized as official OpenCV arch" return null } } ``` 5.测试OpenCV:在MainActivity中测试导入OpenCV库,例如调用OpenCV中的imread函数读取一张图像: ``` public void testOpenCV() { String imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.jpg"; Mat srcMat = Imgcodecs.imread(imagePath, Imgcodecs.CV_LOAD_IMAGE_COLOR); if (srcMat.empty()) { return; } Bitmap srcBitmap = Bitmap.createBitmap(srcMat.width(), srcMat.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(srcMat, srcBitmap); ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(srcBitmap); } ``` 通过以上方法,我们可以成功在Android Studio导入OpenCV,实现相应的计算机视觉应用。在使用过程中,需要根据自己的需求调用OpenCV中的相应函数,实现自己的功能。 ### 回答3: Android Studio是一个用于开发Android应用程序的集成开发环境(IDE)。如果你想使用图像处理功能,例如人脸识别或条形码扫描,就可以使用OpenCV库。 以下是在Android Studio导入OpenCV的步骤: 1. 下载OpenCV安卓库 首先,在OpenCV网站上下载OpenCV安卓库。打开下载页面,选择适合你的OpenCV版本和Android Studio版本的库,然后下载该压缩文件。 2. 新建Android studio工程 在Android Studio中新建工程。 3. 在app的gradle文件中添加OpenCV库 解压下载的OpenCV安卓压缩文件后,在Android Studio工程的app的gradle文件中添加代码: ``` dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation project(':opencv') } ``` 其中'opencv'表示OpenCV库的名称。 4. 将OpenCV库文件放入工程中 在解压后的OpenCV安卓库文件夹中,找到libs文件夹。在Android Studio工程的app的main文件夹中,创建一个文件夹名为'jniLibs',随后把OpenCV库文件复制/剪切粘贴到该文件夹中。 5. 配置OpenCV库文件路径 在工程目录下,找到build.gradle文件,并在文件中添加如下代码: ``` sourceSets { main{ jniLibs.srcDirs=[ 'src/main/jniLibs', 'src/main/jniLibs/<平台对应的OpenCV文件夹>' ] } } ``` 将<>里的内容替换为你所下载的OpenCV版本对应的平台文件夹。 6. 在Java代码中调用OpenCV库 在你想要使用OpenCV库的Java文件中,导入OpenCV库并使用相关函数,例如: ``` import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.CvType; ... Mat m = new Mat(5, 5, CvType.CV_8UC1, new Scalar(0)); Log.i(TAG, "OpenCV Mat: " + m); Core.transpose(m, m); Log.i(TAG, "OpenCV Mat after transpose: " + m); ``` 以上是在Android Studio导入OpenCV的步骤。导入后,你可以使用OpenCV的函数进行图像处理,例如图像滤波、图像平滑、边缘检测等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值