- 博客(34)
- 资源 (1)
- 收藏
- 关注
原创 OpenGL模型变换,视图变换矩阵推导过程与glm::LookAt源码解析
本文将详细介绍OpenGL中的几个坐标系的概念,常见的几种变换,以及视图变换矩阵的推导过程,最后会分析下glm库视图变换矩阵的源码首先,模型变换(Model),视图变换(View),投影变换(Projection)就是我们常说的三个特殊的矩阵,也经常被统一称为MVP矩阵,要理解他们,我们首先要理解几个坐标系的概念。右手坐标系右手坐标系与左手坐标系都是三维笛卡尔坐标系,他们唯一的不同在于z轴的方向,如下图,左边是左手坐标系,右边是右手坐标系OpenGL中一般用的是右手坐标系下面的几个坐标系则是在图形
2021-12-05 11:37:06
5933
1
原创 Sobel边缘检测算子OpenCV实现
基本概念1.算子算子也就是滤波器,或者又称作卷积核,通常是一个3x3或者8x8的矩阵,在数字图像处理中有广泛的应用,将滤波器用来对二维图像中的每个像素做点积操作,及对应的像素点相乘再求和,可以达到边缘提取,图像分割等各种效果2.图像的梯度在二维图像中,边缘就是图像的像素值发生突变的那些点的集合,边缘的像素点与周围领域的像素点在亮度上存在较大差异,在高等数学中梯度代表了函数在某个点上最大的方向导数,也就是在沿着该方向函数的变化最快,那么在图像中,二维函数的梯度就可以理解为沿着x轴或者y轴的偏导数,由于
2021-05-05 10:31:03
677
原创 GLSL快速入门,用Shader实现彩虹特效
GLSL快速入门,用Shader实现彩虹特效导语Shader简介GLSL基础语法常用内置函数彩虹效果实现如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入导语本文将先简要介绍一下Shader和GLSL,然后用一个简单的fragment shader的例子来实现一个彩虹的特
2021-03-28 22:32:31
1956
1
原创 C++拷贝构造函数,析构函数与内存泄漏的那些坑
C++拷贝构造函数,析构函数与内存泄漏的那些坑拷贝构造函数拷贝初始化为什么拷贝构造函数的参数必须是引用类型拷贝赋值元素符析构函数不完整定义拷贝控制成员可能带来的问题阻止拷贝拷贝构造函数如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数class Sales {public: Sales() { std::cout<<"Sales()"<<std::endl; } Sales(const S
2020-12-06 19:24:33
1839
原创 OPPO2019春季校园招聘C/C++开发(手机方向)面试总结
本科软件工程普通学生一枚,春招之路,记录下心得面试过程首先一上来面试官先介绍了下自己,然后让我做个自我介绍,我像往常一下介绍了下自己的项目经验和实习经历,阐述了一下求职意向。接着面试官从我的专业基础问起,问我在校学的最好的专业课是啥,我说是计算机网络和操作系统,然后他就问我操作系统主要讲了啥,然后我从进程管理,内存管理,文件管理和设备管理这几个方面讲了一下一些。(实际上并不准确,进程管理属于...
2019-03-06 17:53:06
4975
1
原创 LinkedList,LinkedHashMap,LruCache源码解析
最近正好在复习数据结构的知识,顺带看了下jdk 1.8中的LinkedList和LinkedHashMap以及android中常用的LruCache的源码(内部采用LinkedHashMap实现),以加强自己的理解,下面就分享一下我阅读源码的一些简单的心得。一、简单高效的双链表LinkedList为什么使用双链表而不使用单链表,原因应该是,作为一种需要频繁在表头或表尾进行插入或删除操作的数...
2018-06-21 01:30:50
719
原创 《Go语言圣经》学习笔记一、几个简单的例子入门Go语言
一、Go语言的优势Go是一种编译型语言,被很多人称为21世纪的C语言,因其简洁、高效的特性,以及并发协程(goroutine)和消息通信(channels)等良好的机制,在服务端开发尤其是现在分布式、大数据的敏捷开发环境中得到了许多人青睐。二、Go语言的由来Go语言最初是由Google的工程师在开发过程中有感于传统编程语言的臃肿,并开始思考有关程序设计语言的一些关键性问题,发起了一...
2018-06-10 19:34:58
1369
原创 直方图均衡原理及OpenCV实现
一、概念直方图均衡,空域图像处理中最常用的技术之一,属于灰度变换的范畴,旨在通过一个灰度变换的函数,将原图像的每个灰度级映射到一个新的灰度级,提高灰度级的动态范围,使图像的直方图(即不同灰度出现次数的概率分布图)在整个灰度级的范围内趋于均匀,从而增强图像整体的对比度。二、映射函数灰度变换的目的就是找到一个合适的映射函数s=T(r) 对于离散的数字图像而言,就变成了累积求和 ...
2018-05-15 14:10:27
431
原创 Android端使用OpenGL ES加载OBJ文件数据
一、obj模型文件概览在介绍如何用程序加载obj模型文件之前,首先需要了解一下它的格式。 obj文件是最简单的一种3D模型文件,可由3dx MAX或Maya等建模软件导出,广泛应用于3D图形应用(如游戏)程序和3D打印等等,其本质上就是文本文件,里面存储的是模型的顶点坐标,顶点法向量和纹理坐标信息。下面看一个典型的obj文件# 3ds Max Wavefront OBJ Expo...
2018-05-09 20:08:32
8123
15
原创 Bitmap压缩原理解析与Android 7.0之前通过NDK使用libjpeg库高质量压缩图片
一、Bitmap压缩原理我们平常使用的bitmap.compress() 的内部实际上调用了如下native方法private static native boolean nativeCompress(long nativeBitmap, int format, int quality, OutputS
2018-01-27 18:22:04
2965
2
原创 Android性能优化(二)布局渲染流程及优化
一、布局渲染流程我们平常开发中的那些控件,比如Button,TextView,是如何渲染到屏幕上的呢? 简而言之,就是现先将xml解析成相应的对象,然后CPU经过计算以后将图形信息传给GPU,GPU来负责绘制,栅格化等操作,最终显示到手机屏幕上。二、为什么会出现卡顿Android每16ms对屏幕进行一次刷新,当一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件等待
2018-01-08 20:23:09
1299
原创 Android性能优化(一)App启动原理分析及启动时间优化
一、启动原理解析Android是基于Linux内核的,当手机启动,加载完Linux内核后,会由Linux系统的init祖先进程fork出Zygote进程,所有的Android应用程序进程以及系统服务进程都是这个Zygote的子进程(由它fork出来的)。其中最重要的一个就是SystemServer,在ZygoteInit类的main方法中,会调用startSystemServer方法开启系统里
2018-01-06 00:13:54
11876
3
原创 Android仿Volley手写属于自己的万能网络访问框架
在android网络通信中,我们平常开发时都会使用诸如Volley,Retrofit,AsyncHttpClient等等别人的框架,确实十分的便捷,省去了我们不少的时间。但是使用第三方框架也会带来一些不可避免的缺点。一、项目中大量使用第三方框架的缺点引入较多冗余代码,别人框架中有许多代码是我们不需要的框架中部分的函数,功能不满足我们的需求(定制性较弱)下面,我们就仿照Volley框架的思想手撸
2018-01-02 20:35:21
1121
原创 算法分析与设计(五)回溯法
回溯法的基本思想回溯法有“通用的解题法”之称。该方法系统地搜索一个问题的所有解或任一解。问题解的表示:回溯法将一个问题的解表示成一个n元式(x1,x2,…,xn)的形式。 显示约束:对分量xi的取值限定。 隐示约束:为满足问题的解而对不同分量之间施加的约束。 解空间:对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。回溯法通常将问题解空间组织成“树”结构,通过采
2017-12-31 19:37:06
3049
1
原创 算法分析与设计(四)动态规划(二)
动态规划的概念复习 每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。动态规划的思想和策略 将待求解的问题分解为若干个子问题,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。 适合用动态规划求解的问题,经分解后得到的子问题往往不是互相独立的。(这一点与分治法不同)能用动态规划求解的问
2017-12-14 19:55:31
411
原创 算法设计与分析(三)动态规划(一)
基本思想 1.动态规划是一种使多阶段决策过程最优的通用方法。2.动态规划算法与分治法类似,其思想把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。最后一个阶段或子问题的解就是初始问题的解。3.动态规划中分解得到的子问题往往不是互相独立的。但不同子问题的数目常常只有多项式级。用分治法求解时,有些子问题被重复计算了许多次,从而导致分治法求解问题时间复杂度较高。 4.动态规划基本思想是保留
2017-11-27 11:15:15
962
原创 调用微信OAuth2.0网页授权接口实现用户信息的绑定
在微信网页开发中,可以通过OAuth2.0网页授权机制,来获取用户基本信息,进而实现自己的业务逻辑。 微信官方文档 关于网页授权回调域名的说明 1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 ht
2017-11-09 18:38:24
22085
1
原创 算法设计与分析(二)分治
一、分治法基本思想 1.求解问题算法的复杂性一般都与问题规模相关,问题规模越小越容易处理。 2.分治法的基本思想是,将一个难以直接解决的大问题,分解为规模较小的相同子问题,直至这些子问题容易直接求解,并且可以利用这些子问题的解求出原问题的解。各个击破,分而治之。 3.分治法产生的子问题一般是原问题的较小模式,这就为使用递归技术提供了方便。递归是分治法中最常用的技术。二、分治法解决问题的先决条
2017-11-06 09:07:42
1414
原创 算法设计与分析(一) 蛮力法
一、概述 蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。也可以用“just do it!”来描述蛮力法的策略。一般来说蛮力策略也常常是最容易实现的方法。 二、优缺点 虽然巧妙和高效的算法很少来自于蛮力法,但它在算法设计策略中仍然具有重要地位. 1.蛮力法适应能力强,是唯一一种几乎什么问题都能解决的一般性方法。 2.蛮力法一般容易实现,在问题规模不大的情况下
2017-11-05 23:30:32
11403
原创 C++实现24位真彩BMP图平移,镜像,旋转90、180度
一、BMP文件格式解析 BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Window系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提
2017-10-30 14:38:27
6224
1
原创 Android Camera2.0 结合ImageReader拍照并解决图片偏转问题
前文Android Camera2.0 API实现摄像头预览并获取人脸关键坐标已经介绍了Camera2.0的基础内容,在2.0的API中,要想实现拍照功能,则要借助于ImageReader。首先在自定义的TextureView.SurfaceTextureListener的实现类中,维护ImageReader的引用private ImageReader mImageReader ;然后在setUpC
2017-10-25 20:44:51
17661
1
原创 Android Camera2.0 API实现摄像头预览并获取人脸关键坐标
Android 5.0(API Level 21)以后推出了新的camera2.0 API,原有的Camera1.0已被废弃,确实新的camera API有更好的架构,更低的耦合,可以使开发人员发挥更大的空间。API简介 主要的类有以下几个: 1.CameraManager :所有camera的管理类,可以通过调用getSystemService()得到其实例,其中的方法getCameraCha
2017-10-24 20:31:44
14050
10
原创 Android OpenGL ES2.0学习(一)基础三角形案例
OpenGL ES 2.0与OpenGL ES 1.x的一个最大不同就是用可编程渲染管线代替了原有的固定渲染管线。在学习OpenGL ES 2.0之前,有必要先了解一下OpenGL ES 1.x渲染管线的工作原理。渲染管线有时也被称为渲染流水线,一般是由显示芯片内部的处理图形信号的并行处理单元组成。与普通应用程序通过CPU串行执行不同,将渲染工作通过渲染管线中多个相互独立的处理单元进行并行处理后,渲
2017-10-16 17:46:01
653
原创 Android使用讯飞SDK开发语音识别及合成小Demo
自然语言处理现在是比较火的一个领域,也有了很多成熟的应用,像科大讯飞或是百度语音等等这些商业产品的一个优势之一就是比较稳定,适合用来做开发。下面就展示一个根据讯飞SDK文档做出的具有语音识别和语音合成功能的小Demo。 首先,第一步当然是去讯飞官网注册账号,创建应用并获得一个AppID,然后下载相应的SDK,我这里只下了两个,分别是语音听写和语音合成的。 然后将SDK里libs目录下的文件全部拷
2017-09-14 18:47:45
12228
3
原创 Android 使用SurfaceView进行2D动画的开发
SurfaceView介绍SurfaceView是View的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。这个视图里内嵌了一个专门用于绘制的Surf
2017-09-05 18:41:57
833
原创 android OpenGL开发使用JPCT-AE引擎显示3D立方体
在了解JPCT之前得了解什么是opengl,opengl是一个跨语言,跨平台的3D图形编程接口,OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。而JPCT则是java的一款3D图形引擎,封装了opengl,jPCT-AE是jPCT在android平台上的移植版本。用opengl的
2017-09-02 12:52:40
2213
原创 android 拼图小游戏
拼图虽是比较小的一个游戏,但涉及到的逻辑和代码也没那么简单,这里参考慕课网上的教程,采用一个二维数组来存储拼图的小方格,并将拼图的数据GameData(包括x,y坐标和正确的摆放位置)和视图(Bitmap)分离,并编写相应的游戏逻辑控制方法(控制层controller),很好地体现了MVC的思想。 视频网站:http://www.imooc.com/learn/683 效果图:源代码:packa
2017-07-14 16:32:54
2718
1
原创 android自定义View 五子棋小游戏
做一个五子棋练练手,没什么特别的,再复习一下自定义View的知识,onMeasure,MeasureSpec , onDraw以及OnTouchEvent方法等, 效果图代码如下:package com.fivechess;import android.content.Context;import android.graphics.Bitmap;import android.graphics.
2017-07-13 21:41:03
518
原创 自定义ViewGroup和FrameLayout实现轮播图(包括底部小圆点)
广告轮播图在现在的APP首页比较常见,主要的实现方式有两种,一种是通过ViewPager,一种是通过自定义ViewGroup。前者的实现方式比较简便,本篇文章讲的是第二种方法,有人说用ViewPager不是更方便吗,的确,但是我们通过自己定义ViewGroup,可以更深入了解ViewGroup内部的原理。用别人造的轮子确实方便,但有的时候拆开轮子看看,我们也许会学到更多。效果图 主要的思路如下:
2017-07-13 15:31:39
1017
转载 android 自定义view 实现定制二维码扫描框
上一篇文章说到如何使用google的zxing开源框架android导入zxing进行二维码开发,本篇就讲讲如何通过自定义ViewFinderView这个类来制作我们自己的扫描框。首先在com\google\zxing\client\android目录下找到ViewFinderView这个类,这个View就是用来绘制二维码扫描的页面的具体修改代码如下:package com.google.zxing
2017-06-30 15:00:11
9203
2
原创 android 导入zxing 进行二维码开发
zxing是google官方用于处理二维码的开源项目,github地址https://github.com/zxing/zxing 。 如果把整个项目clone下来,由于项目文件较大,加上网速普遍较慢,会浪费好多时间,可以选择git浅复制 git clone –depth=1 https://github.com/zxing/zxing.git 。这里选择直接Download 最新一次版本ZIP的
2017-06-30 01:27:11
2591
原创 Android 自定义九宫格手势锁
预览效果图如下:主要的方法是重写View.onTouchEvent( MotionEvent event ) , 常用的三个操作:ACTION_DOWN 手指触摸屏幕 ; ACTION_UP 手指离开屏幕; ACTION_MOVE手指在屏幕滑动。 如果该方法返回true ,表示该事件已经被View处理,不再向上层的View或Activity传递 ; 如果返回false, 表示事件未处理,继续传递
2017-06-25 15:44:48
1147
原创 Android 自定义View实现圆形进度条 深入理解onDraw和onMeasure及自定义属性
Android的View类是用户接口的基础构件,表示屏幕上的一块矩形区域,负责这个区域的绘制和事件处理。自定义View的过程主要包括重写onDraw及onMeasure方法 , 其中onMeasure方法的作用就是计算出自定义View的宽度和高度。这个计算的过程会参照父布局给出的大小(widthMeasureSpec和heightMeasureSpec),以及自己特点算出结果 ;onDraw则根据o
2017-06-23 17:45:49
788
2
转载 我的第一个Windows窗口
之前也是研究《Visual C++ 游戏开发案例实战》这本书,感觉还不错,第一次接触了Windows API 方面的知识,就用VS2015编了一个最简单的Windows窗口程序,用的是Win32的编程模式。代码完全是照着书上打的,但也有一部分遇到了问题,就是char型字符串和LPWSTR的转换问题,按照书上直接用的char型字符串编译会出错,后来通过一个TEXT宏就解决了转换问题。 代码
2016-09-22 21:27:41
415
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人