OpenCV配置不采取OpenCVManager澳门网上正规赌场网址

用作一只前端狗,因为要写人机交互实验,写手提式有线电电话机相机的手势识别所以用Android配了一波opencv条件,心里苦。好吧,中间看了累累学科,也踩了重重坑,一贯不希罕配意况,可以吗,以往上马说配置进程吧

举个例子不会Android Studio中生成.so文件,请先查看Android JNI
Windows配置

前提:

  1. 下载:首先走入opencv官方网站
    manager
    ,然则新兴自己把那一个apk卸载之后察觉也得以用qaq。然后再看了一下apk下的readme文件,自1.7版来讲,OpenCV管理器的多少个软件包被营造。每一种软件包都针对有个别一定的硬件平台,蕴含相应的OpenCV二进制文件。
    所以,在具备意况下,OpenCV Manager使用内置版本的OpenCV。
    新的软件包采用逻辑在多数情景下简化了在最终顾客设备上的OpenCV安装。
    在一大半场合下,OpenCV Manager恐怕会从谷歌Play自动安装。但是在模拟机或然开垦板中只怕须要设置opencvmanager。
  2. 将opencv引入Android Studio在Android studio中 点击File ->new
    ->import module,

    澳门网上正规赌场网址 1

    其后谋面世这么些窗口

    澳门网上正规赌场网址 2接下来找到OpenCV解压的门径,接纳sdk/java文件夹。

  3. 更新
    build.gradle文件然后会开掘相当多地点报错,那是因为opencv-Android的在这里的bulid文件和体系中的分歧样,将划红线部分的音信改为和app文件夹下的build.gradle中国国际信资公司息相平等

    澳门网上正规赌场网址 3

  4. 添加Module Dependency点击File选择 project structure

    澳门网上正规赌场网址 4Paste_Image.png

    接下来点击右上角的加号

    澳门网上正规赌场网址 5Paste_Image.png然后澳门网上正规赌场网址 6点击ok,然后再同台分明。

  5. 复制libs文件夹到项目中在OpenCV的解压包中,将sdk–>native–>libs文件夹复制,粘贴在Project视图下app–>src–>main目录下,并将其重命名叫jniLibs。

  1. OpenCV官方网址下载Android版SDK
    步向官方网站之后左下角有OpenCV 3.3赫色字体,不自然是3.3,
    那只是版本音讯,点步向之后方可在最下方下载Android版的SDK。

  2. 下载之后的目录结构

 
    1.安装Android Studio(过程略)

这般在Android中的opencv情形就配好了,当让那只是只写java版的opencv情状,假如要写c++的代码还索要配备ndk蒙受。

澳门网上正规赌场网址 7

 
    2.官方网址下载OpenCV for Android 网站:http:opencv.org/downloads.html
小编下载的是下图的本子

参报考博士硕士文:

图1.png

澳门网上正规赌场网址 8

  • apk:OpenCV Manager
    apk的寄存目录(依据不一样cpu型号有例外的apk请依据本人的机器cpu型号来对号入座,一般v7a的就好了)。
  • samples:opencv代码案例里面蕴涵了人脸检查评定和其余。
  • sdk:包括了sdk和lib包。

 
  3.将下载好的OpenCV for Android解压到定点文件夹 

  1. 用Android Studio直接导入人脸检查测量检验demo–face-detection
    注:
    (1)demo是eclipse的,导入的时候恐怕会有标题,可是应该是很轻易化解的;
    (2)必定要导入import moudule opencv java库。

 
  4.新建一个android项目(就新建二个就好,今后选拔)

导入之后先去解决compileSdkVersion和targetSdkVersion难点并协同。目录结构如下:

澳门网上正规赌场网址, 
   以上的步骤基本没有何样难题(除了展开网页的时候网速极慢。。。)

澳门网上正规赌场网址 9

Android
Studio导入OpenCV:

图2.png

 
  1.点击File-new-import Module如图:

  1. 配置NDK
    (1)在类型根目录下的gradle.properties中加多
    android.useDeprecatedNdk=true
    只要没有gradle.properties,从任何品种拷贝过来或许自身新建一个都得以。
    (2)在local.properties中增多ndk路线(是你的ndk安装路线)
    ndk.dir=ndk.dir=D\:\\java\\androidstudio\\sdk\\ndk-bundle
    (3)在app的build.pradle中添加
    sourceSets.main {
    jni.srcDirs = [‘libs’]
    }
    做到后一齐工程。

  2. 修改openCVSamplefacedetection/src/main/jni下的Android.mk, 修改后如下

 
   澳门网上正规赌场网址 10

 
   2.Source directory中填写内容:找到步骤第11中学解压OpenCV for
Android的岗位OpenCV-android-sdk   —>  sdk—>
 java直接拷贝,拷贝实现后会出现Module                    
name(笔者的因为早就导入过了为此会有惊讶号常规境况下点击下一步下一步下一步就好)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED

include C:\Users\Administrator\Desktop\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk

LOCAL_SRC_FILES  := DetectionBasedTracker_jni.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)
LOCAL_LDLIBS     += -llog -ldl

LOCAL_MODULE     := detection_based_tracker

include $(BUILD_SHARED_LIBRARY)

 
  澳门网上正规赌场网址 11

