Fenrier Lab

Vert.x 实践 (1):异步回调

本系列文章主要是想记录下我在学习和使用 vertx 框架过程中总结的一些经验技巧,同时巩固对 vertx 的理解。 Vert.x 是 Java 中的异步编程框架,当然还支持除 Java 之外的几种语言,在我看来,它以很现代化的方式为 Java 编程带来了一种新的体验。说到异步编程,就不得不提回调函数这种很有用的概念,在 vertx 中,无处不在的异步调用让我们不得不最先对回调函数进行仔细介绍。 在同步编程的环境中,调用一个函数之后,程序必须等待函数返回再执行下一行代码,也就是说,程序的执行顺序和我们的编码顺序是相同的,所以同步编程的好处就是让程序员可以很容易掌握程序的执行过程和状态,方便调试。而它的缺点也很明显,那就是不太容易充分利用资源,因为在等待函数返回的时候,程序实际上什么都...
点我阅读更多...

OpenCV 图像处理——非线性拉伸

remap 是一个非常有意思的函数,它可以将当前图片按我们给出的规则进行变换,这次我们要研究的是怎样使用 remap 函数进行图片的非均匀拉伸,效果如下图所示 可以看到,图片右边的拉伸程度极小,并且越往左,拉伸程度逐渐增大。为了实现这样的效果,我们先简单介绍一下 remap 函数,由于我使用的是 opencv 的 java 绑定库,所以这里以 Imgproc 类中的 remap 作为说明原型 public static void remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation); 该函数有5个参数,其含义分别是 1) src: 原图像 mat,这是我们提供的原始图片。 2) dst: 目标图像 m...
点我阅读更多...

如何使用算法抠图——Closed Form Matting 算法以及优化-1

本文算法思想主要来自于下文,算法优化部分为原创 A. Levin, D. Lischinski and Y. Weiss, “A Closed-Form Solution to Natural Image Matting,” in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 30, no. 2, pp. 228-242, Feb. 2008. 我们先对算法进行介绍,然后再考虑优化问题。 简介 抠图是一种很常见的图像处理应用,简单来说,抠图就是保留需要的像素,并删去图片的其他部分。于是潜在地,图片就被分为了两个部分,被称为前景和背景,若前景像素用 F 表示,背景像素用 B 来表示...
点我阅读更多...

利用 Cont Monad 封装计算

从回调方法说起 回调是一种很有效的异步编程方法,举一个简单的例子,如果我们要执行一个数据库查询语句,通常会像下面这样 Statement stat = ...; String sql = ...; ResultSet result = stat.executeQuery(sql); //后续工作 其中,后续工作可能与查询结果有关,也可能无关。如果无关的话,那么等待查询结果返回其实是不必要的,如果对性能要求比较高,那这很显然会成为瓶颈。一个比较粗糙的解决方法是把耗时操作放到另一个线程中执行 new Thread(() -> { ResultSet result = stat.executeQuery(sql); }).start(); //后续代码 ...
点我阅读更多...

Java 之美--过程封装

当我对 Java 还用得不是很熟练的时候,拥有 lambda 表达式的 jdk 8 发布了。于是怀着强烈的好奇心,去了解了一些 lambda 演算方面的知识,对于半路出家的我来说,仿佛来到了一个全新的世界。 在一开始,我并不知道如何在合适的地方去使用这个特性,仿佛它只是普通方法的一个时髦替代品而已,但我知道事实并非如此。直到后来读到了 SICP 这本书前面的章节,才算是有所领悟。可是,作为一个 Javaer,肯定还是想用 Java 来实现才会觉得踏实。下面我们就来看看,如何利用 lambda 表达式来抽象行为。 首先我们从最简单的数组求和开始 public double sum(double[] arr) { return sum(arr, 0); } private...
点我阅读更多...