在Python中使用OpenCV时发生blobFromImage断言错误
我正在尝试使用Python中的OpenCV运行(而不是训练)Caffe网络 我的图像(在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
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
,那么这是非常简单的