引言
人类的视觉感知存在有限的感知域。对于超出感知域的变化,我们无法感知。然而,这类信号却可能蕴藏着惊人的秘密。
比如,血液循环使得人体的皮肤发生细微的周期性变化,这个裸眼无法感知的变化却和人的心率非常吻合。2011 年,MIT 的一个亚裔学生 Mingzhe Poh 就利用这个微弱的信号设计了一个“魔镜” —— 不仅能照出你的模样,还能测出你的心率。
Mingzhe Poh 的“魔镜”
Mingzhe Poh 的这面神奇的镜子的原理是利用了血液在人体内流动时光线的变化 :心脏跳动时血液会通过血管,通过血管的血液量越大,被血液吸收的光线也越多,人皮肤表面反射的光线就越少。因此,通过对图像的时频分析就可以估算出心率。
Cardiac pulse recovery methodology
再比如,乐器之所以会发出声音,是因为它发声的部分在弹奏过程中发生了有规律的形变,而这个形变的振幅对应着乐器发声的响度,快慢对应着乐器的音高。微弱信号所蕴藏的信息量是如此重大,无怪乎禅语有云:
一花一世界,一叶一菩提。
既然如此,能否将影像中的这些肉眼观察不到的变化“放大”到裸眼足以观察的幅度呢?这就是本文将要重点讨论的问题。
Read More
作为一个图形图像方向的研究生,我经常都在和 OpenGL 、OpenCV 等多种 C++ 库打交道。这些库遵循着不同的规则和用法;另外,为了让自己的程序具有更多的交互能力,编写界面也是一个家常便饭的工作。
然而,随着工程复杂性的增加,库的管理和界面的维护也变得越来越困难:一方面,库的增加和删除不仅会增加学习成本,也会对系统的逻辑层带来影响。而另一方面,如果要让自己的项目易于维护,就要尽可能地应用设计模式,让逻辑和界面分离。但对于科研,一味陷入设计模式的桎梏又会带来过早优化的问题,影响科研进度。
直到后来,我接触到了 openFrameworks ,简直有种相逢恨晚的感觉。openFrameworks 封装了常用的 C++ 库,在此基础上提供了一个直观统一的接口,也大幅简化了编写界面的流程,使得开发图形程序变得很轻松。
本文将为大家介绍这个让人着迷的开发框架 —— openFrameworks。
Read More
最近在读《OpenCV 2 Computer Vision Application Programming Cookbook 》,书中的第三章介绍了如何了在进行 OpenCV 开发时常用的几种设计模式,包括策略模式、单例模式,以及如何搭建 MVC(模型-视图-控制器)架构。内容精彩,让人受益良多。
是否应该在程序中应用设计模式,这一直以来都是一个饱受争议的话题。但这并非本文的讨论重点。笔者的观点是,如果你需要在程序开发中使用面向对象的思想,那就不得不应用设计模式进行设计和重构,以期让自己的程序更加合理。
应该说,OpenCV 和设计模式并没有什么必然的联系,在 OpenCV 程序中实现 MVC 也没有什么特别的魔法。但在这之前,我已经读完了被称为 Gang of Four 的《设计模式:可复用面向对象软件的基础 》,感觉内容有点偏学术,不太好读。而通过 OpenCV 的实际案例来掌握几种设计模式,比起直接去阅读各种设计模式的定义要容易让人接受得多。
Read More