<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[风语的专栏]]></title><description><![CDATA[仗剑天下，快意恩仇]]></description><link>https://blog.youkuaiyun.com/dingjikerbo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dingjikerbo]]></copyright><item><title><![CDATA[关于Android端相机应用涉及到的技术]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/85331287</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/85331287</guid><author>dingjikerbo</author><pubDate>Fri, 28 Dec 2018 20:47:32 +0800</pubDate><description><![CDATA[目前AI视觉以及短视频相关的应用都和相机有关，涉及到相机的调用，Surface渲染，视频录制等功能，这里做了一个Demo项目，基本包含了Android相机应用涉及的所有技术。
https://github.com/dingjikerbo/Android-Camera
Android Camera Demos

一、相机预览




序号
项目名称
内容简介




1
GLSurfacePrevi...]]></description><category></category></item><item><title><![CDATA[VLC卡死内存溢出解决]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403596</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403596</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 21:08:50 +0800</pubDate><description><![CDATA[SurfaceTexture不直接显示图像流，而是转为GL外部纹理，因此可用于图像流数据的二次处理（如Camera滤镜，桌面特效等）。比如Camera的预览数据，变成纹理后可以交给GLSurfaceView直接显示，也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。首先，SurfaceTexture从图像流（来自Camera预览...]]></description><category></category></item><item><title><![CDATA[NEON优化——OpenCV WarpAffine最近邻]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403588</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403588</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 21:07:30 +0800</pubDate><description><![CDATA[warpAffine一种典型的应用场景是将camera拍到的图像中人脸抠出来，通过变换输出一张正脸，然后再做一些人脸识别，关键点检测之类的运算。所以通常是输入尺寸固定，输出尺寸也固定，变的是转换矩阵。
最近邻的优势是计算量小，速度较快，问题是放大的情况下锯齿较明显，对于通常是缩小的应用场景最近邻是比较合适的，如果希望在所有的场景下有相对更好的效果，可以考虑双线性。
算法要点
warpAffine和...]]></description><category></category></item><item><title><![CDATA[NEON优化——OpenCV WarpAffine双线性插值]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403549</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403549</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 21:04:34 +0800</pubDate><description><![CDATA[算法要点
warpAffine双线性插值和最近邻的区别

根据目标图像的某点坐标算出原始图像对应的点坐标后，最近邻是向下取整，双线性插值需要获得相邻的四个点坐标以及纵横方向的权重
最近邻直接拷贝原始图像点即可，双线性插值需要横竖加权

很显然计算量要比最近邻大一些，但是效果会更好，对于放大的情况没有明显的锯齿。
优化要点

在计算偏移时基本和最近邻相同，同样要考虑异常情况和越界读的问题，另外要注意...]]></description><category></category></item><item><title><![CDATA[NEON优化——OpenCV Resize双线性插值]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403487</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403487</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 20:59:50 +0800</pubDate><description><![CDATA[算法要点
一、基本原理
具体原理可以自行搜索，这里只大致描述一下，目标图像上某一个点按比例映射到原始图像上某一点，不过通常计算得到的原始点坐标不是整数，最近邻的做法是向下取整，而双线性差值的做法是取与该坐标最接近的上下左右四个点来线性加权，在放大的时候不会像最近邻那样锯齿严重，但是计算量会大不少。这里要注意的是加权分为两个维度，横向和纵向。此外，边界的处理也要注意。
二、优化思路
这里核心的优化思...]]></description><category></category></item><item><title><![CDATA[Android Camera源码分析]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403429</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403429</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 20:55:40 +0800</pubDate><description><![CDATA[回顾这半年做的项目基本都跟Camera有关，从手势识别控制空调，到人脸识别的门禁，都是围绕相机的数据处理和渲染。这里相机不限于本地的相机，还包括远程的RTSP相机，要将数据流拉到本地进行渲染。
这两天好好读了一下Camera的源码，大概理清了整体架构，总结了一下，其实没多少东西，Android的各个模块都差不多，都是有个系统服务，然后Java封一层，Native封一层，Java层和Native层的...]]></description><category></category></item><item><title><![CDATA[Android视觉应用性能优化]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403354</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403354</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 20:50:05 +0800</pubDate><description><![CDATA[计算机视觉在移动端的应用，典型的如手势识别，人脸识别，流程都差不多，都是利用移动端的相机采集数据，丢给算法层，根据识别的结果来做一些业务，中间可能还要做一些图形的渲染。
本文主要讨论这中间涉及到的一些问题以及优化的思路，算是对过往工作的总结吧。大致问题有以下五点：
一，相机采集数据的格式是NV21，而算法层所需的格式是RGB，这中间需要转换，对于每秒30帧，每帧1920*1080的图像转换的耗时还...]]></description><category></category></item><item><title><![CDATA[Android BufferQueue原理分析]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403334</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403334</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 20:48:25 +0800</pubDate><description><![CDATA[在Android中，BufferQueue是Surface实现本地窗口的关键，驻留在SurfaceFlinger进程中进行服务，下面从BufferQueue的结构开始分析，
class BufferQueue : public BnGraphicBufferProducer,
                    public BnGraphicBufferConsumer,
         ...]]></description><category></category></item><item><title><![CDATA[从Camera源码看如何从Jni回调到Java层]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403303</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/84403303</guid><author>dingjikerbo</author><pubDate>Fri, 23 Nov 2018 20:45:15 +0800</pubDate><description><![CDATA[通常设备层有数据或事件要通知到应用层是通过回调来完成的，可以采用的方式是直接调用java层类静态函数，或者调用java层某个对象的普通函数，
涉及几个问题：
1，内存泄露，引用问题
2，多线程问题
首先研究一下Camera的实现，首先打开Camera返回一个Camera对象，setPreviewCallback传入了一个callback，这个callback没有传入jni层，只是在Camera对象...]]></description><category></category></item><item><title><![CDATA[移动端算法加速总结]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/82387917</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/82387917</guid><author>dingjikerbo</author><pubDate>Tue, 04 Sep 2018 18:03:44 +0800</pubDate><description><![CDATA[性能加速，即对于给定的输入，用更短的时间获得我们想要的输出。

总的来说有两个思路：


降低计算量
提高计算速度。


各种优化技术基本上都是围绕这两点展开的。

降低计算量


优化算法或模型，使得用更少的计算量就可以达到同样的效果
简化算法或模型，使得在牺牲部分准确度或效果的情况下速度能有大幅提升，看应用场景
算法本身不变，优化实现。或将算法中可能存在的重复计算抽离出来，结果进行复用，或其它...]]></description><category></category></item><item><title><![CDATA[VLC RTSP视频播放终极解决方案]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/78219311</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/78219311</guid><author>dingjikerbo</author><pubDate>Thu, 12 Oct 2017 20:23:27 +0800</pubDate><description><![CDATA[VLC播放RTSP视频流遇到的问题摄像头是RTSP协议的，需要在Android端实时显示摄像头视频流，这里采用了开源的VLC播放器，可能会有如下需求：
  一、有截屏的需求
  
  二、有屏幕录制的需求
  
  三、视频本来是横的，但是现在要竖屏显示，如何旋转视频，另外旋转后视频会拉伸，因此需要截取一段显示
  
  四、显示的视频可能需要做额外处理，比如识别出人脸后框出来
先说说直接用VLC播]]></description><category></category></item><item><title><![CDATA[关于Grafika的RecordFboActivity]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/77197511</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/77197511</guid><author>dingjikerbo</author><pubDate>Tue, 15 Aug 2017 17:18:45 +0800</pubDate><description><![CDATA[这个是为了展示通过FBO录制视频的三种方式，先总结一下，采用SurfaceView加单个EGLContext，两个Surface，一个是Display Surface，另一个是Video Surface。三种方式如下：一、多次绘制，即先切到Display Surface绘制，然后再切到Video Surface绘制，绘制完后swapBuffer推送生效。二、BlitFrameBuffer，先绘制到D]]></description><category></category></item><item><title><![CDATA[采用Parcelable实现对象的深度拷贝]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/76615608</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/76615608</guid><author>dingjikerbo</author><pubDate>Thu, 03 Aug 2017 11:52:58 +0800</pubDate><description><![CDATA[public class ParcelHelper {    public static <T> T copy(Parcelable input) {
        Parcel parcel = null;        try {
            parcel = Parcel.obtain();
            parcel.writeParcelable(input, 0)]]></description><category></category></item><item><title><![CDATA[ProgressButton的实现]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/68483838</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/68483838</guid><author>dingjikerbo</author><pubDate>Thu, 30 Mar 2017 10:21:10 +0800</pubDate><description><![CDATA[一向对UI不是太感兴趣，不过项目中遇到了还是得去做，做这个ProgressButton还是费了不少功夫，不过效果还可以，这里先记下，以后可能还会用到。只贴代码，原理就不多说了。public class ProgressButton extends Button {    public static final int MODE_BUTTON = 0;    public static final i]]></description><category></category></item><item><title><![CDATA[谈Android PowerManager的Hook技术]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/68062143</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/68062143</guid><author>dingjikerbo</author><pubDate>Wed, 29 Mar 2017 11:20:15 +0800</pubDate><description><![CDATA[在插件中，需要禁止插件调用系统原生接口持有WakeLock，Hook技术是不错的解决方案。通过阅读系统源码，可以了解到PowerManager持有WakeLock操作最后都通过Binder跨进程调到系统服务中，我们只要拦截这个Binder的所有调用即可。思路是先通过反射拿到这个IPowerManager的Binder，然后动态生成该Binder的代理对象，再覆盖原有的Binder即可。public]]></description><category></category></item><item><title><![CDATA[getSystemService的奇怪问题]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/67644806</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/67644806</guid><author>dingjikerbo</author><pubDate>Tue, 28 Mar 2017 20:45:22 +0800</pubDate><description><![CDATA[先看如下代码，这两个PowerManager不是同一个对象，PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager manager2 = (PowerManager)getApplicationContext().getSystemService(POWER_SERVICE);只能从内核源]]></description><category></category></item><item><title><![CDATA[用happen-before规则重新审视DCL]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/62430258</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/62430258</guid><author>dingjikerbo</author><pubDate>Thu, 16 Mar 2017 17:55:09 +0800</pubDate><description><![CDATA[编写Java多线程程序一直以来都是一件十分困难的事，多线程程序的bug很难测试，DCL(Double Check Lock)就是一个典型，因此对多线程安全的理论分析就显得十分重要，当然这决不是说对多线程程序的测试就是不必要的。传统上，对多线程程序的分析是通过分析操作之间可能的执行先后顺序，然而程序执行顺序十分复杂，它与硬件系统架构，编译器，缓存以及虚拟机的实现都有着很大的关系。仅仅为了分析多线程程]]></description><category></category></item><item><title><![CDATA[Java并发编程：volatile关键字解析]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/62428498</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/62428498</guid><author>dingjikerbo</author><pubDate>Thu, 16 Mar 2017 17:17:23 +0800</pubDate><description><![CDATA[volatile这个关键字可能很多朋友都听说过，或许也都用过。在Java 5之前，它是一个备受争议的关键字，因为在程序中使用它往往会导致出人意料的结果。在Java 5之后，volatile关键字才得以重获生机。

volatile关键字虽然从字面上理解起来比较简单，但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的，因此在讲述volatile关键之前，我们先来]]></description><category></category></item><item><title><![CDATA[Retrofit源码解析]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/54572851</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/54572851</guid><author>dingjikerbo</author><pubDate>Mon, 16 Jan 2017 12:02:23 +0800</pubDate><description><![CDATA[Retrofit代码不多，设计得很精巧，非常值得借鉴。首先看Retrofit是如何创建的：public <T> T create(final Class<T> service) {
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[]{service},
            new Invoc]]></description><category></category></item><item><title><![CDATA[Android蓝牙源码分析——GKI定时器]]></title><link>https://blog.youkuaiyun.com/dingjikerbo/article/details/52470370</link><guid>https://blog.youkuaiyun.com/dingjikerbo/article/details/52470370</guid><author>dingjikerbo</author><pubDate>Thu, 08 Sep 2016 13:02:33 +0800</pubDate><description><![CDATA[GKI定时器初始化在gki_ulinux.c中的GKI_init中，如下：void GKI_init(void)
{
    ......    struct sigevent sigevent;
    memset(&sigevent, 0, sizeof(sigevent));
    sigevent.sigev_notify = SIGEV_THREAD;
    sigevent.sig]]></description><category></category></item></channel></rss>