自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(240)
  • 资源 (2)
  • 收藏
  • 关注

原创 OpenGL ES查询是否支持float浮点数据类型纹理格式

项目开发中发现之前可用的代码换了一台设备后结果一直错误,后来发现是因为使用了 float 浮点数据类型创建的纹理导致的,查阅得知 OpenGL ES 中硬件可能不支持特定的纹理格式和数据类型。通常情况下,OpenGL ES 实现至少应该支持 GL_UNSIGNED_BYTE 类型的纹理,因为它是最基本的纹理数据类型之一,但是对于其他类型(如 GL_FLOAT)的支持可能因硬件而异。

2024-04-09 11:00:01 309

原创 Android手势识别GestureDetector和ScaleGestureDetector介绍与使用,以自定义一个可拖拽拉伸的ImageView为例

GestureDetector主要用于检测单指手势,例如单击、长按、滑动等,不支持多指手势。用于检测缩放手势,即双指捏合或者扩张的手势。它提供了 onScale() 和 onScaleBegin() 等回调方法来处理缩放手势的开始、进行中和结束时的事件。首先,我们可以直接继承 ImageView,并通过 Matrix 来控制图片的移动和拉伸。其次,使用 GestureDetector 监听移动的相关事件,使用 ScaleGestureDetector 监听拉伸的相关事件。

2024-04-07 19:04:32 2419

原创 MediaRecorder 介绍和使用,结合Camera2录制视频实例(含完整项目)

在中通过设定的宽高去修改view的宽高。@Override} else {} else {可以将相机的一些基础操作和实现都封装起来,并在CameraSurfaceView中完成相关操作。完整文件地址:// 封装相机的各种操作// 设置屏幕常亮@Override@Override// 将View的大小修改为和相机预览分辨率相同的比例@Override。

2023-12-14 19:38:47 4667 1

原创 OpenGL ES eglCreatePbufferSurface() 和 eglCreateWindowSurface() 的对比和使用

//< @param [in] dpy EGL显示连接///< @param [in] config EGL配置///< @param [in] attrib_list 属性列表,用于指定Pbuffer的一些属性,可以为NULL///< @return 返回EGL表面///< @param [in] dpy EGL显示连接///< @param [in] config EGL配置///< @param [in] win 与窗口系统相关的本地窗口类型。

2023-12-05 10:45:48 2267

原创 OpenGL ES 帧缓冲对象介绍和使用示例

默认情况下,OpenGL渲染的目标是屏幕,但如果你不想直接渲染到屏幕上,还需要对渲染结果做某些后期处理、渲染到纹理、阴影映射等操作,便可以使用帧缓冲对象,实现离屏渲染。帧缓冲对象(Frame Buffer Object,FBO)是一个概念容器,它可以包含颜色缓冲区、深度缓冲区、模板缓冲区等,形成一个完整的渲染目标。通过使用帧缓冲对象,可以实现离屏渲染、多重渲染目标(MRT)等高级渲染技术,而不必直接渲染到屏幕。

2023-12-04 14:52:19 1753

原创 OpenGL ES 读取纹理数据到CPU地址,用于保存或其他计算等

glReadPixels() 是一个同步读取操作,这个函数其实是直接用于从帧缓冲区中读取像素的颜色值,以获取渲染后的图像数据进行后续处理、保存到文件或其他用途。所以我们可以先把纹理绑定到一个FBO(帧缓冲对象)上,然后再通过 glReadPixels() 读取纹理的值。GLint x, // 左上角x坐标GLint y, // 左上角y坐标GLsizei width, // 读取区域的宽度GLsizei height, // 读取区域的高度。

2023-11-22 20:58:01 910

原创 Android Activity 启动时获取View的宽高为0?正确获取View宽高的方式

方法对于确保在视图完成布局后执行操作非常有用,但在处理复杂布局时需要谨慎使用,以避免引入不必要的延迟,更推荐使用下面这种。方法去获取 View 的宽高信息,会发现拿到的宽高大概率都是0。这是由于 View 很可能还未完成布局,而没有宽高信息。通过 View 的 ViewTreeObserver 添加一个监听事件,在 View 的大小完成计算后自动回调。备注:AndroidX 中可以使用。判断是否已经完成布局,即。使用 View 类的。

2023-10-19 15:53:49 679

原创 Android 使用 registerForActivityResult() 打开系统相册或相机获取图像

当使用了 AndroidX 后,发现标记为过时了,而是推荐我们使用函数。函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Activity 和 Fragment 之间进行启动其他 Activity 并接收结果的过程,取代了传统的和方法。使用函数,您可以更容易地管理 Activity 结果的处理,使代码更清晰和模块化。AndroidX 是 Android 中的一个开发库,旨在简化 Android 应用程序的开发和维护。

2023-10-08 21:37:51 3622 1

原创 Android Camera2 SessionConfiguration介绍和使用

最近在相机开发中发现已经被标记为过时(@Deprecated)的函数了,取而代之的是函数。因为不建议在主线程中执行回调,所以通常我们会创建一个相机的执行器。

2023-10-07 20:02:13 1313 1

原创 Android Camera2获取摄像头的视场角(FOV)信息

在摄影和计算机图形学中,FOV也经常与焦距(focal length)、相机镜头和投影类型(例如透视投影或正交投影)一起使用,以影响图像的外观和透视效果。不同的FOV设置可以用来创造不同的视觉效果,从而满足特定的需求和创意要求。FOV的大小会影响到用户或设备所能看到的景象的广度和逼真程度。较大的FOV可以提供更广阔的视野,使用户感到更加沉浸在虚拟现实环境或更好地观察到摄像机捕捉到的场景。然而,较大的FOV通常需要更复杂的设备和技术来实现。如图所示,要计算FOV,只要我们拿到传感器的长度。

2023-09-18 22:08:28 1970

原创 C++ 新旧版本两种读写锁

读写锁(Read-Write Lock)是一种并发控制机制,用于多线程环境中实现对共享资源的高效读写操作。读写锁允许多个线程同时读取共享资源,但在有写操作时,需要互斥地独占对共享资源的访问,以确保数据的一致性。C++17前可以通过mutex和实现一个自定义的读写锁。});writing;});private:#include "ReadWriteLock.hpp" // 包含上面ReadWriteLock的头文件// 共享数据。

