Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用OpenCV时发生blobFromImage断言错误_Python_Opencv_Blob - Fatal编程技术网

在Python中使用OpenCV时发生blobFromImage断言错误

在Python中使用OpenCV时发生blobFromImage断言错误,python,opencv,blob,Python,Opencv,Blob,我正在尝试使用Python中的OpenCV运行(而不是训练)Caffe网络 我的图像(img)是(48118)的单通道ndarray #类似RGB的单通道 帧=np.0((img.shape[0],img.shape[1],3)) 帧[:,:,0]=img 帧[:,:,1]=img 帧[:,:,2]=img 然后我将其标准化为0-1 frame/=np.max(frame) 最后,我使用blobFromImage函数创建了一个“blob”,并在稍后为网络提供数据 inpBlob=cv2.dn

我正在尝试使用Python中的OpenCV运行(而不是训练)Caffe网络

我的图像(
img
)是(48118)的单通道
ndarray

#类似RGB的单通道
帧=np.0((img.shape[0],img.shape[1],3))
帧[:,:,0]=img
帧[:,:,1]=img
帧[:,:,2]=img
然后我将其标准化为0-1

frame/=np.max(frame)
最后,我使用
blobFromImage
函数创建了一个“blob”,并在稍后为网络提供数据

inpBlob=cv2.dnn.blobFromImage(帧,大小=(368368),平均值=(0,0,0),swapRB=False,裁剪=False)
问题发生在使用上述线路之后。它会引发断言错误:

---------------------------------------------------------------------------
错误回溯(最近一次呼叫上次)
中的c:\Users\helde\code\main.py
---->67 inpBlob=cv2.dnn.blobFromImage(帧,大小=(368368),平均值=(0,0,0),swapRB=False,crop=False)
错误:OpenCV(3.4.2)C:\Miniconda3\conda bld\OpenCV-suite_153439934306\work\modules\dnn\src\dnn。cpp:177:
错误:(-215:断言失败)函数“cv::dnn::experimental\U dnn\U v5::blobFromImages”中的image.depth()==5

有人知道是什么原因导致了这个错误吗?

我真的不想回答我自己的问题,但是,如果其他人也有同样的问题,我会回答

解决方案非常简单,OpenCV的
blobFromImage
需要
uint8
格式的图像

因此,在我的例子中,变量
frame
是灰度的,之前我将其缩放为0-1:

frame/=np.max(frame)
在这种情况下,新帧是
float

使用
blobFromImage
并将其放入
uint8
的正确等待时间是:

img=((frame/np.max(frame))*255.astype('uint8'))
你需要这个
…astype('uint8')
否则你会有一些像素值在0-255之间但仍然是
浮点格式的东西

示例:灰度图像 假设我们有一个
float
图像(
img
),我们想用
blobFromImage
对其进行预处理,尺寸为100x100:

打印(img.shape,type(img),img.dtype)
(48118)64
现在,如前所述将其转换为灰度

img=((img/np.max(img))*255.astype('uint8'))
只是想核实一下:

打印(img.shape,type(img),img.dtype)
(48118)uint8
现在我们可以应用
blobFromImage

inpBlob=cv2.dnn.blobFromImage(img,
大小=(368368),
平均值=(0,0,0),
swapRB=假,
裁剪=假)
现在,您必须拥有4D:

print(inpBlob.shape,type(inpBlob),inpBlob.dtype)
(1,1368,368)浮动
检查

示例:RGB图像
float
uint8
的部分基本相同,唯一的区别是复制图像时有3个通道RGB。我将把整个代码放在这里,并指出复制部分:

#我们从与之前相同的浮点图像(img)开始
#转换为uint8。还是一个频道
img=((img/np.max(img))*255.astype('uint8'))
打印(img.shape,type(img),img.dtype)
(48118)uint8
#将唯一通道复制3次。还有其他方法可以做到这一点:
img_rgb=np.zero((img.shape[0],img.shape[1],3),dtype=np.uint8)
img_rgb[:,:,0],img_rgb[:,:,1],img_rgb[:,:,2]=img,img,img
#现在您将在形状中看到第三个维度
打印(img_rgb.shape、type(img_rgb)、img_rgb.dtype)
(48,118,3)uint8
#应用blobFromImage函数
inpBlob=cv2.dnn.blobFromImage(img_rgb,
大小=(368368),
平均值=(0,0,0),
swapRB=假,
裁剪=假)
#检查。。。
打印(inpBlob.shape,type(inpBlob),inpBlob.dtype)
(1,3,368,368)浮动
#这3个通道反映在InBlop形状的第二个组件中。
正如您所看到的,如果您在之前将对象更改为
uint8
,那么这是非常简单的