android2022配置opencv4android480

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"?>
<RelativeLayoutxmlns: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"><Buttonandroid: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="灰度" /><ImageButtonandroid: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" /><Buttonandroid: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;@Overrideprotected void onDestroy() {super.onDestroy();srcmat1.release();srcmat2.release();}@Overrideprotected 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() {@Overridepublic 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.mzph.cn/news/56233.shtml

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

相关文章

麒麟系统开启root账户及自动登陆

1.首先我们通过“开始菜单t”快捷键打开命令行页面&#xff0c;然后我们通过 cd /usr/share/lightdm/lightdm.conf.d/进入对应系统目录。之后我们通过ls命令查看目录中的文件&#xff0c;找到95-ukui-greeter.conf这个文件。 2.之后我们通过命令 sudo vim 95-ukui-greeter.c…

【C++进阶(二)】STL大法--vector的深度剖析以及模拟实现

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; vector 1. 前言2. 熟悉vector的接口函数2.1 vec…

Redis Replication

Redis Replication 1、前言 在单节点搞事情, 存在的问题包括存量问题和增量问题两类, 解决方案就是1个不行上N个, 做到单机维度宕机但服务维度是可用的。 1.1 存量问题 如果目前的单节点QPS满足(也就是综合瓶颈还没达到), 那么只有宕机能影响到。如果业务量不大, 又是出于成…

leetcode 1022.从根到叶的二进制数之和

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers/description/ 代码&#xff1a; class Solution { public:int sum (TreeNode* root , int num 0) {if (root nullptr) {return 0;}int cur num r…

三种常用盒子布局的方法

在Vue中&#xff0c;可以使用各种CSS布局属性和技巧来设置盒子的布局。以下是一些常用的方法&#xff1a; 1.使用Flexbox布局&#xff1a;在包含盒子的父元素上设置display: flex&#xff0c;然后可以使用flex-direction、justify-content和align-items 等属性来控制盒子的布局…

Docker学习笔记

Docker学习笔记 docker的作用docker的基本组成安装docker阿里云镜像加速run的流程和docker原理 docker的思想来自于集装箱。 核心思想&#xff1a; 隔离 docker可以通过隔离机制将服务器利用到极致。 虚拟机&#xff1a;在windows中装一个Vmware&#xff0c;通过这个软件可以虚…

机器学习基础09-审查分类算法(基于印第安糖尿病Pima Indians数据集)

算法审查是选择合适的机器学习算法的主要方法之一。审查算法前并 不知道哪个算法对问题最有效&#xff0c;必须设计一定的实验进行验证&#xff0c;以找到对问题最有效的算法。本章将学习通过 scikit-learn来审查六种机器学习的分类算法&#xff0c;通过比较算法评估矩阵的结果…

Ubuntu本地快速搭建web小游戏网站,并使用内网穿透将其发布到公网上

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

Zebec在Nautilus Chain 开启质押,ZBC 将极致通缩

前不久&#xff0c;Zebec Protocol旗下的模块化公链Nautilus Chain上线了主网&#xff0c;模块化Layer3体系正式开启。在Nautilus Chain主网上线的初期阶段&#xff0c;将以ZBC通证作为链上主要的职能通证&#xff0c;用于Gas消耗、治理等诸多方面。据悉&#xff0c;此前在测试…

css3英文文字换行,超过两行...展示

需求&#xff1a;超过两行...展示 开发的过程中发现div内容中文可以换行英文不换行&#xff0c;导致长度会溢出。 是英文全英文的话浏览器会解析成一个单词&#xff0c; 加上这句就好了 word-break:break-all; 一开始不知道是会解析成一个单词&#xff0c;用字符串拼接处理…

await Promise内部执行setTimeout定时器,提前clearTimeout,导致卡死的情况分析及解决方案

背景概述 在我们日常开发中&#xff0c;我们常常需要在某个地方暂停某个动作一段时间。这个时候&#xff0c;我们的通常做法是使用setTimeout&#xff0c;配合promise实现。也就是如下代码。 function delay(ms) {return new Promise((resolve, reject) > {setTimeout(() …

element上传图片,调取接口传值,参数FormData为空

需求 输入完reason&#xff0c;选完文件后&#xff0c;点击提交按钮后 调取接口。 遇到的问题 上传文件orderFile 字段一直为空 打印了发现&#xff0c;上传文件也是有值得。但是传到接口中就为空 原因 json里边不能放file&#xff0c;但是formData里可以放 file 也可以放…

Kotlin全方位-简单解析

Kotlin是一种现代化的静态类型编程语言&#xff0c;由JetBrains公司开发。它可以在Java虚拟机&#xff08;JVM&#xff09;上运行&#xff0c;并且可以与Java代码无缝地进行互操作。Kotlin旨在提供更简洁、更安全、更具表达力和更高效的编程语言。 Kotlin主要运用 Android开发…

AIGC ChatGPT 实现动态多维度分析雷达图制作

雷达图在多维度分析中是一种非常实用的可视化工具&#xff0c;主要有以下优势&#xff1a; 易于理解&#xff1a;雷达图使用多边形或者圆形的形式展示多维度的数据&#xff0c;直观易于理解。多维度对比&#xff1a;雷达图可以在同一张图上比较多个项目或者实体在多个维度上的…

OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV不仅能够处理图像&#xff0c;还能够处理视频。视频是由大量的图像构成的&#xff0c;这些图像是以固定的时间间隔从视频中获取的。这样&#xff0c;就能够使用图像处理的方法对这些图像进行处理&#xff0c;进而达到…

openGauss学习笔记-52 openGauss 高级特性-LLVM

文章目录 openGauss学习笔记-52 openGauss 高级特性-LLVM52.1 适用场景52.2 非适用场景52.3 其他因素对LLVM性能的影响52.4 LLVM使用建议 openGauss学习笔记-52 openGauss 高级特性-LLVM openGauss借助LLVM&#xff08;Low Level Virtual Machine&#xff09;提供的库函数&…

【C++】—— C++11之线程库

前言&#xff1a; 在本期&#xff0c;我将给大家介绍的是 C11 中新引进的知识&#xff0c;即关于线程库的相关知识。 目录 &#xff08;一&#xff09;线程库的介绍 1、线程库的由来 2、线程库的简单介绍 &#xff08;二&#xff09;线程函数参数 &#xff08;三&#xf…

window系统中如何判断是物理机还是虚拟机及VMPROTECT无法检测云主机

为什么要判断物理机&#xff0c;因为授权不能对虚拟机安装后的软件进行授权。虚拟机可以复制可以克隆&#xff0c;无法作为一个不可复制ID来使用。 总结了如何判断物理机&#xff1a; 1. 用systeminfo的系统型号。&#xff08;注&#xff0c;有资料是看处理器和bios。但是我这…

List与String数组互转

一.List 转为 String 数组 1.使用toArray方法 public static void main(String[] args) {List<String> list Lists.newArrayList("1","2","3");// Java6以前版本String[] str1 list.toArray(new String[list.size()]);// Java6以后版本…

高并发场景加锁方式及存在的问题

在多线程高并发场景下&#xff0c;为了保证共享资源的正确性&#xff0c;通常会采用加锁的方式。关于加锁以及一些相关的问题&#xff0c;这里根据个人学习了解的做个汇总。 加锁方式&#xff1a; 1、JVM锁1.1 多例模式1.2 事务1.3 集群 2、MySQL悲观锁乐观锁2.1 悲观锁2.2 乐…