android2022配置opencv4android480

news2024/11/16 21:27:02

1,安装android studio2022。

2,下载OPENCV4ANDROID,解压到任意盘中。

3,File->New->New Project,选择Empty Views Activity。再选择语言,本文选择JAVA。

4,File->New->Import Module->Source directory->选择解压后的OPENCV的sdk文件夹,Module name随便更改,点击确定。

5,Android Studio下面出现如下错误,需要更改一些配置。

6,File->Project Structure

 更改opencv480的三个部分,Compile Sdk Vision,Target SDK Vision, Min SDK Vision, 这三个模块,跟app的模块一致。

点击Dependencies,发现有app,opencv480,点击app,右上角+,点击添加module dependency,点击选中,然后点击ok。

 

7,点击opencv480->java->AndroidManifest.xml,双击,将pack="org.opencv"删除,保存。

8,项目切换到Project模式,展开opencv480(自己命名的OPENCV工程名字),点击build.gradle,双击打开。

在android里面增加 namespace "org.opencv",防止报错

9,但是点编译会报错,看报错是找不到OpencvEngineInterface和BuildConifg

上面的原因是默认编译的时候没带aidl和buildConfig

回到opencv的build.gradle加上buildFeatures

 编译可以通过了

6,7,8,9步骤可以重复,将更改后的两个文件,AndroidManifest.xml和build.gradle,放到opencv4android解压后的相同地方,替换原来的,就行了,以后不用再配置了

给一段简单的界面和代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="80dp"
        android:layout_marginLeft="54dp"
        android:layout_marginBottom="80dp"
        android:text="灰度" />

    <ImageButton
        android:id="@+id/imageButton"
        android:layout_width="500dp"
        android:layout_height="400dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginBottom="209dp"
        android:scaleType="centerCrop"
        app:srcCompat="@drawable/a1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="80dp"
        android:layout_marginRight="80dp"
        android:layout_marginBottom="80dp"
        android:text="返回" />

</RelativeLayout>

 java代码

package com.example.myopencvtest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button btn1,btn2;
    private ImageView img1;
    private Mat srcmat1,srcmat2;
    private Bitmap bitmap;

    @Override
    protected void onDestroy() {
        super.onDestroy();
        srcmat1.release();
        srcmat2.release();
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //OpenCV 初始化
        inLoadOpenCV();
        //按钮 初始化
        btn1 = findViewById(R.id.button);
        btn2 =findViewById(R.id.button2);
        img1 = findViewById(R.id.imageButton);
        srcmat1 = new Mat();
        srcmat2 = new Mat();
        try {
            srcmat1 = Utils.loadResource(this, R.drawable.a1);//图片名称
        } catch (IOException e) {
            e.printStackTrace();
        }
//        转成灰度图
        btn1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
//                Toast toast = Toast.makeText(MainActivity.this, "Button被点击了", Toast.LENGTH_SHORT);
//                toast.show();
                //彩色转灰色
                Imgproc.cvtColor(srcmat1,srcmat2,Imgproc.COLOR_BGRA2GRAY);
                //Imgproc.putText(srcmat1,"I'm a cat" ,new Point( srcmat1.width()/2.,srcmat1.height()/3),2,2,new Scalar(0,255,0),3);
                bitmap = Bitmap.createBitmap(srcmat2.width(), srcmat2.height(), Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(srcmat2, bitmap);
                img1.setImageBitmap(bitmap);
            }
        });

//        返回原图
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.a1);//图片名称
                img1.setImageBitmap(bitmap);
            }
        });
    }

    //OpenCV库的加载
    private void inLoadOpenCV(){
        boolean success= OpenCVLoader.initDebug();
        if (success){
            Toast.makeText(this.getApplicationContext(),"成功",Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(this.getApplicationContext(),"失败",Toast.LENGTH_LONG).show();
        }
    }
}

 同时,记得在res/drawable下面放一个叫a1.jpg的图片

 点击运行,就有结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

白嫖idea

白嫖idea 地址 https://www.jetbrains.com/toolbox-app/

Spark中join和cogroup

笔者最近在复习spark&#xff0c;发现对cogroup算子掌握不牢固。因此写下这篇博客&#xff0c;方便以后学习。 join算子 join算子相当于将两个rdd进行内连接&#xff0c;在join的结果中&#xff0c;返回值是key和元组 cogroup算子 cogroup算子相当于将两个rdd中 相同键的每…

LeetCode538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 文章目录 [538. 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/)一、题目二、题解方法一&#xff1a;递归&#xff08;中序遍历与节点更新&#xff09;方法二&#xff1a;反向中序遍历与累加更新&#x…

作业人员护目镜佩戴自动识别

作业人员护目镜佩戴自动识别通过pythonyolo深度学习算法模型&#xff0c;作业人员护目镜佩戴自动识别利用布设摄像头并结合图像算法能够实时监测作业人员是否佩戴护目镜。一旦发现未佩戴的情况立即发出警告&#xff0c;并及时记录异常情况。在YOLOv1提出之前&#xff0c;R-CNN系…

iPhone手机如何删除照片应用程序的文稿与数据

