我有一个python程序,它将检测来自网络摄像头的图像。现在,我想将网络摄像机识别的图像与目录中的图像进行比较,并检查是否已经存在完全相似的图像。
我尝试使用this识别算法,但无法正常工作。程序将始终输出单个图像,无论输入图像有多大差异。
输入图像(由网络摄像头扫描的图像)模糊不清like this,而数据集中的图像looks like this
我需要一种可以更准确地识别这些图像的算法。
答案 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)
opencv_python‑4.1.0 + contrib‑cp35‑cp35m‑win_amd64.whl
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
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
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()