诗与远方

Be your personal best


  • 首页

  • 标签

  • 分类

  • 归档

CoreImage-1

发表于 2020-01-02 | 分类于 iOS |

概论

Core Image 是 Apple 用来最大化利用其所运行之上的硬件的。每个滤镜实际上的实现,即内核,是由一个 GLSL (即 OpenGL 的着色语言) 的子集(CIKL)来书写的。当多个滤镜连接成一个滤镜图表,Core Image 便把内核串在一起来构建一个可在 GPU 上运行的高效程序。(可以选择使用 CPU 或者 GPU)

CIFilter 处理

CIImage ~ UIImage 经过CIFilter 处理后的输出是 CIImage,可以挂载 CIContext 进行输出和转换,但是是在 CPU上; 我们可以挂载在 GPU上进行加速处理( EAGLContext)

  • 函数式组合滤镜
  • 自定义 CIFilter (CIkernel)

分类

  • CIColorKernel:用于处理色值变化的 Filter。
  • CIWarpKernel:用于处理形变的 Filter。
  • CIKernel:通用。

查看系统提供支持的滤镜集合:

NSArray<NSString *> *filterNames = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];

基础使用

CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage  forKey:kCIInputImageKey];
[filter setValue:@40 forKey:@"inputScale"];
CIImage *outImage = [filter valueForKey:kCIOutputImageKey];
CIContext *context = [CIContext contextWithOptions:nil]; //
CGImageRef cgImage = [context createCGImage:outImage fromRect:[inputImage extent]];
UIImage *showImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);

滤镜链

CIContext有两种初始化方法,分别对应GPU和CPU
(1)创建基于GPU的CIContext对象:
    context = [CIContext contextWithOptions: nil];
(2)创建基于CPU的CIContext对象
    context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:    [NSNumber numberWithBool:YES]
    forKey:kCIContextUseSoftwareRenderer]];

CIContext 是多线程共用的,这样创建 output UIImage 的时候就不需要进行内省的,避免资源浪费。

imageWithCIImage 会内部创建 CIContext 进行绘制。

指定使用 GPU 可以使用openGL 和 Metal 进行渲染。

CPU is still what will give you the best fidelity where as the GPU will give you the best performance.

利用实时渲染的特效,而不是每次操作都产生一个 UIImage,然后再设置到视图上。

// 实时渲染
[self.pixellateFilter setValue:@(sender.value) forKey:@"inputRadius"];

[self.context drawImage:_pixellateFilter.outputImage inRect:_targetBounds  fromRect:_inputImage.extent];
[self.glkView.context presentRenderbuffer:GL_RENDERBUFFER];

创建 context,那么它内部的渲染器会根据设备最优选择:依次为 Metal、OpenGLES、CoreGraphics。 ps: 模拟器不支持 Metal。

CoreImage && GPUImage

  1. 支持对原生 RAW 格式图片的处理。支持对大图进行处理。
  2. 自动增强图像效果,会分析图像的直方图,图像属性,脸部区域,然后通过一组滤镜来改善图像效果。
  3. 支持图像识别功能,人脸识别,条形码,文本等。
  4. 与 Metal SpriteKit,SceneKit,Core Animation 结合。

CoreImage and Metal

CIKL 自定义效果实现
(埋坑)

CoreImage and Vision

Vision Framework 是计算机视觉的高级框架。
Vision WWDC 2017

搭配组合进行效果处理的方式

  1. 预处理前处理 (裁剪,旋转,灰度等)
  2. 识别后进行分发处理 (识别到人脸后做逻辑处理 CI…)

对于校准和稳定性的处理

  • face detection
  • 矩形、barcode 、text detection

参考

Core Image介绍

自定义滤镜参考

Core Image Filter Reference

Core Image Video

Image Editing with Depth

发表于 2019-12-24 | 分类于 iOS |

Loading Depth Data

首先要获取深度数据到内存

* PHContentEditingInput
* PHImageManager

