php下的 pHash扩展实现

最近应客户要求,需要做一个带有图片识别功能的web应用,OpenCV虽然高大上,用它来解决这个问题就是杀鸡用牛刀了,这个问题和面部识别,车牌识别的原理是不同的,在未知要分析的图片的特征的情况下,无法提取特征,只能采用比较通用的算法,也就是图片相似性比对算法,常见的有pHash和SIFT。windows下面就自己写了个类似的算法,可以凑合着用,为了提高性能,特别是识别精度和速度,就采用了linux下面php加 pHash 扩展来实现,可能是这个应用比较偏僻吧,网上只搜到两篇有参考意义的blog,里面错误比较多,很多地方牛头对不上马嘴,就把自己这次实现过程跟大家分享下,希望以后有需求的朋友,可以少走弯路。

运行环境如下  ,硬件,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扩展 ,我参考的 网贴是http://blog.chinaunix.net/uid-11009135-id-3555712.html, 它下载的是 pHash-0.9.5.tar.gz , 如果你要安装0.9.5版本的就参照上面的方案, 我下载的是最新版的 pHash-0.9.6.tar.gz, 有可能差别在这里吧,0.9.6版本的需要依赖于ffmpeg ,  http://www.phash.org/download/  从这个网址也能看出来 ,0.9.6版本需要依赖的东西,同时说明0.96版本功能是非常强大的,支持文本,图像, 音频,视频的感知近似性计算。 这个FFMPEG特别麻烦,安装了一天,依然不能正确生成ffmpeg的 so文件, 关于pHash0.9.6的 网上有一篇 文章http://blog.163.com/chen_r200509/blog/static/3411130020137554741878/   ,可以看到0.9.6版本才需要FFMPEG, 从他给出的 链接下载的ffmpeg 根本没有办法编译。  如果你只需要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

或者  https://github.com/erikd/libsndfile/  , 下载  libsndfile.zip 

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

4    wget  http://ffmpeg.org/releases/ffmpeg-3.1.2.tar.bz2

tar  -xjvf  ffmpeg-3.1.2.tar.bz2

cd  ffmpeg-3.1.2

./configure  --enable-gpl  --enable-shared  --enable-swscale  --disable-yasm
  make 
make  install 

顺便说下,我的电脑不知道什么原因,FFMPEG始终无法正常安装,所以,我花费了很大的力气,

在pHash编译的时候,将它彻底屏蔽了 才得以编译出正确的  pHash.so文件 , 我也只能说,祝你好运。

5  wget  http://www.phash.org/releases/pHash-0.9.6.tar.gz

tar  -xzvf   pHash-0.9.6.tar.gz

$ 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  , what i can say maybe is only u r tooo handsome !  

你可能感兴趣的:(软件开发模型,深圳市唤梦科技blog)