- 博客(231)
- 资源 (2)
- 收藏
- 关注
原创 Android Camera2获取摄像头的视场角(FOV)信息
在摄影和计算机图形学中,FOV也经常与焦距(focal length)、相机镜头和投影类型(例如透视投影或正交投影)一起使用,以影响图像的外观和透视效果。不同的FOV设置可以用来创造不同的视觉效果,从而满足特定的需求和创意要求。FOV的大小会影响到用户或设备所能看到的景象的广度和逼真程度。较大的FOV可以提供更广阔的视野,使用户感到更加沉浸在虚拟现实环境或更好地观察到摄像机捕捉到的场景。然而,较大的FOV通常需要更复杂的设备和技术来实现。如图所示,要计算FOV,只要我们拿到传感器的长度。
2023-09-18 22:08:28
236
原创 C++ 新旧版本两种读写锁
读写锁(Read-Write Lock)是一种并发控制机制,用于多线程环境中实现对共享资源的高效读写操作。读写锁允许多个线程同时读取共享资源,但在有写操作时,需要互斥地独占对共享资源的访问,以确保数据的一致性。C++17前可以通过mutex和实现一个自定义的读写锁。});writing;});private:#include "ReadWriteLock.hpp" // 包含上面ReadWriteLock的头文件// 共享数据。
2023-09-04 21:32:47
270
原创 shell脚本获取参数列表
实现比较简单,主要是通过while循环去检索然后通过case去匹配参数列表。不是预设的option所有不会有相应匹配的代码执行。给shell脚本添加一个可执行权限。均成功匹配并执行相应信息打印;
2023-09-04 19:34:45
91
原创 OpenVINO使用OpenCL内存执行,避免拷贝
一、简介出于性能考虑,通常 CPU 无法满足耗时的要求,网络需要执行在 GPU 上增强性能,而数据的处理通常使用 OpenCL 也会比 CPU 快很多。所以我们要是可以直接将 OpenCL 处理后的内存给 OpenVINO 执行,就可以避免将 OpenCL 内存拷贝到 CPU 上,再从 CPU 拷贝到 OpenVINO 中。其实 OpenVINO 已经支持直接使用 OpenCL 的内存,只要他们公用一个 Context 即可。二、使用1.官方资料本文是基于 OpenVINO 2021 的 SDK
2022-03-28 14:52:07
932
原创 英特尔OpenVINO使用入门(C++集成方式)
一、简介OpenVINO™是英特尔推出的一个用于优化和部署AI推理的开源工具包。常用于 Inter 的集成显卡网络推理使用。官网地址:https://docs.openvino.ai二、下载下载地址:https://docs.openvino.ai/latest/openvino_docs_install_guides_installing_openvino_linux.html针对不同平台,在如图红框处选择不同的文档参考,按照官网文档一步步执行就行。三、使用假设你已经有了模型的 xml 文
2022-03-25 18:24:40
4036
原创 C++ 自定义项目日志库,支持log分级、标签、耗时统计、显示文件名方法名行号信息等,Windows&Linux通用
一、效果展示功能点:log输出时间,精确到毫秒log等级,支持 V,D,I,W,Elog标签,可以根据标签筛选不同的loglog信息,自动添加文件名、方法名、行号输出,帮忙快速定位到log在工程中的位置耗时统计功能附上测试代码:在linux下编译的话需要链接pthread,即编译命令加上 -lpthread。#include "LogUtils.h"#include <thread>void foo() { for (int i = 0; i < 5;
2021-12-01 16:33:53
3685
原创 Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现
一、前言Android自定义相机开发中,常常会有通过手势放大或缩小相机预览画面的需求,即数码变焦DigitalZoom。二、接口说明1. 获取最大的放大倍数float maxZoom = mCameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);怎么理解这个值呢?假设正常预览画面(即没有缩放)矩形为 activity_rect,放大后的预览画面矩形为 crop_rect,那么它们宽高的
2021-08-13 16:21:29
9280
5
原创 使用SSH无线连接Android手机设备调试
一、应用场景组内项目开发,Android 测试机有限,可在Android 测试机上开启一个 SSH 服务,然后通过 adb connect 直接连接,支持多个电脑同时连接。二、准备下载一个 sshdroid.apk,安装并启动,手机需要连接WiFi,点击启动如下所示:下载链接:https://download.csdn.net/download/afei__/20239709三、设置并连接1. 修改端口号由于默认的端口号是2222,试过通过连接不上,可以通过 adb 命令将端口号改为 555
2021-07-26 16:03:14
2752
1
原创 Windows10+Visual Studio 2015的OpenCV编译图文指南
一、下载OpenCV源码1.opencv下载地址:https://github.com/opencv/opencv/releases选择需要下载的版本,以3.4.14为例,选择下载源代码即可。下载后解压到: D:\Develop\OpenCV\opencv-3.4.14(自己选择一个自己的路径,这里以此路径为例)。2.opencv_contrib这个工程也可以选择不下载,主要包含一些AR增强、背景分割、生物视觉等模块,大部分用不着。介绍参考:https://blog.csdn.net/zmds
2021-06-04 17:40:24
462
1
原创 C++ Lambda表达式详解
一、简介C++11开始引入了Lambda表达式,可将lambda表达式视为包含公有operator()的匿名接口(或类),这样可以更方便的使用函数对象或创建匿名函数(类似Java的匿名内部类)。二、Lambda表达式定义lambda表达式的定义必须以方括号([])打头。这些方括号告诉编译器,接下来是一个lambda表达式。方括号后面是一个参数列表,该参数列表与不使用lambda表达式时提供给operator()的参数列表相同。[capture list] (params list) mutable
2021-04-26 16:34:03
2057
4
原创 Android文件游览选择器(支持选择多个文件、支持选择文件和文件夹,返回文件路径)
一、效果预览用的图标都是网上到处拷贝的,仅仅做个示例使用。截图 gif二、思路首先我们需要一个 FilePickerActivity 去显示页面。里面包含一个标题栏(ToolBar)、路径文本(TextView)和文件列表(RecyclerView)。RecyclerView 需要使用一个 Adapter 展示内容,内容来自于 File 类的 listFiles() 函数。最后我们完善那些返回、单击进入文件夹、长按选择、空页
2021-03-23 17:44:05
1361
原创 Android MediaMuxer+MediaCodec 编码yuv数据成mp4
一、简介使用 MediaCodec 对 yuv 数据进行编码,编码的格式为 H.264(AVC) 。使用 MediaMuxer 将视频track和音频track混合到 mp4 容器中,通常视频编码使用H.264(AVC)编码,音频编码使用AAC编码。二、流程分析(简要介绍一下流程,具体api的参数说明起来篇幅太大,不清楚的可以自己搜索一下)创建编码器并配置MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.M
2021-03-18 15:44:31
3124
7
原创 Android MediaExtractor+MediaCodec解码视频,返回yuv回调数据
一、解码流程分析(简要介绍一下流程,具体api的参数说明起来篇幅太大,不清楚的可以自己搜索一下)MediaExtractor 负责提取视频信息,创建一个该对象,并设置视频路径MediaExtractor extractor = new MediaExtractor();extractor.setDataSource(videoFilePath);视频文件一般都包含视频、音频等,我们需要获取视频轨道private static int selectVideoTrack(MediaExtr
2021-03-16 17:13:39
2296
5
原创 Android10有sdcard读写权限,仍无法读写sdcard中文件问题解决
一、问题场景在Android 10及以上系统的手机上测试发现,明明已经申请了 android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WRITE_EXTERNAL_STORAGE 权限,且应用也拥有了这些权限,但应用只能读写 Context.getExternalxxxDir() 获取到的目录,而无法读写 /sdcard 下的其余文件。这是由于 Android 在 10 之后又加强了数据隐私管理,可以把 Context.getExter
2021-03-05 11:23:36
7086
6
原创 Android使用OpenGL 3.0绘制yuv图片示例
一、思路首先OpenGL是没法直接绘制yuv数据的,所以我们需要在shader中将yuv数据转为rgb数据绘制。我们可以将yuv数据作为3个不同的纹理传入到片段着色器,然后通过yuv转rgb的公式,得到需要渲染的颜色值。公式为:( Y~ [0,1] U,V~[-0.5,0.5])R = Y + 1.4022 * VG = Y - 0.3456 * U - 0.7145 * VB = Y + 1.771 * U二、shader编写OpenGL 3.0 和 2.0 的 shader 语法
2020-10-12 18:00:53
2055
7
原创 OpenGL ES 3.0 片段着色器介绍和使用
一、简介备注:内容来自于《OpenGL ES 3.0编程指南》一书。片段着色器和顶点着色器一样都是运行在 GPU 上的程序,片段着色器将顶点着色器输出的片段作为输入,并负责输出每个片段的颜色。片段着色器的输入输出图示:二、内建变量内建变量是指着色器语言中已经定义好的,并有特殊意义的一些变量。1. 内建特殊变量变量描述gl_FragCoord片段着色器中的一个只读...
2019-08-26 18:50:08
2024
1
原创 浅谈 SurfaceView、TextureView、GLSurfaceView、SurfaceTexture
一、SurfaceViewSurfaceView 是一个可以在子线程中更新 UI 的 View,且不会影响到主线程。它为自己创建了一个窗口(window),就好像在视图层次(View Hierarchy)上穿了个“洞”,让绘图层(Surface)直接显示出来。但是,和常规视图(view)不同,它没有动画或者变形特效,一些 View 的特性也无法使用。概括:SurfaceView 独立于视图...
2019-08-22 20:34:38
9727
原创 NDK/C++ 耗时统计类TimeUtils
一、需求分析在开发阶段中,经常会需要打印出某些方式或步骤的耗时情况,大致需求如下:能打印出某个步骤的耗时;有开关可以控制打开和关闭耗时统计;使用方便。二、准备工作之前介绍过一个 log 输出的工具类,可以沿用,链接为:https://blog.csdn.net/afei__/article/details/81030373。LogUtils.h 示例:#ifndef _LOG_...
2019-08-21 17:37:42
3204
1
原创 Android 实时滤镜 Demo(GPUImage + Camera2 实现)
一、应用截图二、前言GPUImage 是一个开源的图像渲染的库,使用它可以轻松实现很多滤镜效果,也可以很轻松的定义和实现自己特有的滤镜效果。地址:https://github.com/cats-oss/android-gpuimage三、依赖工程要想使用 GPUImage,使用 Android Studio 只需要在 build.gradle 里面添加相关的依赖即可。implemen...
2019-08-12 18:50:17
5815
10
原创 OpenGL ES 之 2D 纹理介绍和使用
一、纹理概念纹理可以简单理解为物体表面的图案,OpenGL ES 3.0 中纹理有:2D纹理、2D纹理数组、3D纹理和立方图纹理。一个纹理的单独数据元素称为“纹素”(texture pixel 纹理像素的缩写)。1. 纹理的坐标系2. 2D纹理2D纹理是最基本和常用的纹理,可以把2D纹理想象为一个图像数据的二维数组。2D纹理的纹理坐标用一对2D坐标 (s, t) 指定,有时也称作 (u...
2019-07-29 15:08:55
3035
原创 OpenGL 纹理过滤和 mip 贴图
一、概念1. 纹理过滤当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤。纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXTURE_MIN_FILTER)。2. mip 贴图mip 贴图只适用于纹理过滤缩小的场景,其原理是将纹理按照2的倍数进行缩放,直至图像1*1的大小。在贴图时,OpenGL 会自动选择合适大小的纹理...
2019-07-19 17:08:55
1321
原创 OpenGL ES 3.0 纹理格式介绍及有效的内部格式、格式、类型组合
一、简介本文主要列举 OpenGL ES 3.0 中纹理格式有哪些,以及有效的内部格式、格式、类型组合。内容来自于 《OpenGL ES 3.0 编程指南 原书第2版》。纹理格式主要应用于加载图像数据的相关接口,其中用于加载2D和立方图纹理的基本函数是 glTexImage2D,在 3.0 中还有多种替代方法指定 2D 纹理,如不可变纹理 glTexStorage2D 和 glTexSubIm...
2019-07-16 17:42:24
6734
原创 NDK/JNI 开发之 Java 类和 C 结构体互转示例
一、简介JNI 开发中,常常会存在对应的 Java 类和 C 结构体需要互相转换。通过本实例学习和了解这个过程。预备知识:JNI数据类型和类型描述符介绍:https://blog.csdn.net/afei__/article/details/80899758JNI 方法及使用示例:https://blog.csdn.net/afei__/article/details/81016413......
2019-07-12 16:46:29
7439
3
原创 Android Camera2 预览数据格式 YUV_420_888 合集之 I420 转 Bitmap
一、简介说简单点,就是如何将 YUV I420 格式转换为 RGBA8888 格式。在 Camera2 API 中,相机预览不能直接使用 NV21 格式获取了,否则会报错一个 “NV21 format is not supported” 的异常。官方推荐我们使用 YUV_420_888 格式,关于这个格式的介绍,可以参考官方文档或者百度。如果获取到相机预览数据,并转化为 YUV I420 格...
2019-07-05 17:59:08
11200
3
原创 ReentrantLock的介绍使用及“生产者消费者”模式实现
一、简介ReentrantLock 即可重入锁的意思,是 java 控制线程同步的一种方式。和 synchronized 一样都是独占锁,只允许拿到锁的线程访问临界区。synchronized 优点是使用简单,不需要用户手动操作,加锁解锁的过程都是隐式的。ReentrantLock 则需要我们手动加锁和解锁(解锁操作通常放在 finally 代码块中保证执行),虽然使用更复杂但是其灵活性更好...
2019-07-02 16:58:52
1260
原创 Android 使用音量键/耳机按键控制拍照
一、简介一般手机都有 “音量上键”、“音量下键”,耳机线上通常也有 “上、中、下键”。有时我们会需要用到这些键来执行一些特殊的任务,例如 拍照,那么该怎么做呢?步骤就是:监听按键的事件并执行指定的任务最方便的方式是在 Activity 的 onKeyDown(int keyCode, KeyEvent event) 或者 onKeyUp(int keyCode, KeyEvent e...
2019-06-19 15:32:10
3513
1
原创 Android Camera2 获取预览帧的回调数据(带demo)
一、前言众所周知,在旧Camera接口中,我们通过 setPreviewCallback 或 setPreviewCallbackWithBuffer 接口来获取相机预览的帧数据。然而,在 Camera2 中,这些接口以及不复存在了,那么 Camera2 该如何获取预览帧数据呢?在 Camera2 中,我们通过 ImageReader 类来间接的获取预览帧数据,并在 onImageAvaila...
2019-06-15 16:22:53
19939
17
原创 OpenGL ES 顶点着色器内建变量和矩阵变换
一、简介顶点着色器用于基于顶点的操作,例如通过矩阵变换位置、计算照明方程式以生成逐顶点的颜色以及生成或者变换纹理坐标。常见概念:属性:用顶点数组提供的顶点数据(关键字:attribute/in)输出:在图元光栅化阶段为每个生成的片段计算顶点着色器的输出,并作为片段着色器的输入(关键字:varying/out)统一变量:顶点着色器使用的不变数据(关键字:uniform)采样器:顶点着色...
2019-04-25 17:20:11
1885
原创 OpenGL ES 绘制图元:glDrawArrays 和 glDrawElements 介绍
一、简介在 OpenGL ES 2.0 中,使用 glDrawArrays 和 glDrawElements 两个接口绘制图元。在 OpenGL ES 3.0 中,又新增了 glDrawRangeElements、glDrawElementsInstanced 和 glDrawArraysInstanced 三个接口用于绘制图元。二、函数介绍1. glDrawArrays/** * @...
2019-04-11 09:50:38
7031
原创 OpenGL ES 给着色器(Shader)中传递数据
一、前言在 OpenGL 开发中,肯定会接触到顶点着色器(vertex shader)和片段着色器(fragment shader),着色器语言的语法这里不做过多介绍,下面是一些着色器的示例:OpenGL ES 2.0 顶点着色器示例:uniform mat4 u_Matrix; // 统一变量attribute vec4 a_Position; // 属性(输入)void main(...
2019-04-08 19:16:55
4095
原创 OpenGL ES 3.0 shader 着色语言基础语法
前言在 OpenGL 开发中,不得不提到着色语言,着色语言用于编写顶点着色器和片段着色器。接下来就简单介绍一下着色语言的一些基础语法。备注:内容来自于《OpenGL ES 3.0编程指南》一书。一、版本规范在 OpenGL ES 3.0 中,顶点着色器和片段着色器的第一行总是声明着色器版本。使用如下语法声明着色器使用着色语言3.00版本:#version es 300没有声明或声明...
2019-03-31 00:38:34
3037
原创 OpenGL ES 3.0 对比 OpenGL ES 2.0 的异同点和新功能
一、相同点相比于 OpenGL ES 1.x 系列的固定功能管线,OpenGL ES 2.0 和 OpenGL ES 3.0 都是可编程图形管线。开发者可以自己编写图形管线中的 顶点着色器 和 片段着色器 两个阶段的代码。二、不同点OpenGL ES 3.0 是向后兼容 OpenGL ES 2.0 的。也就是说使用 2.0 编写的应用程序是可以在 3.0 中继续使用的。基于 2.0 拥有的...
2019-03-28 00:55:32
14449
2
原创 你可能不知道的几个 git 实用指令
前言很常见的不说了,介绍几个你们可能不知道但是却实用的命令吧,数量不多。一、克隆工程我们都知道克隆某个工程的代码使用 “git clone url”,这样默认拉取的是 master 分支的代码。如果你只想拉取某个分支的代码,可以使用该命令:git clone url -b <branch>示例:二、设置别名/缩写git 的诸多命令如 checkout,commit,s...
2019-02-28 23:29:22
693
1
原创 Android Studio 配置一键生成 JNI 头文件工具
一、前言我们知道进行 NDK 开发中,native 方法大多是需要进行静态注册的,如果手动一个个写,不仅容易出错,而且繁琐和浪费时间。那么有什么好用的工具可以使用呢?这个其实是有的,就在我们的JDK中就有一个 javah.exe 工具帮助我们生成 JNI 的头文件,我们只需要将其配置到 Android Studio 中就可以很方便的使用它了。二、效果示例如下,com_afei_opengl...
2019-02-28 00:03:17
5484
5
原创 Android Gradle 使用示例,各参数含义
前言目前 Android 的开发大都使用 Android Studio 了,而 Android Studio 所使用的 Gradle 也是大有文章,其中有许多可以定制和使用的技巧。Gradle 的语法是使用的 Groovy 语言,这里不做详细介绍了。下面是我总结的一些常用的选项以及释义:apply plugin: 'com.android.application'android {...
2019-02-27 00:18:55
1351
原创 自定义Camera系列之:GLSurfaceView + Camera2
一、前言假如你要使用 OpenGL ES 来渲染相机的话,使用 GLSurfaceView 将是一个很常用的选择。这里介绍 GLSurfaceView + Camera2 的组合。如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解CameraDevice详解CameraCharacteristics详解CameraCapture...
2019-02-14 00:16:19
5173
3
原创 自定义Camera系列之:TextureView + Camera2
一、前言之前已经介绍过过时的旧 Camera 的使用了,毕竟在从 Android 5.0 后推荐使用 Camera2 了,所以现在开始介绍 Camera2 相关使用。该篇介绍 TextureView ,这也是谷歌示例中使用的组合。如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解CameraDevice详解CameraCharact...
2019-01-31 00:12:52
5052
12
原创 自定义Camera系列之:SurfaceView + Camera2
一、前言之前已经介绍过过时的旧 Camera 的使用了,毕竟在从 Android 5.0 后推荐使用 Camera2 了,所以现在开始介绍 Camera2 相关使用。老规矩还是从 SurfaceView 说起。如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解CameraDevice详解CameraCharacteristics详解...
2019-01-27 23:43:36
7883
10
原创 自定义Camera系列之:GLSurfaceView + Camera
一、前言假如你要使用 OpenGL ES 来渲染相机的话,使用 GLSurfaceView 将是一个很常用的选择。这里介绍 GLSurfaceView + Camera 的组合。虽然从 Android 5.0 后推荐使用 Camera2 了,不过某些旧工程或者需要适配低版本的场景还是用得着旧的 Camer API 的。为什么选择 GLSurfaceView ?GLSurfaceView 继...
2019-01-23 00:08:12
4069
8
设计模式之禅第二版
2018-06-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人