创建的空 OpenCV 安卓应用程序以支持摄像头

在本节中,我们将扩展上一节中创建的空 OpenCV 应用程序以支持摄像头。我们将获取摄像头帧并将其显示在屏幕上。

告诉系统我们需要相机权限。将以下代码添加到文件MyApplication/app/src/main/AndroidManifest.xml

    <uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera" android:required="false"/><uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/><uses-feature android:name="android.hardware.camera.front" android:required="false"/><uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>

  1. 转到activity_main.xml布局并删除带有文本“Hello World!”的 TextView

TextView这也可以在代码或拆分模式下通过从 XML 文件中删除块来完成。

  1. 将相机视图添加到布局中:

    在布局描述中添加方案:

xmlns:opencv = "http://schemas.android.com/apk/res-auto"

   TextView用小部件替换org.opencv.android.JavaCameraView

    <org.opencv.android.JavaCameraViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:visibility="gone"android:id="@+id/tutorial1_activity_java_surface_view"opencv:show_fps="true"opencv:camera_id="any" />
  1. 如果你收到布局警告,请用for和properties替换fill_parentmatch_parentandroid:layout_widthandroid:layout_height

您将获得如下代码:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:opencv="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent" ><!-- [camera_view] --><org.opencv.android.JavaCameraViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:visibility="gone"android:id="@+id/tutorial1_activity_java_surface_view"opencv:show_fps="true"opencv:camera_id="any" /><!-- [camera_view] --></FrameLayout>
  1. 从 继承主类。CameraActivity 实现相机权限请求和org.opencv.android.CameraActivityCV 应用程序所需的一些其他实用程序。我们想要重写的方法包括onCreateonDestroy、和onPauseonResumegetCameraViewList
  2. 实现接口org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2 onCameraFrame方法应该返回Mat带有内容的对象以供渲染。示例仅返回相机帧以供预览:return inputFrame.rgba();
  3. 分配org.opencv.android.CameraBridgeViewBase对象:
    • 它应该在应用程序启动时创建(onCreate方法),并且该类应该设置为监听器
    • 在暂停/恢复(onPauseonResume方法)时应该禁用/启用它
    • 应在应用程序完成时禁用(onDestroy方法)
    • 应归还getCameraViewList
  4. 您可以选择禁止手机调暗屏幕或锁定:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

最终的源码:

package org.opencv.samples.tutorial1;import org.opencv.android.CameraActivity;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.Toast;import java.util.Collections;
import java.util.List;public class Tutorial1Activity extends CameraActivity implements CvCameraViewListener2 {private static final String TAG = "OCVSample::Activity";private CameraBridgeViewBase mOpenCvCameraView;public Tutorial1Activity() {Log.i(TAG, "Instantiated new " + this.getClass());}@Overridepublic void onCreate(Bundle savedInstanceState) {Log.i(TAG, "called onCreate");super.onCreate(savedInstanceState);if (OpenCVLoader.initLocal()) {Log.i(TAG, "OpenCV loaded successfully");} else {Log.e(TAG, "OpenCV initialization failed!");(Toast.makeText(this, "OpenCV initialization failed!", Toast.LENGTH_LONG)).show();return;}getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.tutorial1_surface_view);mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);mOpenCvCameraView.setCvCameraViewListener(this);}@Overridepublic void onPause(){super.onPause();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onResume(){super.onResume();if (mOpenCvCameraView != null)mOpenCvCameraView.enableView();}@Overrideprotected List<? extends CameraBridgeViewBase> getCameraViewList() {return Collections.singletonList(mOpenCvCameraView);}@Overridepublic void onDestroy() {super.onDestroy();if (mOpenCvCameraView != null)mOpenCvCameraView.disableView();}@Overridepublic void onCameraViewStarted(int width, int height) {}@Overridepublic void onCameraViewStopped() {}@Overridepublic Mat onCameraFrame(CvCameraViewFrame inputFrame) {return inputFrame.rgba();}
}

就是这样!现在您可以在设备上运行代码来检查它。

记录一下最重要的步骤

每个带有 UI 的 Android 应用程序都必须实现 Activity 和 View。首先,我们创建空白活动和默认视图布局。最简单的以 OpenCV 为中心的应用程序必须执行 OpenCV 初始化,创建一个视图来显示来自摄像头的预览,并实现CvCameraViewListener2接口以从摄像头获取帧并对其进行处理。

首先,我们使用 XML 布局创建应用程序视图。我们的布局仅包含一个类的全屏组件org.opencv.android.JavaCameraView。此 OpenCV 类继承自CameraBridgeViewBase扩展类SurfaceView,并在底层使用标准 Android 相机 API。

CvCameraViewListener2接口允许您在从相机抓取帧之后和在屏幕上渲染之前添加一些处理步骤。最重要的方法是onCameraFrame。这是一个回调函数,在从相机检索帧时调用。它期望该onCameraFrame函数返回将在屏幕上绘制的 RGBA 帧。

回调将相机中的帧作为类对象传递给我们的类CvCameraViewFrame。此对象具有rgba()gray()方法,可让用户获取彩色或单通道灰度帧作为Mat类对象。

笔记

不要保存或使用回调CvCameraViewFrame之外的对象onCameraFrame。此对象没有自己的状态,并且其在回调之外的行为不可预测!

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

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

相关文章

JAVA 架构师面试 100套含答案:JVM+spring+ 分布式 + 并发编程》...

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

Web3与区块链如何通过智能合约实现自动化生态?

