Использование модуля хеширования изображений OpenCV из Python

#python #opencv #phash

#python #opencv #phash

Вопрос:

Я хочу использовать функции хеширования восприятия OpenCV из Python.

Это не работает.

 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

Комментарии:

1. Взгляните на это: pyimagesearch.com/2017/11/27/image-hashing-opencv-python

Ответ №1:

Это общий пробел в совместимости интерфейса OpenCV python с интерфейсом C (т. Е. Классы не наследуются друг от друга одинаково). Для этого есть *_create() статические функции.

Поэтому вам следует использовать:

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

В копии вашей записной книжки collab:
https://colab.research.google.com/drive/1CLJNPPbeO3CiQ2d8JgPxEINpr2oNMWPh#scrollTo=OdTtUegmPnf2

Комментарии:

1. он возвращает массив, как получить одно число?

2. hash_xor = уменьшить (лямбда x, y: x ^ y, хэш [0])?

3. Это дает мне следующую ошибку: AttributeError: module 'cv2.cv2' has no attribute 'img_hash' . Моя opencv-python и opencv-contrib-python версия 4.3.0

4. Удаление opencv-python и переустановка его, решили проблему!

Ответ №2:

 pip install opencv-python
pip install opencv-contrib-python    #img_hash in this one 
  

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

Ответ №3:

Здесь я покажу вам, как вычислить 64-битный pHash с помощью OpenCV. Я определил функцию, которая возвращает 64-разрядный целочисленный pHash без знака из переданного цветного изображения BGR cv2:

 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.

Комментарии:

1. Есть ли способ сгенерировать хэш размером более 8 байт? например, 16-байтовый.