最近应客户要求,需要做一个带有图片识别功能的web应用,OpenCV虽然高大上,用它来解决这个问题就是杀鸡用牛刀了,这个问题和面部识别,车牌识别的原理是不同的,在未知要分析的图片的特征的情况下,无法提取特征,只能采用比较通用的算法,也就是图片相似性比对算法,常见的有pHash和SIFT。windows下面就自己写了个类似的算法,可以凑合着用,为了提高性能,特别是识别精度和速度,就采用了linux下面php加 pHash 扩展来实现,就把自己这次实现过程跟大家分享下,希望以后有需求的朋友,可以节约时间。
运行环境如下 ,硬件,I3处理器2.4G双核,4G内存,软件, win7 ,+vmware worksatation10 ,+ubuntu12.04。 (apache 2.4 , php 5.7 )
怎么在虚拟机下安装 ubuntu ,设置让它能上网,安装一些编译程序需要的库, 这部分就忽略了。
php 开发环境搭建, 如果想省事的可以采用lnmp一键安装包,下载地址http://lnmp.org/install.html,
安装的时候 ,可以选择lnmpa ,就连apache也给安装上去了, 安装完毕 ,运行下 lnmp status , 可以看到 nginx ,myslq , php,apache,都在运行状态了 。
documentRoot :/home/wwwroot/default
浏览器 输入网址 localhost/phpinfo.php ,显示正常,说明安装成功。
下面开始安装pHash扩展 ,,0.9.5版本的安装起来应该省事,只支持图片比较,但我想使用最新版本 pHash-0.9.6,下载地址 http://www.phash.org/download/ ,该网址也列出了 0.9.6版本需要依赖的东西,0.96版本功能是非常强大的,支持文本,图像, 音频,视频的感知近似性计算。 这个FFMPEG特别麻烦,整了老半天,依然不能正确生成ffmpeg的 一系列so文件。 如果你只需要image 识别, 不考虑音视频, 那么可以不用FFMPEG的,那就考虑把对FFMPEG的依赖给去除了,这个需要很大的工作量,修改makefile 等文件, 还要修改 phash的 源文件 , 注意,是在下面列出的步骤5和6中实现的,不是在4中实现。这个过程有点复杂, 但解决思路就是那样的,我也那么干的。至于你在编译安装FFMPEG的时候会不会遇到问题, 这个我也不确定,只能看你的运气了,实在怕麻烦,就去下载.0.95 版的吧。
下面我就贴出我的下载地址,编译安装步骤
1 wget http://cimg.eu/files/CImg_latest.zip
unzip CImg_latest.zip
cp CImg-1.7.5/CImg.h /usr/local/include
2 到 http://download.csdn.net/download/angle502/7632179
unzip libsndfile.zip
cd libsndfile
$ ./autogen.sh
$ ./configure --enable-werror
$ make
$ make check
3 http://download.csdn.net/download/dragon810913/2412579
下载 安装 libsamplerate0.1.7
解压,
进入 目录 libsamplerate
./configure
make
make install
./configure --enable-gpl --enable-shared --enable-swscale --disable-yasm
make
make install
顺便说下,我的电脑不知道什么原因,FFMPEG始终无法正常安装,所以,我花费了很大的力气,
在pHash编译的时候,将它彻底屏蔽了 才得以编译出正确的 pHash.so文件 , 我也只能说,祝你好运。
$ cd pHash-0.9.6
$ ./configure --enable-video-hash=no --enable-audio-hash=no LIBS="-lpthread"
$ make && make install
6 $ cd pHash-0.9.6/bindings/php
$ phpize
$ ./configure LIBS="-lpthread" --with-php-config=/usr/local/php/bin/php-config
$ make
$ make test
$ make install
7 手工编辑 php.ini ,添加pHash扩展
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pHash.so
# restart apache ,重启web服务器,,,如果是用lnmp安装包安装的话,可以尝试命令,lnmp restart
8 ldd /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pHash.so
检查下 动态库依赖 是否完整,
php -m
查看下 php 加载了哪些扩展 , pHash.so有没有扩展成功
9 写个 测试 phash的php文件 , 用到phash的主要代码 ,
$h2=ph_dct_imagehash($ImagePath1);
$h1= h_dct_imagehash($ImagePath2);
$distance =ph_image_dist($h1, $h2);
==========下面的截图就是两张图片的比对结果=======
======= End====觉得博主辛苦的就去点个赞吧,哈哈=====
如果你上传几张图片,测试结果 ,发现自己的图片,有时间居然比猪还更像猪,那一点都不奇怪, 算法是死的,人是活的,有写时候工具,关键还要看你怎么去应用它。
While u find the Hamming distance between ur profile and a pig's is zero , what i can say maybe is only u r tooo handsome !