Web3和区块链正在重塑互联网的未来&#xff0c;其核心在于去中心化和用户数据自主权。而作为区块链技术的重要组成部分&#xff0c;智能合约通过自动执行预设规则&#xff0c;大大提升了效率和安全性。本文将探讨Web3与区块链如何通过智能合约实现生态的自动化。 什么是智能合约…

【机器学习】机器学习的基本分类-监督学习-随机森林(Random Forest)

随机森林是一种基于集成学习&#xff08;Ensemble Learning&#xff09;思想的算法&#xff0c;由多个决策树构成。它通过结合多棵决策树的预测结果来提升模型的泛化能力和准确性&#xff0c;同时减少过拟合的风险。 1. 随机森林的核心思想 多样性&#xff1a; 随机森林通过引…

MongoDB集群的介绍与搭建

一.MongoDB集群的介绍 注意&#xff1a;Mongodb是一个比较流行的NoSQL数据库&#xff0c;它的存储方式是文档式存储&#xff0c;并不是Key-Value形式&#xff1b; MongoDB集群的优势主要体现在以下几个方面&#xff1a; (1)高可用性 MongoDB集群支持主从复制和故障转移机制&…

防抖与节流

防抖 当某个事件触发时&#xff0c;等待一段时间再执行函数。如果在这段时间内事件再次被触发&#xff0c;那么就重新计时&#xff0c;换句话说&#xff0c;防抖可以确保函数在事件结束后才被执行&#xff0c;避免了多次触发。 应用场景&#xff1a; 搜索框输入&#xff1a;…

DKMS介绍

文章目录 一、安装DKMS二、DKMS使用示例1. 源码准备2. 增加dkms.conf3. 添加模块4. 编译模块5. 安装模块 三、基于DKMS的deb安装包制作 Dynamic Kernel Module Support&#xff08;DKMS)是一个用于动态管理内核模块的框架&#xff0c;由DELL创建的项目&#xff0c;它可以帮我们…

【LeetCode】498.对角线遍历

无论何时何地&#xff0c;我都认为对于一道编程题&#xff0c;思考解法的时间用于是实际动手解决问题的2倍&#xff01;如果敲键盘编码需要5min&#xff0c;那么思考解法的过程至少就需要10分钟。 1. 题目 2. 思想 其实这就是一道模拟题&#xff0c;难度中等。做这种题的关键就…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…

使用 libssh2_session_set_timeout 设置 SSH 会话超时时间

使用 libssh2_session_set_timeout 设置 SSH 会话超时时间 函数原型参数说明返回值示例代码注意事项libssh2_session_set_timeout 是 libssh2 库中的一个函数,用于设置 SSH 会话的超时时间。这对于防止网络延迟或连接中断导致的长时间挂起非常有用。 函数原型 int libssh2_se…

如何用注册机破解Reflexive游戏

相信有许多小朋友&#xff08;像我以前一样&#xff09;已经迫不及待地准备准备对浩瀚的、像三星堆一般的Reflexive游戏合集进行考古挖掘工作了。不巧的是&#xff0c;打开游戏之后发现常常提示要付费才能解锁完整版。 一、下载注册机与破解文件 首先&#xff0c;在我的永硕网…

红外跟随避障模块详解

在智能车、机器人和自动化等领域避障技术是确保安全和高效运行的关键。红外避障模块作为一种常见的避障解决方案&#xff0c;因其非接触、响应速度快和抗干扰能力强等优点而备受青睐。本文将详细介绍红外避障模块的特点、工作原理、以及应用案例&#xff0c;帮助您更好地了解这…

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中&#xff0c;系统分析员可以用序列图来表达&#xff0c;系统内部一群对象合力完成某一个系统用例时&#xff0c;执行期间的交互情形。之后&#xff0c;序列图可能通过设计…

Unity 设计模式-策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一系列算法&#xff0c;并将每种算法封装到独立的类中&#xff0c;使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化&#xff0c;客户端通过与这些策略对象进…

空间异质性数据分析不再复杂:地理加权回归分析、主成分分析、判别分析、分位数回归分析、线性回归等

目录 专题一 地理加权回归下的描述性统计学 专题二 地理加权主成分分析 专题三 地理加权回归 专题四 高级回归与回归之外 更多了解 在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能…

【spring mvc】全局处理请求体和响应体

目录 说明实现效果逻辑图 实现步骤创建公共处理的请求和响应的类api接口测试前端请求响应结果 扩展Response响应格式实体ResponseCode 响应状态码RSA工具类 RequestBodyAdvice 介绍使用场景 ResponseBodyAdvice 介绍使用场景 说明 由于项目中需要进行加密传输数据提高项目安全…

【计算机网络】实验8:聚合了不存在的网络导致的路由环路问题

实验 8&#xff1a;聚合了不存在的网络导致的路由环路问题 一、 实验目的 聚合了不存在的网络导致的路由环路问题。 网络故障导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、聚合了不存在的网络导致的路由环路问题 (1) 第一步&am…

【Leetcode】189.轮转数组

题目链接&#xff1a; 189.轮转数组 题目描述&#xff1a; 解题思路&#xff1a; 要想实现数组元素向右轮转k个位置&#xff0c;可是将数组三次反转来实现 以 nums [1,2,3,4,5,6,7], k 3 为例&#xff0c;最终要得到[5,6,7,1,2,3,4]: 第一次反转&#xff1a;将整个数组反转…

设计模式c++(二)

文章目录 十三、门面模式_Facade十四、代理模式_Proxy十五、适配器_Adapter十六、中介者_Mediator十七、状态模式_State十八、备忘录_Memento十九、组合模式_Composite二十、迭代器_Iterator二十一、职责链_Chain Of Resposibility二十二、命令模式_Command二十三、访问器_Vist…

shell 3 脚本参数传递与数字运算(泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…