我最近遇到了一些问题,我发现用于模式匹配的模板图像类型。我使用的是OpenCV的python版本,imread
返回的图像似乎没有"类型"像C ++ OpenCV实现中的属性。
我想访问模板的类型来创建" dst" Mat
具有相同的模板大小和类型。
以下是代码:
template = cv2.imread('path-to-file', 1)
height, width = template.shape[:-1]
dst = cv2.cv.CreateMat(width,height, template.type)
--->'Error :numpy.ndarray' object has no attribute 'type'
你对这个问题有什么看法吗?
非常感谢您的回答。
答案 0 :(得分:9)
虽然可以使用template.dtype
访问numpy数组类型,但这不是您要传递给cv2.cv.CreateMat()
的类型,例如
In [41]: cv2.imread('abalone.jpg', cv2.IMREAD_COLOR).dtype
Out[41]: dtype('uint8')
In [42]: cv2.imread('abalone.jpg', cv2.IMREAD_GRAYSCALE).dtype
Out[42]: dtype('uint8')
如果您将numpy数组dtype
传递给cv2.cv.CreateMat()
,您将收到此错误,例如
cv2.cv.CreateMat(500, 500, template.dtype)
TypeError:需要一个整数
正如您所看到的,dtype不会因灰度/颜色而改变,但是
In [43]: cv2.imread('abalone.jpg', cv2.IMREAD_GRAYSCALE).shape
Out[43]: (250, 250)
In [44]: cv2.imread('abalone.jpg', cv2.IMREAD_COLOR).shape
Out[44]: (250, 250, 3)
在这里,您可以看到img.shape
对您更有用。
因此,您希望从模板中创建一个对象:
import numpy as np
dst = np.zeros(template.shape, dtype=template.dtype)
就Python API而言,它应该是可用的。
如果您希望使用C ++创建矩阵的方式,您应该记住打开模板的类型:
template = cv2.imread('path-to-file', 1) # 1 means cv2.IMREAD_COLOR
height, width = template.shape[:-1]
dst = cv2.cv.CreateMat(height, width, cv2.IMREAD_COLOR)
如果您坚持猜测类型:
虽然它并不完美,但您可以通过读取矩阵尺寸的长度来猜测,IMREAD_COLOR
类型的图像有3个维度,而IMREAD_GRAYSCALE
有2个
In [58]: len(cv2.imread('abalone.jpg', cv2.IMREAD_COLOR).shape)
Out[58]: 3
In [59]: len(cv2.imread('abalone.jpg', cv2.IMREAD_GRAYSCALE).shape)
Out[59]: 2