好的,所以这是我的代码
from PIL import Image
import cv2
import numpy
cam = cv2.VideoCapture(0)
s, im = cam.read() # captures image
pixels=tuple(numpy.asarray(im))
pixel=set(pixels)
colour=set([0, 51, 14],[0, 51, 15],[0, 51, 16],etc
pixel.symmetric difference(colour)
我希望能够将所拍摄图像的像素与我存储的像素列表进行对称差异(从两个列表/集中获取所有相似的数字)。
我也知道我的颜色设置方法是垃圾/可能是错误的,但我一次只做一件事。
无论如何,我一直在尝试将像素/像素转换为列表或集合,但这种情况不断出现
Traceback (most recent call last):
File "C:\Users\Dave\Desktop\Listo.py", line 9, in <module>
pixel=set(pixels)
TypeError: unhashable type: 'numpy.ndarray'
所以,是的,是的。我做错了什么?
答案 0 :(得分:1)
这是解释器的示例脚本。
>>> import cv2
>>> import numpy as np
首先我们读一下图片。我使用静态图像,但VideoCapture
将返回相同的数据结构。它已经是numpy.ndarray
。
>>> img = cv2.imread("test1.png")
>>> type(img)
<type 'numpy.ndarray'>
>>> img.shape
(76, 121, 3)
我们首先对图像进行整形,使其成为单行BGR像素。
>>> img = img.reshape(1,-1,3)
>>> img.shape
(1, 9196, 3)
然后我们使用tolist()
方法将ndarray
转换为Python列表。我们可以看到它是两个嵌套列表,包含行的顶级列表,以及包含列(即像素)的第二级列表。
>>> img_list = img.tolist()
>>> len(img_list)
1
>>> len(img_list[0])
9196
为了能够散列像素,我们需要将它们转换为元组。 Python map
函数适用于此。我们已经拥有单行中的所有像素,因此我们使用它。
>>> img_tuples = map(tuple, img_list[0])
>>> len(img_tuples)
9196
现在我们可以创建一组像素。
>>> img_set = set(img_tuples)
>>> len(img_set)
5981
最后,您可以再次使用元组来创建目标颜色集来表示BGR三元组。
>>> colour=set([(0, 51, 14),(0, 51, 15),(0, 51, 16)])
>>> colour
set([(0, 51, 16), (0, 51, 15), (0, 51, 14)])
找到两者的对称差异。
>>> img_diff = img_set.symmetric_difference(colour)
>>> len(img_diff)
5984