如何从目录中找到与输入图像相似的图像?

How do I find an image similar to the input image from a directory?

我有一个 python 程序可以检测来自网络摄像头的图像。现在,我想将网络摄像头识别的图像与我目录中的图像进行比较,并检查是否已经存在完全相似的图像。

我试过使用this识别算法,但它不起作用。无论输入图像有多么不同,程序总是输出单个图像。

输入图像(网络摄像头扫描的图像)有点模糊like this while the image in the data set looks like this

我需要一种可以更准确地识别这些图像的算法。

这里给大家写个小脚本,希望能解决你的问题

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 的信息,请查看此内容link:http://cs231n.github.io/classification/#nn

使用 python openCV 进行图像搜索。

LINK 公开简历

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

下载导入cv2

import numpy as np

从 matplotlib 导入 pyplot 为 plt

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

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

cv2.destroyAllWindows()

pip 安装 numpy

pip 安装 matplotlib

Matplotlib 用于显示视频或图像中的帧。

Numpy 用于所有事情 "numbers and Python." 我们主要是利用 Numpy 的数组功能。

   import cv2

将 numpy 导入为 np

从 matplotlib 导入 pyplot 为 plt

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

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

首先我们要导入一些东西 接下来,我们将 img 定义为 cv2.read(image file, parms)。

默认值为 IMREAD_COLOR,这是没有任何 alpha 通道的颜色。

第二个参数可以使用-1、0、1,颜色为1,灰度为0,不变为-1。因此,对于灰度,可以做 img = cv2.imread('watch.jpg', 0)

加载后,我们使用cv2.imshow(title,image) 来显示图像。从这里, 我们使用 cv2.waitKey(0) 等待任何键被按下。一旦完成, 我们使用 cv2.destroyAllWindows() 来关闭所有内容。

正在加载视频源打开简历Python 带有视频和网络摄像头。

处理视频帧与处理图像相同。

代码--

 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)

*我们定义一个新的变量gray,作为frame,转换为gray。

注意**

*OpenCV 将颜色读取为 BGR(蓝绿红), 大多数计算机应用程序读取为 RGB(红绿蓝)。

 cv2.imshow('frame',gray)

在这里,我们显示 converted-to-gray 提要。

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

如果 key 是 q,我们将使用 break 退出 while 循环,然后运行:

cap.release()
cv2.destroyAllWindows()

这会释放网络摄像头,然后关闭所有 imshow() windows。

如果你想保存录音然后使用

进行处理
 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()