C++

在Eclipse下编译Dlib

Dlib是一款非常优秀的C++库,尤其是其中的人面部landmark点检测功能,可以在2ms左右的时间检测出面部的68个标记点。Dlib官方推荐采用CMake的方式来编译,并且给出了一些“example"以及对应的编译方法。 由于自己的项目采用了OpenCV,且开发是在Eclipse下完成的,所以需要在项目中引入Dlib,具体方法如下。 下载最新的Dlib源码 git clone https://github.com/davisking/dlib.git 假设你的代码存放在/tmp目录下,那Dlib的路径看上去是这个样子:/tmp/dlib。在这个目录下还存在一个名为dlib的文件夹,里边存放的正是Dlib的源代码。 配置include路径 打开需要使用的工程,依次点击Project >

TensorFlow

TensorFlow中的TFRecord文件

背景:最近在学习TensorFlow,需要将自定义图像数据作为训练数据。 标准TensorFlow格式 TensorFlow的训练过程其实就是大量的数据在网络中不断流动的过程,而数据的来源在官方文档[^1](API r1.2)中介绍了三种方式,分别是: Feeding。通过Python直接注入数据。 Reading from files。从文件读取数据,本文中的TFRecord属于此类方式。 Preloaded data。将数据以constant或者variable的方式直接存储在运算图中。 当数据量较大时,官方推荐采用标准TensorFlow格式[^2](Standard TensorFlow format)来存储训练与验证数据,该格式的后缀名为tfrecord。官方介绍如下: A TFRecords

Dlib编译错误Converting std::__cxx11::string to std::string

在编译Dlib的时候总是无法通过,报错信息包含Converting std::__cxx11::string to std::string。 🤔 一开始以为是Dlib的问题,但是在github查询发现dlib的作者davis认为这个是编译器错误[1]。以错误信息作为关键词继续检索在stackoverflow发现这样一则解释[2],原来是gcc5.4要求编译与链接的库文件采用统一的ABI版本[3]。所以,技术ldd命令一看,libstdc++.so.6路径里居然有Anaconda! 反正也不常用,干脆卸载了它。然后就一切正常了。 理论上将Anaconda从系统PATH变量中去掉也可以,如果你遇到类似的问题不妨试试看。 REF https://github.com/davisking/dlib/issues/

OpenCV

手动安装OpenCV下的IPP加速库

在 Learning OpenCV 这本书中,作者提到OpenCV可以利用Intel的IPP性能库来提升程序的运行速度,而这个IPP库是要另外进行购买的。实际上,Intel为当前的OpenCV免费提供了IPP加速库的一部分,在此我们称之为ippcv。 ippcv会在cmake的时候自动从github上下载,但是在网络状况不佳的情况下会下载失败。这时候我们只能采用手动安装的方式。 ippcv的下载地址其实就藏在ippcv.cmake文件中。里边有几个比较重要的变量。 第一个是IPPICV_COMMIT,它的值可以从代码中找到: set(IPPICV_COMMIT "a62e20676a60ee0ad6581e217fe7e4bada3b95db") 第二个是OPENCV_IPPICV_URL,同理可以找到: "$ENV{OPENCV_IPPICV_URL}

创建Github仓库的本地镜像

在一家制造业公司从事软件开发的工作存在一个痛点就是Github的访问总是慢的让人抓狂。这种情况下针对一些常用的在Github上的开源项目,有必要在本地保存一份仓库的镜像,方便内网的用户抓取。幸运的是,Github官方提供了这样的一份教程教你如何制作仓库镜像,地址如下: https://help.github.com/articles/duplicating-a-repository/ 针对上述的情况,应当选择方案为 Mirroring a repository in another location。 以OpenCV为例,首先创建一个本地的clone git clone --mirror https://github.com/opencv/opencv.git 然后设定镜像仓库的地址

OpenCV

重新设定OpenCV Tracker的跟踪对象