2023-09-04 21:32:47 930

原创 shell脚本获取参数列表

实现比较简单,主要是通过while循环去检索然后通过case去匹配参数列表。不是预设的option所有不会有相应匹配的代码执行。给shell脚本添加一个可执行权限。均成功匹配并执行相应信息打印;

2023-09-04 19:34:45 614

原创 shell函数详解,基本使用&进阶使用

shell函数详解,包含基础使用和进阶使用

2022-05-06 17:58:26 8514

原创 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 1309

原创 英特尔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 5254

原创 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 4386

原创 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 12207 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 3868 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 782 2

原创 C++ Lambda表达式详解

一、简介C++11开始引入了Lambda表达式,可将lambda表达式视为包含公有operator()的匿名接口(或类),这样可以更方便的使用函数对象或创建匿名函数(类似Java的匿名内部类)。二、Lambda表达式定义lambda表达式的定义必须以方括号([])打头。这些方括号告诉编译器,接下来是一个lambda表达式。方括号后面是一个参数列表,该参数列表与不使用lambda表达式时提供给operator()的参数列表相同。[capture list] (params list) mutable

2021-04-26 16:34:03 2827 4

原创 Android文件游览选择器(支持选择多个文件、支持选择文件和文件夹,返回文件路径)

一、效果预览用的图标都是网上到处拷贝的,仅仅做个示例使用。截图 gif二、思路首先我们需要一个 FilePickerActivity 去显示页面。里面包含一个标题栏(ToolBar)、路径文本(TextView)和文件列表(RecyclerView)。RecyclerView 需要使用一个 Adapter 展示内容,内容来自于 File 类的 listFiles() 函数。最后我们完善那些返回、单击进入文件夹、长按选择、空页

2021-03-23 17:44:05 2054

原创 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 4511 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 3337 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 8765 7

原创 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 2579 7

原创 OpenGL ES 3.0 片段着色器介绍和使用

一、简介备注:内容来自于《OpenGL ES 3.0编程指南》一书。片段着色器和顶点着色器一样都是运行在 GPU 上的程序,片段着色器将顶点着色器输出的片段作为输入,并负责输出每个片段的颜色。片段着色器的输入输出图示:二、内建变量内建变量是指着色器语言中已经定义好的,并有特殊意义的一些变量。1. 内建特殊变量变量描述gl_FragCoord片段着色器中的一个只读...

2019-08-26 18:50:08 2435 1

原创 浅谈 SurfaceView、TextureView、GLSurfaceView、SurfaceTexture