场景&#xff1a;iPhone使用多年&#xff08;穷没钱换新的&#xff09;照片视频一直没有删除&#xff0c;最近打开微信提示空间不足&#xff0c;删除100多G照片后&#xff0c;照片应用程序的文稿与数据仍然100G没有变化。 不想重置手机&#xff0c;处理方法如下&#xff0c;PC端…

.netcore发布独立版部署

.NetCore 在发布独立版时会打包独立环境&#xff0c;就算服务没有安装环境也能运行&#xff0c;这就是.NetCore跨平台的特性之一。 按照微软的传统配套&#xff0c;c#开发的项目一般都是发布打包程序部署在iis&#xff0c;但是.netcore 跨平台的&#xff0c;就是说当发布独立版…

全栈之前端 | 2.CSS3基础知识之选择器学习

关注回复【学习交流群】加入【安全开发运维】答疑交流群 请朋友们【多多点击文中的广告】&#xff0c;支持作者更新更多文章。 目录: 0x00 前言简述 Q: 选择器是什么&#xff1f; 你也许已经见过选择器了。CSS 选择器是 CSS 规则的第一部分。它是元素和其他部分组合起来告诉浏览…

Sping源码(七)— 后置处理器(自定义后置处理器)

上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程&#xff0c;以及BFPP和BDRPP类的介绍&#xff0c;这篇文章我们来自定义实现一个类的后置处理器。 自定义PostProcessor 自定义PostProcessor的方式一共两种&#xff0c;都是根据invokeBeanFactoryPo…

SM2(国密)非对称(公钥私钥)在线加密解密

SM2(国密)非对称(公钥私钥)在线加密/解密/生成密钥对

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下&#xff0c;kafka的结构和rocketmq的机构基本上一样&#xff0c;都需要一个注册…

2023 江苏省研究生数学建模 A 题思路

2023年江苏省研究生数学建模科研创新实践大赛A题新型抗癌药物研究模型探索靶向治疗是治疗肿瘤疾病的一种重要方法&#xff0c;它具有针对性强、疗效显著等特点。现有的靶向药物通常针对特定的基因突变靶点&#xff0c;容易出现耐药性。目前&#xff0c;一种由癌症诱发的血管新生…

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例,并做可视化UI界面展示(附源码)

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例(附源码)。 为了增强程序的可观测性,方便问题定位,在发起数据库操作请求时我们也可以调用代码统一集成链路跟踪的能力,Jaeger 是当今比较流行的选择。使用 Gorm 来将操作信息集成到 Jaeger 中。 全面…

Gazebo GPU加速【gzserver running in GPU】

文章目录 Gazebo GPU加速1. 问题2. 解决办法2.1 本机运行 2.2 headless3. 补充3.1 如何确定的Gazebo为OpenGL渲染3.2 显卡驱动--no-opengl-files3.3 nouveau Gazebo GPU加速 1. 问题 Gazebo仿真帧率极低&#xff0c;fps在10以下&#xff0c;同时显卡驱动已安装&#xff0c;但…

WebRTC之FEC前向纠错协议

FEC前向纠错用于丢包恢复&#xff0c;对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包&#xff0c;可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽&#xff0c;所以一般会根据网络状况、丢包率来动态调整FEC冗余系数&#xff0c;也会结合NACK/…

mtk8175添加一款camera(GC5035)流程

说明&#xff1a; 在MTK平台添加一款新的Camera IC 需要如下三个步骤&#xff1a; device目录下面添加相关宏定义。 kernel目录下面添加dts配置&#xff0c;即硬件管脚、时钟、电源、I2C等的配置和 添加相关的驱动。 vendor 目录下面添加相关的效果文件。 下面是自己在MTK…

在Java8的forEach()中使用break/continue

今天在开发中&#xff0c;使用forEach()来遍历元素执行业务操作&#xff0c;发现如果判断不符合某个条件时就要continue&#xff0c;不能继续向后执行了。但是在forEach()中不能使用for循环中的continue和break&#xff0c;那改如何退出呢&#xff1f; 答案是&#xff1a;使用…

利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

&#xff08;1&#xff09;CV2中的绘图函数&#xff1a; cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 &#xff08;2&#xff09;注释 img表示需要绘制的图像color表示线条的颜色&#xff0c;采用颜色矩阵…

Python基础学习第一天:关于Python的简单介绍

前言 最近一批批大一新生都要开始踏入校园了&#xff0c;计算机专业 emmm…如果有需要学习python的&#xff0c;尤其是还没开学的&#xff0c;确实可以开始找找资料看看python了&#xff0c;如果是自己本来就对python感兴趣&#xff0c;更应该需要看看了&#xff0c;毕竟学校到…

【五】sql 语言 -- 概览

SQL 语言概述SQL 语言提出和发展SQL 语言的功能概述利用 SQL 语言建立数据库学生选课数据库 SCT1. 定义数据库和表 SQL-DDL创建数据库的语句—Create Database创建关系/表的语句—Create Table 2. 向表中追加元组 SQL-DML 利用 SQL 语言进行简单查询单表查询 - SELECT-FROM-WHE…