[asset requestContentEditingInputWithOptions:options completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) {
        // Create a CIImage from the full image representation.
        NSURL *url = [contentEditingInput fullSizeImageURL];

Testing for Depth Data with ImageIO

查看是否存在深度数据

//Test
CFURLRef ref = (__bridge CFURLRef)url;
CGImageSourceRef source = CGImageSourceCreateWithURL(ref, nil);
CFDictionaryRef dictRef = CGImageSourceCopyProperties(source, nil);
NSLog(@"========= %@",dictRef);

Reading Depth Data

auxiliary

AVDepthData 
@property   CVPixelBufferRef depthDataMap

use Metal or Core Image to process then get DepthImage.

注意事项 需要做几件事:

  • 深度信息分辨率低 scaling up
    CIEdgePreserveUpsampleFilter 上采样图像信息达到保留边缘的效果
    (所有的使用视差而不是深度信息,官方建议是视差效果会更好一点)
  • 深度值并不是局限在 [0,1]的具体值,视差可能0就是无穷远

Filtering with Depth Data

  • sample background effects (混合遮罩)
    稀释效果/背景白化/马赛克(CI 六边形,运动模糊)
    using Disparity as a mask.
  • Custom Depth Effect
  • Depth Blur Effect (景深)
  • 3D Effect

CIAreaMinMaxRed
CIColorMatrix, 线性过滤器 slope and bias 斜率和偏移
CIColorClamp
CIBlendWithMask

//自定义效果

CIColor Kernel
任何自定义的效果。例如:系统相机人像模式下

//景深效果

CIDepthBlurEffect 
load MainImage and DisparityImage final use this filter with name
1. setValue  focus and rectangle
2. use vision framework to special effect (such face detail),Max is 4 faces,提高速率可以 set  InputScaleFactor = 0.5   

// 3D 效果

实现 true 3D,我们需要使用 Metal.

* Mesh
* Vertex shader
* fragment shader 
* CIImageProcessorKernel

Saving Depth Data

  • 方向 Orientation
  • 裁剪 Crop
  • 旋转 Transform

CoreImage 提供了更方便的接口保存实现。

DepthData 可使用的场景:

  1. Edit
  2. capture
  3. share

参考 WWDC2017

Hello World PHP

发表于 2018-03-08 | 分类于 PHP |

PHP是世界上最好的语言。

工欲善其事,必先利其器。

环境配置

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台(如果未安装JDK,则需要先 下载 JDK 安装)。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
支持 Window、Linux 和 Mac OS 平台。

Eclipse for PHP 官方下载地址

本人是 Mac 环境,其他环境需要选择对应的下载。不同版本会有不同的支持,选择最新的JVM支持.

IDE 下载安装完成后,我们就可以打开 Eclipse,但是这个时候我们什么也干不了,需要配置运行环境,运行环境配置参考 根据教程一步一步完成配置,建议修改根目录方便后续开发运行,务必注意虚拟环境和虚拟目录的一致。

Mac 自带 Apache web服务支持:

1
2
3
sudo apachectl start    //启动
sudo apachectl stop //终止
sudo apachectl restart //重启

每个Project可以在默认目录下进行关联(仅Mac)

1
sudo ln -s   项目-目标路径

这时候,我们就可以在我们的PHPWorkspace下尽情撸码了。对PHP的世界说一声:

1
2
3
<?php  
echo "Hello World!";
?>

基础语法

  • 各种类型 $, array , class, TRUE, null;

  • 关键字 static ,Global ,echo ,print

    换行’’

  • 段落书写 <<<EOF \n EOF; EOT、EOD

  • 函数 var_dump() 返回数据类型和值

  • 常量 define()

  • 字符串

并置运算符 (.) 用于把两个字符串值连接起来. 适用于常量、
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
echo strlen(“中文字符”); // 输出 12,一个中文3字符
echo mb_strlen(“中文字符”,’utf-8’); // 输出 4

  • 基本运算符都同其他语言(C,C++)。

    两个 == 仅判断值相等,类型 不一定相等;

    三个等号 === 用于绝对比较,即类型与值都要相等;

    PHP没有指针地址的概念,所以& 即引用,同一变量;($c = &$a; )

<=> 太空船操作符,又称组合比较运算符,结合比较运算符。
组合比较运算符,英文叫作 combined comparison operator,符号为 <=>,它有一个形象的名字,叫作太空船操作符。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。
语法是这样的:
$c = $a <=> $b;
这句代码的意思是
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1

随笔小记

发表于 2015-09-08 | 分类于 随笔 |

生活是一本书,慢慢变厚,最后又慢慢变薄,积累沉淀 known Unknown!!!

Hexo 构建

发表于 2015-09-08 | 分类于 Hexo |

首先静态博客, Hexo是基于Node.js的静态Blog搭建工具像jelly(ruby),octopress等一系列好用的静态博客生成程序。而且现在dropbox也支持放置静态页面,也有了像farbox等一类好用的工具。之前搭建配置部署环节的问题,于是写在简书,今天来填坑。

配置环境

首先,必须要有 github 和 node 的环境基础:

Node

到Node.js官网下载相应平台的最新版本,一路安装即可。
Mac 下面命令即可搞定(可以 node -v 查看本地,有的系统版本默认已经安装
):

1
$ brew install node

Github

  • 可以进行命令行安装(麻烦),已经安装的可以查看本地配置信息
  • 最好可以注册一个GitHub账号,已有的请忽略
  • 然后建立与你用户名对应的仓库,名称必须为[user_name.github.io]
  • 添加SSH公钥到[Account settings->SSH Keys->Add SSH Key]

然后在本地查看你的用户名和邮箱,对于在个人和公司账号之间切换的需要特别注意。git 配置信息关系到后面部署成功与否。
常见问题参考:
GitHub Help

Install

Node 和 Git 都配置好的,可以进行命令安装Hexo:

1
2
3
npm install -g hexo
hexo init <your_folder>
cd your_folder

至此已经在your_folder下面生成了本地静态页面文件,然后进行本地启动在浏览器输入http://localhost:4000就可以看到效果:

1
2
hexo generate
hexo server

主要来说下这期间出现的问题:

  1. hexo server 以后,“ Usage: hexo …”没有生成本地服务:
1
npm install hexo-server --save
  1. 出现白板和Cannot GET / 几个字:
1
2
3
4
5
npm install hexo-renderer-ejs --save
npm install hexo-renderer-stylus --save
npm install hexo-renderer-marked --save
hexo generate (或hexo g)
hexo server (或hexo s)


配置部署

Hexo 根目录下的 _config.yml是主配置文件,后面在你的themes下面也会有一个_config.yml文件主要来配置主题的一些东西.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
title: #主题名称
subtitle: #副标题
description: #描述
author: #博主
language: #英语 en #汉语 zh-Hans
.
.
.
# Deployment
## Docs: http://hexo.io/docs/deployment.html
deploy:
type: git
repo: #你的GitHub新建的那个仓库链接
branch: master

最后部署到Git:

1
2
hexo generate   #hexo g 简写
hexo deployer #hexo d 简写

存在的问题:

  1. 书写问题,在每个字段后面需要进行空格的预留,不然会有”can not read a block mapping entry”
  2. hexo d 之后,ERROR Deployer not found: git npm install hexo-deployer-git --save

最后便能够在浏览器中输入your_name.github.io查看自己的Hexo博客.

自由发挥

自定义的东西更加酷炫和好玩,可以自定义自己喜欢的主题WiKi 主题大全,配置一些显示信息,简单熟悉MarkDown 语法就可以了,还有很多玩法等待大家去发掘。最后贴上Hexo官网。

123
osborn

osborn

iOS Developer,Bboy

15 日志
7 分类
11 标签
RSS
GitHub 简书
© 2021 osborn
本站访客数: