我最近遇到了一些问题,找到了我用于模式匹配目的的模板图像的类型.我使用的是OpenCV的python版本,返回的图像imread似乎没有像C++ OpenCV实现中那样的"type"属性.
我想访问模板的类型来创建Mat具有相同大小和类型的模板的"dst" .
这是代码:
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'
Run Code Online (Sandbox Code Playgroud)
你对这个问题有什么看法吗?
非常感谢你的回答.
bak*_*kal 10
虽然确实可以使用numpy数组类型来访问template.dtype,但这不是您要传递给的类型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')
Run Code Online (Sandbox Code Playgroud)
如果你传递numpy数组dtype,cv2.cv.CreateMat()你会得到这个错误,例如
cv2.cv.CreateMat(500, 500, template.dtype)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到它对img.shape你更有用.
因此,您希望从模板中创建一个对象:
import numpy as np
dst = np.zeros(template.shape, dtype=template.dtype)
Run Code Online (Sandbox Code Playgroud)
就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)
Run Code Online (Sandbox Code Playgroud)
如果你坚持猜测类型:
虽然它不完美,你可以通过读取矩阵的尺寸长度猜测,类型的图像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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17348 次 |
| 最近记录: |