Как мне найти изображение, похожее на входное изображение из каталога? - PullRequest
2 голосов
/ 04 июля 2019

У меня есть программа на Python, которая распознает изображения с веб-камеры.Теперь я хочу сравнить изображение, распознанное веб-камерой, с изображениями в моем каталоге и проверить, существует ли уже точно такое же изображение.

Я пытался использовать этот алгоритм распознавания.Но это не работает.Программа всегда выводит одно изображение независимо от того, насколько отличается входное изображение.

Входное изображение (изображение, отсканированное веб-камерой) выглядит немного размытым примерно так , а изображение в наборе данных выглядит следующим образом

Мне нужен алгоритм, который может распознавать эти изображения с большей точностью.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Здесь я пишу небольшой скрипт для вас, надеюсь, что он может решить вашу проблему

import cv2
import os
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image

def read_img_from_dir(directory, query_shape):
    # query_shape is a tuple which contain the size (width, height) of query image
    # directory is your dir contain image you wanna find
    name_image = []
    shape = query
    first = True
    for pics in os.listdir(directory):
        name_image.append(pics)
        image = Image.open(pics)
        image = image.resize(shape)
        image = np.array(image)
        image = np.reshape(image,(1,-1))
        if first:
            img_array = np.copy(image)
            first = False
        else:
            img_array = np.concatenate((img,array,image),axis=0)
    return name_image, img_array    

def find_by_knn(img, list_name, list_array):
    # image_query is path of your picture you wanna find
    # list_name and list_array is result of above function
    img = np.reshape(img,(1,-1))
    num_pics = list_array.shape[0]
    dists = np.zeros((num_pics,1))
    dists = list(np.sqrt(np.sum((list_array-img)**2,axis = 1)))
    idx = dists.index(max(dists))
    return list_name[idx]

img = cv2.imread(image_query)
shape = img.shape[:2]
name_image, img_array = read_img_from_dir(directory,shape)
result = find_by_knn(img, name_image, img_array)
print(result)

Если вы хотите узнать больше о KNN, взгляните на эту ссылку: http://cs231n.github.io/classification/#nn

0 голосов
/ 04 июля 2019

ПОИСК ИЗОБРАЖЕНИЯ с использованием python openCV.

ССЫЛКА НА ОТКРЫТОЕ CV

opencv_python ‑ 4.1.0 + contrib ‑ cp35 ‑ cp35m ‑ win_amd64.whl

скачать импортcv2

import numpy as np

из matplotlib import pyplot в виде plt

img = cv2.imread('watch.jpg',cv2.IMREAD_GRAYSCALE)

cv2.imshow('image',img)
cv2.waitKey(0)

cv2.destroyAllWindows()

pip install numpy

pip install matplotlib

Matplotlib используется для отображения кадров извидео или изображения.

Numpy используется для всех вещей "числа и Python".В основном мы используем функциональность массивов Numpy.

   import cv2

импортировать numpy как np

из matplotlib import pyplot как plt

img = cv2.imread('watch.jpg',cv2.IMREAD_GRAYSCALE)

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Во-первых, мы собираемся импортировать несколько вещей Далее, мы определяем img как cv2.read (файл изображения, parms).

По умолчанию будет IMREAD_COLOR, то есть цвет без альфа-канала.

Для второго параметра вы можете использовать -1, 0 или 1. Цвет равен 1, шкала серого равна 0, а значение без изменений равно -1.Таким образом, для оттенков серого можно сделать img = cv2.imread ('watch.jpg', 0)

После загрузки мы используем cv2.imshow (title, image), чтобы показать изображение.Отсюда мы используем cv2.waitKey(0) для ожидания нажатия любой клавиши.Как только это будет сделано, мы используем cv2.destroyAllWindows(), чтобы закрыть все.

Загрузка источника видео Откройте CV Python с видео и веб-камерами.

обработка кадров из видео идентична обработке изображений.

code -

 import numpy as np

import cv2

cap = cv2.VideoCapture(0)

 while(True):

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):

    break

cap.release()

cv2.destroyAllWindows()

мы импортируем numpy и cv2 Далее, мы cay cap = cv2.VideoCapture(0).

  while(True):
ret, frame = cap.read()

мы имеем ret и frame, определяемый как cap.read ().

  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

* мы определяем новую переменную grey как frame, преобразованную в grey.

note **

* OpenCV считывает цвета как BGR (синий зеленый красный), где большинство компьютерных приложений читаются как RGB (красный зеленый синий).

 cv2.imshow('frame',gray)

Здесь мы показываем преобразованный в серый канал.

if cv2.waitKey(1) & 0xFF == ord('q'):
  break

если ключ равен aq, мы выйдем из цикла while с разрывом, который затем запускается:

cap.release()
cv2.destroyAllWindows()

Выпускает веб-камеру, затем закрывает все окна imshow ().

, если вы хотите сохранить запись, а затем обработать ее с помощью

 import numpy as np
import cv2

cap = cv2.VideoCapture(1)


fourcc = cv2.VideoWriter_fourcc(*'XVID')

out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))


while(True):

ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(frame)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
out.release()

cv2.destroyAllWindows()
...