OpenCV附加模块opencv_contrib下提供了一个特殊的Tracking模块。该模块实现了6种不同的跟踪算法:BOOSTING,MIL,KCF,TLD,MEDIANFLOW和GOTURN。Object Tracking using OpenCV (C++/Python)这篇文章中详细对这几种方法进行了介绍与比较。同时官方也提供了示例代码演示如何使用这个模块。 示例代码对视频中的一个对象进行了跟踪,但是当前面临的问题是,当希望换一个对象跟踪的时候,以下两种做法都是无效的: 将新对象的Rect2d直接传递给update()函数; 再次使用tracker的init()函数。 这个问题在这篇文中的评论区也有讨论。 解决办法其实也不复杂:重新创建一个Tracker对象。假设你之前创建的对象为tracker,那么重新使用create函数建立一个新对象即可: tracker = Tracker::create( "

linux

使用ANSI Escape Code刷新控制行输出

简单的C++程序多采用printf()或者cout <<的方式来将文本输出到终端窗口。如果我们希望输出的内容刚好处在循环内部的话,你会在终端窗口中看到输出的内容不断增加,将之前的输出“顶”出了窗口,如下图: 如果我希望新的输出覆盖旧的输出,看上去就是在原地刷新,如下图,该怎么办? 此时你需要ANCI escap code。套用一下维基百科上的介绍: In computing, ANSI escape codes (or escape sequences) are a method using in-band

Android

Google Mobile Vision API需要网络连接

采用Google Mobile Vision API来进行人脸检测,在做真机测试的时候无法在图片中标记出人脸。在Android Studio的Android Monitor状态栏中显示: Local module descriptor class for com.google.android.gms.vision.dynamite not found 这个原因是Googl Mobile Service在第一次检测人脸的时候,需要在线下载一些文件。在没有网络连接的情况下,会提示上述错误。具体可参考:https://github.com/googlesamples/android-vision/

Android

采用C++开发Android APP

作为一名算法开发人员,一定会有大量项目是用C/C++开发完成的。随着移动设备功能日益强大,总会有这么一天,你需要把曾经的C++代码移植到Android系统中运行。这正是我最近面临的状况。作为一名从未写过JAVA的业余程序员,如何解决这个问题? 问题分析 遇到困难先不要慌,镇静下来仔细分析一下情况。首先,需要移植的工程从功能上来分析大致可以分为三大模块: 调用摄像头进行人脸检测; 根据检测到的信息进行进一步计算; 将结果输出,控制后端的硬件。 第一部分调用了第三方视觉库OpenCV。第二和第三部分是自己编写的C++代码。考虑到Android系统本身提供了人脸检测的模块可供调用,第一部分的问题算不上棘手。在之前的项目中,第二部分内容的原理已经非常清晰,大不了用JAVA再实现一遍。第三部分因为平台与控制硬件发生了变化,有同事可以提供支持,在此可以不予考虑。所以我需要完成的事项就变为: 在Android系统下实现摄像头调用与人脸检测;

Android

Install Android Studio on Ubuntu 16.04

由于工作原因需要在Ubuntu上安装Android Studio,遇到两个坑列在这里。 Gradle卡在解决依赖关系 Android Studio安装完成后新建空工程,然后状态栏里显示Gradle在尝试解决依赖关系,并且花费很长时间也无法完成。 原因:我的网络需要通过proxy,且Gradle需要HTTPS proxy。 解决办法:新建项目,当Android提示Gradle提示输入proxy信息时,记住同时启用基于HTTPS的proxy。 找不到文件radeonsi_dri.so 当运行Emulator时,报错:libGL error: unable to load driver: radeonsi_dri.so 这个其实和AMD没有关系,是ADC自带的libstdc++库文件造成的[

Hi, 2017!

站在2017年的开端,回头才发现自己在2016的年初的时候并没有做出任何计划。如果仿照上次对2016年进行总结的话,大致可以概括为: 保持体重在67Kg,体脂率保持在18%。 iOS平台APP已上线:PPI计算器。 摇了一年的小汽车指标——暂时还没有中标。 除了上面这些事情,我心里依然觉得有很多需要写下来。 工作 2016年是我转岗一线研发的第一年。这一年主攻计算机图形图像,啃书、写代码、做项目、发论文,仔细想想也是收获不小的一年。从最开始的踌躇满志夹杂着丝丝的不确定,到年底对新研究方向的笃定,中间经历了太多的事情。只是个中酸甜苦辣,无法公开来讲,只愿自己在未来不会忘记这个跌宕起伏的2016年。 生活 相比工作而言,这一年的生活用平平淡淡来形容再合适不过。作息规律、身体无恙。 财务 上边这张图是随手记的年终报表。

OpenCV

Debug OpenCV

OpenCV是一款开源计算机视觉库。诞生于Intel公司的研究中心,成熟于Intel俄罗斯软件团队[1]。它可以应用在摄像机标定、深度信息感知、模式识别、机器学习等领域。OpenCV采用C/C++来实现,可以在不同的平台下运行(包括Android与iOS),是学习图像处理,机器视觉不可多得的优秀样本。 这篇文章简要介绍了如何在Linux环境下搭建OpenCV的Debug环境。完成后,您就可以在Eclipse中单步调试程序,查看变量数值、跟踪代码流转细节。 所有工作会分两部分: 编译OpenCV的Debug静态库; 在Eclipse项目中正确配置编译与链接参数。 *准备工作* OpenCV的Debug是在如下环境下实现的,供您参考。 * 操作系统:Ubuntu 16.04 * OpenCV: 3.1.

你的人生值几分 - 「黑镜」Black Mirror S03E01

多图剧透,酌情观看 朝阳中一边晨跑一边看手机的就是我们的主角Lacie。 他和弟弟一起住在租住的房子里。 他们生存的世界科技发达,每个人看上去都很幸福,就连着装的风格都相当的一致。 只不过有一点:每个人都绑定了一个分数。每次你看到一个人时,旁边都会显示它当前的分数。(这个植入人体的黑科技在第二季里曾出现过,分数是这集独有的) 这个分数直接反应了周围人对你的好感度,满分5分,谁都可以对你评分,例如你的同事、咖啡小哥,甚至陌生人~ 除了面对面的评分,你的朋友圈也算哦~ 为了获得好评(或者防止给差评),在电梯里遇到第一天上班的陌生人,也要偷偷通过黑科技浏览对方朋友圈,没话找话聊~ 感觉很累有么有! 😓 由于房东要卖房子,我们的主角Lacie约了中介看房,并且一眼就相中了一个高档小区的房子。只可惜,房租超出预期了.. 不过中介说了,

iOS

Apple官方二维码与人脸检测示例代码

在Apple Developer站点发现了一段官方的示例代码,展示了如何做实时的二维码读取与人脸检测。 因为最近一直在研究计算机人脸检测,尝试之后发现Apple提供的人脸检测模块已经非常成熟,主要表现为: 检测速度快,在我的iPhone 5C上感觉不到延迟; 算法比较稳健,无论手机是竖直还是倾斜,旋转,都能很好的检测到人脸; 报点位置稳定。不会像OpenCV示例代码中那样跳来跳去。(当然,在OpenCV中也可以加卡尔曼滤波来处理)。 对于开发者来说,这已经是可用度非常高的模块了。 代码下载地址: https://developer.apple.com/library/prerelease/content/samplecode/AVCamBarcode/Introduction/Intro.html

PPI是什么

PPI:画面细腻程度的直接描述 PPI是Pixels Per Inch的缩写,这是一个显示技术工程中经常用到的单位,用来描述像素密度。中文可以翻译为“每英寸像素个数”。 为什么PPI这么重要?因为显示屏在工作时呈现出来的完整画面,其实是由一小块一小块的发光点拼起来的,这些发光的小点,我们称之为像素。PPI越高,意味着在相同尺寸的屏幕内像素的个数越多,排列越紧密。在人眼看来的直观感受就是画面更加细腻。 Retina显示:多高的PPI才能满足你的需求 既然PPI决定了显示屏画面的细腻程度,那么是不是PPI越大越好?要想弄清楚这一点,必须从显示屏的直接服务对象——我们的眼睛说起。 我们用视锐度来描述人眼对微小细节的辨识能力,这是一个可以量化的数值,但是它的单位并非你熟悉的分辨率,而是空间频率CPD (Cycle Per Degree),即观察明暗相间条纹时单位角度可以辨识出的条纹对数。

ghost

如何从Wordpress迁移到Ghost

前言 最近把博客系统从Wordpress替换为Ghost。主要原因是: Wordpress加载太慢了; 多年来积攒的博文数量并不多,Wordpress众多高级的功能都没有排上用场; 找到一款合适主题太难了。 具体步骤 切换到Ghost并不是很困难,大概分3步: Step 1: 安装导出到Ghost的插件 这个插件会将你的所有博文和页面内容导出为json格式。具体可参见参考资料[^3]。需要注意的是Ghost无法把Wordpress的分类导出,所以你需要想好自己的分类目录要如何处理。 Step 2: 迁移upload文件夹 你在Wordpress上传的图片与附件都在这个文件夹里。这个文件夹对应Ghost目录里的content/images文件夹。所以需要把相关的文件前移过去。并且将第一步中json文件中关于附件的url进行替换,具体请参考[1]。 Step 3: 迁移评论 Ghost没有自带的评论系统,官方推荐使用Disquz,

web

Ubuntu 16.04安装Brackets

Ubuntu 16.04在安装Brackets时会报错,提示缺少依赖包libgcrypt11。通过apt-get则只能安装到更新一点的libgcrypt20。 这是一个BUG,因为Brackets用了ChromiumEmbeded的一个较老的分支造成的,而且现在依旧是open的状态。 好在Github上的@dinusuresh提供了一个方法:安装libgcrypt11来规避这个问题。 32-bit: https://launchpad.net/ubuntu/+archive/primary/+files/libgcrypt11_1.5.3-2ubuntu4.2_i386.deb 64-bit: https://launchpad.net/ubuntu/+archive/primary/