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

时间:2019-07-04 05:12:38

标签: python opencv image-recognition

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

我尝试使用this识别算法,但无法正常工作。程序将始终输出单个图像,无论输入图像有多大差异。

输入图像(由网络摄像头扫描的图像)模糊不清like this,而数据集中的图像looks like this

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

2 个答案:

答案 0 :(得分:1)

在这里,我为您编写了一个小脚本,希望它可以解决您的问题

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

答案 1 :(得分:0)

使用python openCV进行图像搜索。

打开简历的链接

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 install numpy

pip安装matplotlib

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

Numpy用于所有“数字和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(图像文件,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()关闭所有内容。

加载视频源打开CV 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接下来,我们确定cap = cv2.VideoCapture(0)。

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

我们将ret和frame定义为cap.read()。

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

*我们定义了一个新的变量,灰色,作为框架,转换为灰色。

注意**

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

 cv2.imshow('frame',gray)

在这里,我们正在显示转换为灰色的提要。

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

如果key是q,我们将暂停并退出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()