【问题标题】:Using OpenCV's Image Hashing Module from Python在 Python 中使用 OpenCV 的图像散列模块
【发布时间】:2019-09-05 05:40:03
【问题描述】:

我想在 Python 中使用 OpenCV 的 perceptual hashing functions

这行不通。

import cv2
a_1 = cv2.imread('a.jpg')
cv2.img_hash_BlockMeanHash.compute(a_1)

我明白了:

TypeError: descriptor 'compute' requires a 'cv2.img_hash_ImgHashBase' object but received a 'numpy.ndarray'

这也失败了

a_1_base = cv2.img_hash_ImgHashBase(a_1) 
cv2.img_hash_BlockMeanHash.compute(a_1_base)

我明白了:

TypeError: Incorrect type of self (must be 'img_hash_ImgHashBase' or its derivative)

显示此内容的 Colab 笔记本:

https://colab.research.google.com/drive/1x5ZxMBD3wFts2WKS4ip3rp4afDx0lGhi

【问题讨论】:

标签: python opencv phash


【解决方案1】:

在这里,我将向您展示如何使用 OpenCV 计算 64 位 pHash。 我定义了一个函数,它从传入的彩色 BGR cv2 图像返回无符号的 64 位整数 pHash:

import cv2
    
def pHash(cv_image):
        imgg = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY);
        h=cv2.img_hash.pHash(imgg) # 8-byte hash
        pH=int.from_bytes(h.tobytes(), byteorder='big', signed=False)
        return pH

您需要安装并导入 cv2 才能正常工作。

【讨论】:

    【解决方案2】:
    pip install opencv-python
    pip install opencv-contrib-python    #img_hash in this one 
    

    (https://pypi.org/project/opencv-python/)

    【讨论】:

      【解决方案3】:

      OpenCV python 接口与 C++ 接口之间存在一个常见的兼容性差距(即类之间的继承方式不同)。有 *_create() 静态函数。

      所以你应该使用:

      hsh = cv2.img_hash.BlockMeanHash_create()
      hsh.compute(a_1)
      

      在您的协作笔记本副本中: https://colab.research.google.com/drive/1CLJNPPbeO3CiQ2d8JgPxEINpr2oNMWPh#scrollTo=OdTtUegmPnf2

      【讨论】:

      • 它返回一个数组,如何得到一个数字?
      • hash_xor = reduce(lambda x, y: x ^ y, hash[0]) ?
      • 它给了我以下错误:AttributeError: module 'cv2.cv2' has no attribute 'img_hash'。我的opencv-pythonopencv-contrib-python 版本是4.3.0
      • 删除opencv-python并重新安装,解决了问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2021-07-03
      • 2019-04-08
      • 2022-01-24
      相关资源
      最近更新 更多