针对opencv导入Android studio不成功的解决办法?

2023-05-16

一、问题如下:

   AS->File->New->Import Module 选择导入(压缩包路径)/sdk/java文件夹,然后发现AS没有下一步?

 二、解决办法

新建一个项目-在新建项目下创建一个包命名library

将opencv-android-sdk下的java包放进新建的包下改名opencv,写一个build文件(或者在github网站里找到自己想要的项目,将项目里面的library里面的文件复制到自己创建的library,这里,我是使用别人项目里面的包)

打开项目在setting.gradle添加include ':library

 添加依赖,File-Project Structure-Dependencies-点击app然后点击加号,选择3(module Dependency),选择library。

然后在main下创建jniLib包,将opencv-sdk-native-libs下的文件复制到jniLib文件下。

 以上是基本完成了opencv环境的配置。

三、下面介绍两个基于opencv的两个小demo。

  1、图片灰度化

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import org.opencv.osgi.OpenCVNativeLoader;

public class MainActivity extends AppCompatActivity {
    private ImageView mImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OpenCVNativeLoader loader = new OpenCVNativeLoader();
        loader.init();

        mImageView = findViewById(R.id.imageView);
        mImageView.setImageResource(R.drawable.img_origin);
        mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap bitmap = BitmapFactory.decodeResource(MainActivity.this.getResources(),R.drawable.img_origin);
                Mat mat = new Mat();
                Mat grayMat = new Mat();
                Utils.bitmapToMat(bitmap,mat);
                Imgproc.cvtColor(mat, grayMat, Imgproc.COLOR_RGB2GRAY);
                Utils.matToBitmap(grayMat,bitmap);
                mImageView.setImageBitmap(bitmap);
            }
        });
    }
}

XML的程序如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

  

 2、人脸检测

mainActivity下的程序如下:


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.osgi.OpenCVNativeLoader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.logging.Logger;

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
    private CameraBridgeViewBase openCvCameraView;

    private static final String TAG = "OpencvActivity";
    private CascadeClassifier cascadeClassifier = null; //级联分类器
    private Mat mRgba; //图像容器
    private Mat mGray;
    private int absoluteFaceSize = 0;
    private Handler handler;

    private void initializeOpenCVDependencies() {
        try {
            InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface_improved); //OpenCV的人脸模型文件: lbpcascade_frontalface_improved
            File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
            File mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface_improved.xml");
            FileOutputStream os = new FileOutputStream(mCascadeFile);
            byte[] buffer = new byte[4096];//其实byte[] buffer = new byte[4096]只是在内存中开辟块缓冲区而已。大小随便你写(假如你不是Extreme Programming的FANS),只要不超过你实际可用内存大小就好。不过太大或者太小都会对性能有影响
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            is.close();
            os.close();
            // 加载cascadeClassifier
            cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());
        } catch (Exception e) {
            Log.e(TAG, "Error loading cascade", e);
        }
        // 显示
        openCvCameraView.enableView();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == 0) {
            try {
                for(int i = 0; i < permissions.length; i++) {
                    Log.d(TAG, permissions[i] + ":" + grantResults[i]);
                }

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

    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       //new GetRunAuthorityUtil().getRunAuthority(this, this); //动态获取权限

        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

        handler = new Handler();

        openCvCameraView = (CameraBridgeViewBase) findViewById(R.id.javaCameraView);
        openCvCameraView.setCameraIndex(1); //摄像头索引        -1/0:后置双摄     1:前置
        openCvCameraView.enableFpsMeter(); //显示FPS
        openCvCameraView.setCvCameraViewListener(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.e(TAG, "OpenCV init error");
        }
        initializeOpenCVDependencies();
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat();
        mGray = new Mat();
    }

    @Override
    public void onCameraViewStopped() {
        mRgba.release();
        mGray.release();
    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba(); //RGBA
        mGray = inputFrame.gray(); //单通道灰度图

        if (absoluteFaceSize == 0) {
            int height = mGray.rows();
            if (Math.round(height * 0.2f) > 0) {
                absoluteFaceSize = Math.round(height * 0.2f);
            }
        }

        //解决  前置摄像头旋转显示问题
        //Core.flip(mRgba, mRgba, 1); //旋转
        //Core.flip(mGray, mGray, 1);

        //检测并显示
        MatOfRect faces = new MatOfRect();
        if (cascadeClassifier != null) {
            cascadeClassifier.detectMultiScale(mGray, faces, 1.1, 2, 2, new Size(absoluteFaceSize, absoluteFaceSize), new Size());
        }
        Rect[] facesArray = faces.toArray();
        if (facesArray.length > 0){
            for (int i = 0; i < facesArray.length; i++) {    //用框标记
                Imgproc.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3);
            }
        }
        return mRgba;
    }

}

XML下的程序如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <org.opencv.android.JavaCameraView
        android:id="@+id/javaCameraView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</androidx.constraintlayout.widget.ConstraintLayout>

  在res下创建一个raw包,将opencv-android-sdk下面的sdk-etc-libpacascades里面的两个文件复制到raw里面,如下图:

 

然后运行,应该没啥问题。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对opencv导入Android studio不成功的解决办法? 的相关文章