一、SurfaceViewSurfaceView 是一个可以在子线程中更新 UI 的 View,且不会影响到主线程。它为自己创建了一个窗口(window),就好像在视图层次(View Hierarchy)上穿了个“洞”,让绘图层(Surface)直接显示出来。但是,和常规视图(view)不同,它没有动画或者变形特效,一些 View 的特性也无法使用。概括:SurfaceView 独立于视图...

2019-08-22 20:34:38 11847

原创 NDK/C++ 耗时统计类TimeUtils

一、需求分析在开发阶段中,经常会需要打印出某些方式或步骤的耗时情况,大致需求如下:能打印出某个步骤的耗时;有开关可以控制打开和关闭耗时统计;使用方便。二、准备工作之前介绍过一个 log 输出的工具类,可以沿用,链接为:https://blog.csdn.net/afei__/article/details/81030373。LogUtils.h 示例:#ifndef _LOG_...

2019-08-21 17:37:42 3615 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 7061 11

原创 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 3737

原创 OpenGL 纹理过滤和 mip 贴图

一、概念1. 纹理过滤当纹理贴到具体像素上时,像素需要到纹理图像中进行采样,这个过程称为纹理过滤。纹理过滤通常有两种情况:放大(GL_TEXTURE_MAG_FILTER)和缩小(GL_TEXTURE_MIN_FILTER)。2. mip 贴图mip 贴图只适用于纹理过滤缩小的场景,其原理是将纹理按照2的倍数进行缩放,直至图像1*1的大小。在贴图时,OpenGL 会自动选择合适大小的纹理...

2019-07-19 17:08:55 1684

原创 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 9036

原创 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 8792 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 12245 3

原创 ReentrantLock的介绍使用及“生产者消费者”模式实现

一、简介ReentrantLock 即可重入锁的意思,是 java 控制线程同步的一种方式。和 synchronized 一样都是独占锁,只允许拿到锁的线程访问临界区。synchronized 优点是使用简单,不需要用户手动操作,加锁解锁的过程都是隐式的。ReentrantLock 则需要我们手动加锁和解锁(解锁操作通常放在 finally 代码块中保证执行),虽然使用更复杂但是其灵活性更好...

2019-07-02 16:58:52 1494

原创 Android 使用音量键/耳机按键控制拍照

一、简介一般手机都有 “音量上键”、“音量下键”,耳机线上通常也有 “上、中、下键”。有时我们会需要用到这些键来执行一些特殊的任务,例如 拍照,那么该怎么做呢?步骤就是:监听按键的事件并执行指定的任务最方便的方式是在 Activity 的 onKeyDown(int keyCode, KeyEvent event) 或者 onKeyUp(int keyCode, KeyEvent e...

2019-06-19 15:32:10 4085 1

原创 Android Camera2 获取预览帧的回调数据(带demo)

一、前言众所周知,在旧Camera接口中,我们通过 setPreviewCallback 或 setPreviewCallbackWithBuffer 接口来获取相机预览的帧数据。然而,在 Camera2 中,这些接口以及不复存在了,那么 Camera2 该如何获取预览帧数据呢?在 Camera2 中,我们通过 ImageReader 类来间接的获取预览帧数据,并在 onImageAvaila...

2019-06-15 16:22:53 23189 17

原创 OpenGL ES 顶点着色器内建变量和矩阵变换

一、简介顶点着色器用于基于顶点的操作,例如通过矩阵变换位置、计算照明方程式以生成逐顶点的颜色以及生成或者变换纹理坐标。常见概念:属性:用顶点数组提供的顶点数据(关键字:attribute/in)输出:在图元光栅化阶段为每个生成的片段计算顶点着色器的输出,并作为片段着色器的输入(关键字:varying/out)统一变量:顶点着色器使用的不变数据(关键字:uniform)采样器:顶点着色...

2019-04-25 17:20:11 2144

原创 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 10105

原创 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 4866

sshdroid.apk

为Android设备开启一个SSH的服务,方便远程连接

2021-07-13

设计模式之禅第二版

《设计模式之禅 第2版》PDF资源。 本书是第2版, 在写作中吸取了读者对上一版的许多意见和建议, 修订了一些代码的变量、 类、 方法名称, 以更加符合自然语言; 删除了部分有争议的内容(如单例模式的垃圾回收问题) ; 修改了一些常用的名词, 确保与编程人员的习惯相匹配。 希望通过这些改进, 给读者提供一个更完美的设计模式盛宴, 弥补上一版中的诸多不足。

2018-06-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除