phash计算png图片指纹返回总为0

今天在用phash做线上封面图去重,之前自己开发机mac上有个用port install phash安装的phash,源码是phash.org中提供的c++版本的,没遇到啥问题。今天打算用docker包一下放服务器上跑,发现了个有趣的现象,所有的png图片计算出来的指纹都是0。

In [214]: lib = ctypes.CDLL(find_library('pHash'), use_errno=True)
In [215]: phash = ctypes.c_uint64()
In [216]: lib.ph_dct_imagehash("/tmp/new3.png", ctypes.pointer(phash))
Out[216]: 0

In [217]: phash
Out[217]: c_ulong(0L)

而后在mac上直接编译使用,结果同上,也是总为0。很有意思,一开始一直在检查自己的代码,直到简化成只剩几行了,还是有问题。一直没敢怀疑phash.org上已经放出来好几年的代码,毕竟那一套东西2013年之后就没变过了,应该没啥太大问题。

04.23.2013 pHash 0.9.6 released. Fix some compilation errors and warnings, as well as updates to the automake files to support building on Gentoo.

而后开始对源码进行修改,采用print大法来debug,才发现真的是phash写的有些问题。

CImg<float> img;
if (src.spectrum() == 3){
        img = src.RGBtoYCbCr().channel(0).get_convolve(meanfilter);
    } else if (src.spectrum() == 4){
    int width = img.width();
        int height = img.height();
        int depth = img.depth();
    img = src.crop(0,0,0,0,width-1,height-1,depth-1,2).RGBtoYCbCr().channel(0).get_convolve(meanfilter);
    } else {
    img = src.channel(0).get_convolve(meanfilter);
    }
img.resize(32,32);

这段代码来源于ph_dct_imagehash方法,就是算phash的核心方法,这边用Cimg对图像做了一些处理,src是输入的原始图片,img应该是处理完之后的,生成一个32*32的图片。src.spectrum()方法获取图片通道,png图片有RGBA四个通道,问题就出在这,这块应该是想获取图片的宽高信息,而后做截图处理。然而img还没初始化,返回的都只能是0,导致后边各种计算返回一片0,修改为src后即可。

else if (src.spectrum() == 4){
    int width = src.width();
        int height = src.height();
        int depth = src.depth();
    img = src.crop(0,0,0,0,width-1,height-1,depth-1,2).RGBtoYCbCr().channel(0).get_convolve(meanfilter);
    }
小记

说实话,这是我第一次对权威的代码(这应该算权威吧?)动手,只能说,代码总是人写的,总是会有bug的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值