随机推荐

  • vue中封装axios 以及api 统一管理

    目录 一 安装axios二 创建文件夹三 封装axios1 引入axios2 引入vuex3 引入vant4 引入我们的环境变量5 创建axios实例6 添加请求拦截7 响应拦截8 导出封装的axios函数 四 api统一管理1 引入我们封
  • 提示虚拟内存不足可能的原因以及该怎么处理

    一 什么是虚拟内存 虚拟内存的概念是相对于物理内存而言的 在硬盘上开辟一块磁盘空间当做内存使用 xff0c 这部分硬盘空间就叫虚拟内存 xff0c 是Windows系统将部分硬盘空间作为内存来使用 xff0c 解决物理内存被占用过多 xff
  • vue常用指令

    常用指令 xff1a vue常用指令有 xff1a v html指令 v show指令 v if指令 v else指令 v else if指令 v for指令 v text指令 v bind指令 v on指令 v model指令等等 1 v
  • wsl的安装及迁移至其他盘

    安装 xff1a wsl是什么 xff1a 适用于Linux的Windows子系统 编辑 维基百科 xff0c 自由的百科全书 xff08 重定向自Windows Subsystem for Linux xff09 跳到导航跳到搜索 适用于
  • ubuntu 不能检测到显卡信息

    开始时 xff1a lspci grep 39 VGA 39 lspci grep 39 VGA 39 01 00 0 VGA compatible controller NVIDIA Corporation Device 2560 rev
  • 记录Vue项目中使用的各插件

    记录项目 package json 文件中各插件的使用 xff1a 目录 1 axios 2 babel polyfill 3 core js 4 echarts 5 element ui 6 es6 promise 7 js beauti
  • 看懂机器视觉(CV)\听懂语音识别(ASR)\理解自然语言处理(NLP)

    缩略语 机器视觉 xff08 CV xff09 Computer vision 语音识别 xff08 ASR xff09 Automatic Speech Recognition 自然语言处理 xff08 NLP xff09 Natural
  • zeal 文档下载及其离线文档下载

    下载地址 百度网盘 链接 xff1a https pan baidu com s 1r4d1OfrUTrbaZ9k9YfdWLA pwd 61 o7au 提取码 xff1a o7au 下载讲解 xff1a 1 下载安装 2 Tools gt
  • Linux系统部署JAVA项目

    Linux系统部署项目 一 准备工作 1 WinSCP 远程服务器可视化工具 2 Xshell5 linux服务器打命令用的 3 准备一台阿里云 华为云 腾讯云服务器 要求 xff1a 系统镜像centeOS7 0以上 二 开始搭建环境 1
  • Spring Boot 之---什么是热部署?---怎么使用?

    Spring Boot 之 什么是热部署 xff1f 怎么使用 xff1f 1 什么是热部署2 怎么启用热部署 xff08 1 xff09 手动配置 xff08 2 xff09 自动配置 总结 1 什么是热部署 所谓热部署 xff0c 就是
  • 什么是反向代理?

    正向代理 当客户端访问一台服务器有障碍 xff0c 访问不到的时候 xff0c 这时候就可以找一台可以访问到该服务器的另外一台服务器去代替他去访问 xff0c 这台代替他去访问的服务器称之为代理服务器 然后客户端就可以把请求发送给代理服务器
  • Java IO流 实现文件复制

    Java IO流 实现文件复制 思路 1 将指定文件转换成输入流 2 创建数组接收输入字节 3 将文件复制想要存放的轮径创建输出流 4 将输入流的字节输出出去 实现 span class token comment 创建输入和输出流 spa
  • Python之文件读写

    1 写文件 f 61 open 39 out txt 39 39 w 39 f write 39 s d d d d 0 0 0 0 0 0 0 39 bbx name bbx x bbx y bbx w bbx h f close 2 读
  • Java 基于TCP的socket实现文件传输

    Java 基于TCP的socket实现文件传输 基于TCP的socket结合java的io流 实现客户端与服务器之间的文件传输 Socket 套接字 xff08 socket xff09 是一个抽象层 xff0c 应用程序可以通过它发送或接
  • MySQL索引的创建与使用

    索引的分类 在学习如何创建索引之前 xff0c 先了解一下索引的分类 MySQL中分为 xff1a 普通索引 xff0c 唯一索引 xff0c 主键索引 xff0c 组合索引 xff0c 和全文索引 index name xff1a 索引名
  • ThreadLocal类

    ThreadLocal类 什么是ThreadLocal为什么ThreadLocal是线程安全的呢 什么是ThreadLocal ThreadLocal可以简单的理解为他其实就是一个工具类 xff0c 用来存储线程局部变量的一个工具类 xff
  • spring boot 访问HTML

    HTML整合spring boot 简介默认文件路径访问自定义文件路径访问 或通过Controller控制器层跳转访问 简介 SpringBoot默认的页面映射路径 xff08 即模板文件存放的位置 xff09 为 classpath te
  • HTML重定向解析ModelMap

    HTML实现重定向解析ModelMap 日常开发中 很多场景需要跳转页面 xff0c 又要携带参数 xff0c 重定向就可以起到很好的作用 业务场景 xff1a 登录成功后展示用户信息 登录页面输入用户名 密码进行登录访问 span cla
  • RHCE-ansible(一)--- 安装ansible、主机清单、sudo提权、特权升级

    目录 一 环境配置 1 配置三个主机 etc hosts 文件 xff0c 实现通过域名访问 2 配置SSH远程免密连接 2 1 在控制主机生成密钥 2 2 发送公钥到受控主机 二 受控主机 xff08 xixi xff09 安装ansib
  • 针对opencv导入Android studio不成功的解决办法?

    一 问题如下 xff1a AS gt File gt New gt Import Module 选择导入 压缩包路径 sdk java文件夹 xff0c 然后发现AS没有下一步 xff1f 二 解决办法 新建一个项目 在新建项目下创建一个包