亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

              當(dāng)前位置:首頁 > IT技術(shù) > 移動(dòng)平臺(tái) > 正文

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)
              2021-10-28 15:18:57

              目錄

              ??OpenCV??

              ??OpenCV的下載??

              ??配置SDK manager??

              ??配置OpenCV??

              ??導(dǎo)入動(dòng)態(tài)庫??

              ??示例代碼??

              ??測試效果??

              ??參考博客:??



              近期課題需要用Android實(shí)時(shí)處理視頻,所以做了一些這方面的工作

              本文示例代碼地址:??https://github.com/nikolajohn/OpenCVtest??

              推薦一個(gè)基于Android OpenCV的目標(biāo)檢測項(xiàng)目:??https://github.com/nikolajohn/OpenCVForAndroid??



              OpenCV

              OpenCV全稱Open Source Computer VisoVision Library,是一個(gè)基于BSD開源協(xié)議的跨平臺(tái)計(jì)算機(jī)視覺庫。OpenCV實(shí)現(xiàn)了多種實(shí)時(shí)且高效的計(jì)算機(jī)視覺和圖像處理通用算法,并且可以利用計(jì)算機(jī)底層硬件平臺(tái)進(jìn)行硬件加速。



              OpenCV的下載

              打開OpenCV主頁:??https://opencv.org/??

              并選擇發(fā)行的Release版本

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_02

              這里可以選擇我們需要的OpenCV版本

              以O(shè)penCV 3.4.1為例

              點(diǎn)擊這里下載OpenCV 3.4.1 for Android

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_android_03

              下載完成后,打開壓縮包

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_04

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_05

              我們可以先看一下,這里面都有什么

              選擇SDK文件夾

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_06

              然后選擇java

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_07

              可以發(fā)現(xiàn),這和我們自己新建的Android工程目錄下的文件很像

              待會(huì)兒會(huì)提到,這個(gè)目錄將以Module的形式加載到我們自己新建的Android項(xiàng)目中

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_08

              至此,OpenCV 3.4.1 for Android下載完成



              配置SDK manager

              首先打開桌面上的Android Studio

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_09

              點(diǎn)擊configure,進(jìn)入配置選項(xiàng)

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_10

              選擇SDK manager

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_11

              打開后,在右邊選擇SDK Tools

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_12

              SDK Tools的頁面是這樣的

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_android_13

              我們選擇CMake和NDK

              CMake是一個(gè)跨平臺(tái)的編譯工具,能夠輸出各種各樣的makefile文件,這個(gè)在之后OpenCV編譯階段需要用到

              NDK是Android平臺(tái)下的一個(gè)開發(fā)工具包,使用NDK可以快速地開發(fā)C、C++的以.so為后綴的動(dòng)態(tài)庫,并自動(dòng)將.so動(dòng)態(tài)庫與應(yīng)用打包成.apk文件,這也是后面需要用到的

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_14

              選擇好后,點(diǎn)擊Apply應(yīng)用,即可開始下載

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_15

              下載之前,會(huì)提醒你要下載的版本,點(diǎn)擊確定即可

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_16

              稍微等待一下,速度還是挺快的

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_17

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_18

              最好翻一下墻

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_19

              接下來新建Android工程

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_20

              填寫項(xiàng)目名稱,記得勾選上支持C++,因?yàn)槲覀冇玫降腛penCV是用C、C++編寫的

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_21

              SDK版本我們選擇默認(rèn)即可,一般來說是API 15

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_22

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_23

              接下來的默認(rèn)Activity,名字可以直接用默認(rèn)的MainActivity,也可以修改一下

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_24

              接下來是選擇C++支持相關(guān)的一些選項(xiàng),記得和下圖選擇一樣即可

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_25

              至此,配置好NDK和C++支持的Android工程新建完成

              ?



              配置OpenCV

              進(jìn)入剛剛新建好的工程中

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_26

              選擇Import Module導(dǎo)入模塊

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_android_27

              選一下路徑,就是我們下載好OpenCV 3.4.1 for Android后提到的那個(gè)文件夾

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_28

              選擇確定即可

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_29

              點(diǎn)擊Finish后遇到這個(gè)報(bào)錯(cuò)

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_30

              這是我們的項(xiàng)目API版本和剛導(dǎo)入模塊的API版本不一致導(dǎo)致的

              我們的項(xiàng)目API版本要求在這里打開

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_31

              API版本要求如下:

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_32

              剛導(dǎo)入的Module的API版本要求如下:

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_33

              API版本要求如下:

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_34

              把Module里面的API版本要求根據(jù)我們自己新建項(xiàng)目的API版本要求修改即可

              這時(shí)候可能還會(huì)有其他的報(bào)錯(cuò),但是先不用管,把下面的配置工作先做完

              接下來導(dǎo)入模塊,首先打開Project Structure

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_35

              選擇右邊的Dependencies

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_36

              選擇右邊的小加號(hào),添加Module Dependency

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_37

              選擇OpenCVLibrary341,就是我們剛剛導(dǎo)入的Module

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_38

              導(dǎo)入成功

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_39

              點(diǎn)擊運(yùn)行,就沒有報(bào)錯(cuò)了



              導(dǎo)入動(dòng)態(tài)庫

              筆者曾看過一些其他教程,里面需要我們先在手機(jī)上下載OpenCV Manager

              然后才能運(yùn)行我們自己的Android應(yīng)用程序

              這顯然是沒有必要的

              OpenCV Manager是OpenCV 用于管理Android下的OpenCV動(dòng)態(tài)鏈接庫的

              通過OpenCV Manager這個(gè)東西,可以實(shí)現(xiàn)只要在同一個(gè)設(shè)備上,都可以共享OpenCV的動(dòng)態(tài)鏈接庫

              什么意思呢?

              就是說我現(xiàn)在用Android去調(diào)用OpenCV

              其實(shí)我是不能直接用java調(diào)用C++的,我的java代碼只能Import其他的java包

              也就是說,我的java代碼只能去調(diào)剛導(dǎo)入的那個(gè)Module里面的包

              而Module里面的java代碼也是不能直接調(diào)用C++的,而是需要以動(dòng)態(tài)鏈接庫的形式,間接地調(diào)用C++

              那么這些動(dòng)態(tài)鏈接庫怎么來的呢?

              第一種方法比較簡單,其實(shí)我們之前下載的OpenCV 3.4.1 for Android里面就已經(jīng)包含了這些動(dòng)態(tài)鏈接庫

              我們只需要把它放進(jìn)我們的項(xiàng)目里面來就好了

              第二種方法就是使用所謂的OpenCV Manager

              我先要下載一個(gè)OpenCV Manager應(yīng)用程序,這個(gè)OpenCV Manager里面是帶有這些動(dòng)態(tài)鏈接庫的

              然后只要我現(xiàn)在的手機(jī)上有這個(gè)OpenCV Manager,那么我自己寫應(yīng)用程序時(shí)不需要添加那些動(dòng)態(tài)鏈接庫,也可以調(diào)用之前下載好的那個(gè)應(yīng)用程序里面的動(dòng)態(tài)鏈接庫了

              我比較推薦第一種方法,做法如下:

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_40

              選擇Directory,新建一個(gè)目錄,命名為jniLibs

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_41

              回到我們剛剛下載的OpenCV 3.4.1 for Android

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_42

              選擇native

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_android_43

              這里面有兩個(gè)文件夾

              libs里面放的是動(dòng)態(tài)鏈接庫,文件以.so結(jié)尾

              staticlibs里面放的是靜態(tài)庫,文件以.a結(jié)尾

              我們用的是動(dòng)態(tài)鏈接庫,因此選擇libs文件夾打開

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_44

              把這個(gè)目錄下的所有文件復(fù)制一下

              這些文件夾的名字表示不同的處理器架構(gòu)

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_Android_45

              回到Android Studio

              直接在剛剛新建好的目錄下粘貼即可

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_c++_46

              點(diǎn)擊運(yùn)行即可

              至此,動(dòng)態(tài)鏈接庫的導(dǎo)入完成



              示例代碼

              一個(gè)簡單的示例程序,測試我們寫的代碼能否調(diào)用OpenCV

              JavaActivity

              package cn.edu.zju.myopencv;

              import android.content.Intent;
              import android.graphics.Bitmap;
              import android.graphics.BitmapFactory;
              import android.net.Uri;
              import android.support.v7.app.AppCompatActivity;
              import android.os.Bundle;
              import android.util.Log;
              import android.view.View;
              import android.widget.Button;
              import android.widget.ImageView;

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

              import java.io.InputStream;

              public class JavaActivity extends AppCompatActivity {



              // Used to load the 'native-lib' library on application startup.
              static {
              System.loadLibrary("native-lib");
              }


              private double max_size = 1024;
              private int PICK_IMAGE_REQUEST = 1;
              private ImageView myImageView;
              private Bitmap selectbp;

              @Override
              protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_java);
              staticLoadCVLibraries();
              myImageView = (ImageView)findViewById(R.id.imageView);
              myImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
              Button selectImageBtn = (Button)findViewById(R.id.select_btn);
              selectImageBtn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
              // makeText(MainActivity.this.getApplicationContext(), "start to browser image", Toast.LENGTH_SHORT).show();
              selectImage();
              }

              private void selectImage() {
              Intent intent = new Intent();
              intent.setType("image/*");
              intent.setAction(Intent.ACTION_GET_CONTENT);
              startActivityForResult(Intent.createChooser(intent,"選擇圖像..."), PICK_IMAGE_REQUEST);
              }
              });

              Button processBtn = (Button)findViewById(R.id.process_btn);
              processBtn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
              // makeText(MainActivity.this.getApplicationContext(), "hello, image process", Toast.LENGTH_SHORT).show();
              convertGray();
              }
              });

              }

              private void staticLoadCVLibraries() {
              boolean load = OpenCVLoader.initDebug();
              if(load) {
              Log.i("CV", "Open CV Libraries loaded...");
              }

              }

              private void convertGray() {
              Mat src = new Mat();
              Mat temp = new Mat();
              Mat dst = new Mat();
              Utils.bitmapToMat(selectbp, src);
              Imgproc.cvtColor(src, temp, Imgproc.COLOR_BGRA2BGR);
              Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));
              Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);
              Utils.matToBitmap(dst, selectbp);
              myImageView.setImageBitmap(selectbp);
              }


              @Override
              protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
              Uri uri = data.getData();
              try {
              Log.d("image-tag", "start to decode selected image now...");
              InputStream input = getContentResolver().openInputStream(uri);
              BitmapFactory.Options options = new BitmapFactory.Options();
              options.inJustDecodeBounds = true;
              BitmapFactory.decodeStream(input, null, options);
              int raw_width = options.outWidth;
              int raw_height = options.outHeight;
              int max = Math.max(raw_width, raw_height);
              int newWidth = raw_width;
              int newHeight = raw_height;
              int inSampleSize = 1;
              if(max > max_size) {
              newWidth = raw_width / 2;
              newHeight = raw_height / 2;
              while((newWidth/inSampleSize) > max_size || (newHeight/inSampleSize) > max_size) {
              inSampleSize *=2;
              }
              }

              options.inSampleSize = inSampleSize;
              options.inJustDecodeBounds = false;
              options.inPreferredConfig = Bitmap.Config.ARGB_8888;
              selectbp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);

              myImageView.setImageBitmap(selectbp);

              } catch (Exception e) {
              e.printStackTrace();
              }
              }
              }
              }


              相應(yīng)的layout

              <?xml version="1.0" encoding="utf-8"?>
              <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:id="@+id/activity_java"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context="cn.edu.zju.myopencv.JavaActivity"
              android:orientation="vertical"
              >

              <Button
              android:id="@+id/select_btn"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="選擇圖片" />

              <Button
              android:id="@+id/process_btn"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="處理" />

              <ImageView
              android:id="@+id/imageView"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />

              </LinearLayout>

              這里都是些很簡單的代碼,主要為了測試功能

              大家不用自己打了,直接去github下載即可

              地址:??https://github.com/nikolajohn/OpenCVtest??



              測試效果

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_android_47

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_OpenCV_48

              Android Studio 3.2.1 配置 OpenCV 詳解(2019年2月)_動(dòng)態(tài)鏈接庫_49



              ?

              本文摘自 :https://blog.51cto.com/u

              開通會(huì)員,享受整站包年服務(wù)立即開通 >