我正在尝试将opencv的Threshold
函数应用于numpy数组。我正在使用opencv 2.1的python绑定。它是这样的:
import cv
import numpy as np
a = np.random.rand(1024,768)
cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY)
这会引发错误:
OpenCV Error: Unsupported format or combination of formats () in threshold
所以,我不相信我知道自己在做什么,但我希望Threshold
可以像Smooth
一样工作,我可以在其中运行
cv.Smooth(a,a)
没有任何问题,最终得到一个平滑的(呃)图像。我不确定如何考虑像opencv看到的numpy数组的“格式”,但我不愿意将numpy数组转换为opencv图像格式,如果我不需要(并且我的所有尝试都失败了无论如何)。
我想知道为什么Threshold
没有以明显天真的方式工作,我试图让它发挥作用,而且知道我应该做些什么会很棒。
P.S。我知道我自己可以在numpy数组上执行阈值操作,但我想弄清楚opencv。
答案 0 :(得分:11)
显然Threshold
方法比Smooth更繁琐 - 它只适用于8位整数/ 32位浮点数组(参见here),因此上面的代码片段不起作用,因为numpy数组默认为float64。
因此,如果更改创建数组的行以强制精度为32位浮点数
>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’)
然后很高兴达到门槛:
>>> ((a>0) & (a<1)).sum()
786432
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY)
>>> ((a>0) & (a<1)).sum()
0