修改Application.mk文件如下:

 
 上述手续或然会碰着的荒唐:导入之后种种bug输出,,,,,小编的如下图(只是截取的一些):

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := all

 
  澳门网上正规赌场网址 12

  1. 复制C:\Users\Administrator\Desktop\OpenCV-android-sdk\sdk\native中的libs文件夹到F:\test\FaceDetection\openCVSamplefacedetection\src\main\jniLibs

 
  消除:导入OpenCV for
Android后应当将openCVLibrary310下的build.gradle文件改成和率先步本身新建的android项目下的build.gradle文件一律,然后clean一下,OK

澳门网上正规赌场网址 13

将openCVLibrary310应用到和谐的档案的次序:

图3.png

 
 1.点击File-Project
Structure会现身下图:Modules下面找你新建的android项目后点击Dependencies

  1. 跻身NDK的设置路线(D:\java\androidstudio\sdk\ndk-bundle>),
    执行

 
 澳门网上正规赌场网址 14

 
 2.点击右边加号选第多少个Module
dependency后选取openCVLibrary310后点击实现

D:\java\androidstudio\sdk\ndk-bundle>ndk-build.cmd NDK_PROJECT_PATH=F:\test\FaceDetection\openCVSamplefacedetection\src\main

 
  澳门网上正规赌场网址 15

施行到位后在F:\test\FaceDetection\openCVSamplefacedetection\src\main路线下生成libs文件夹,结构如图:

 
 以上落成后你的app就足以使开辟openCV了

澳门网上正规赌场网址 16

android使用OpenCV将彩图转化为灰图的例子:

图4.png

 
MainActivity.java代码:

  1. 将各种文件夹下的libdetection_based_tracker.so文件复制到jniLibs文件夹相对应的公文夹下,
    复制达成之后,删除F:\test\FaceDetection\openCVSamplefacedetection\src\main路线下的libs与obj文件夹,不然编写翻译时会出现文件再一次错误。

  2. 运营品种。

package com.example.lenovo.myapplication;

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.View;
import android.widget.Button;
import android.widget.ImageView;
import com.example.lenovo.R;
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 {
    Button btnProcess;
    Bitmap srcBitmap;
    Bitmap grayBitmap;
    ImageView imgHuaishi;
    private static boolean flag = true;
    //private static boolean isFirst = true;
    private static final String TAG = "MainActivity";

    //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, "成功加载");
                    break;
                default:
                    super.onManagerConnected(status);
                    Log.i(TAG, "加载失败");
                    break;
            }

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
        btnProcess.setOnClickListener(new ProcessClickListener());
    }
    public void initUI(){
        btnProcess = (Button)findViewById(R.id.btn_gray_process);
        imgHuaishi = (ImageView)findViewById(R.id.img_huaishi);
        Log.i(TAG, "initUI sucess...");

    }

    public void procSrc2Gray(){
        Mat rgbMat = new Mat();
        Mat grayMat = new Mat();
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.text_img);
        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...");
    }

    private class ProcessClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
//            if(isFirst)
//            {
                procSrc2Gray();
//                isFirst = false;
//            }
            if(flag){
                imgHuaishi.setImageBitmap(grayBitmap);
                btnProcess.setText("查看原图");
                flag = false;
            }
            else{
                imgHuaishi.setImageBitmap(srcBitmap);
                btnProcess.setText("灰度化");
                flag = true;
            }
        }

    }

    @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);
        }
    }
}

  对应的xml文件:

<?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:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    tools:context="com.example.mytest.MainActivity">

    <ImageView
        android:id="@+id/img_huaishi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
    <Button
        android:id="@+id/btn_gray_process"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/img_huaishi"
        android:layout_centerHorizontal="true"
        android:text="灰度化"/>"
</RelativeLayout>

 
   那样就够了,然后点击运转。。。。。

 
   呵呵,,运维退步对不对,提示要要安装opencv
manager的apk,,作者啊官方demo中保有的apk都设置了,依旧提示未安装,,程序不能够运作,,,后来沉思,实际付出中
     
 须求人脸识别一类的功用,还非得让客商用你的软件的还要还非要安装opencv
manager的apk?那客商体验也是没何人了。。。。。。然后就找到了一种不设置那个apk也足以照
     常使用OpenCV了

 
 
 参谋网站:

 
   方法如下:

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

 
 
 2.将OpenCV-android-sdk\samples\image-manipulations\res\layout下的xml文件拷贝到本人的门类\src\main\res下面

 
 
 3.将OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations下的java文件拷到自身的花色\src\main\java\你
                     
MainActivity所在的包名,即和MainActivity同级目录

 
 
 4.在档案的次序清单文件中为刚刚导入的java文件举行安顿,加上相应的权力,如图:

 
     澳门网上正规赌场网址 17

 
   接下来运维你的连串,就妥妥的了

 
   作者的运作后截图:

 
 澳门网上正规赌场网址 18澳门网上正规赌场网址 19

 
 最终说说遇到的别样奇葩难题:

 
 1.明明哪里都妥妥的了,能源文件未有失常态,正是找不到ENVISION文件
clean也找不到,,,,

 
   不择手腕的缓慢解决办法:手动写 import 你的报名.凯雷德作者试了,,OK了。。。。。。。

 
 2.运营app时候出错如图:

 
  澳门网上正规赌场网址 20

 
  消除如图:Enable ADB Integration勾选一下

 
 澳门网上正规赌场网址 21

 
 备忘,希望给大家带来帮助。

 
   

 

 

 

 
 

 

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注