我正在尝试使用 dnn 模块中的 blobFromImages 创建多个帧的 blob。
def batch_process(self, frames):
blob = cv.dnn.blobFromImages(frames, 1./255, (368, 368), (0, 0, 0), swapRB=False, crop=False)
self.net.setInput(blob)
out = self.net.forward()
detected_points = np.zeros((frames.shape[0], 36))
for i in range(frames.shape[0]):
points = np.array([])
for j in range(18):
heatMap = out[i, j, :, :]
_, conf, _, point = cv.minMaxLoc(heatMap)
if conf > 0.1:
points = np.append(points, [point[0], point[1]])
else:
points = np.append(points, [0, 0])
detected_points[i] = points
return detected_points
Run Code Online (Sandbox Code Playgroud)
但是当我调用该函数时,我收到如下错误:-
OpenCV(3.4.1) Error: Assertion failed (image.depth() == 5) in blobFromImages, file /opt/opencv/modules/dnn/src/dnn.cpp
Run Code Online (Sandbox Code Playgroud)
blobFromImage() 在类似的单帧上运行良好。据我了解, blobFromImages() 需要一个帧数组。因此,我传递一个形状 (32, 480, 640, 3) 的 numpy 数组作为参数。有人可以帮我找出我错过了什么吗?我似乎找不到使用 blobFromImages() 的示例。我想使用它,因为它可能比使用 blobFromImage() 减少我的处理时间。
首先让我们分析错误消息并将其翻译成易于理解的内容。
Assertion failed (image.depth() == 5) in blobFromImages
Run Code Online (Sandbox Code Playgroud)
由于这是来自 OpenCV 的 C++ 实现,因此可以安全地假设它image是一个实例cv::Mat(我们可以检查源代码来确定这一点)。的文档cv::Mat::depth()说明如下:
返回矩阵元素的深度。
该方法返回矩阵元素深度的标识符(每个单独通道的类型)。例如,对于 16 位有符号元素数组,该方法返回
CV_16S。矩阵类型的完整列表包含以下值:
CV_8U- 8 位无符号整数 ( 0..255 )CV_8S- 8 位有符号整数 (-128..127)CV_16U- 16 位无符号整数 ( 0..65535 )CV_16S- 16 位有符号整数 (-32768..32767)CV_32S- 32 位有符号整数 (-2147483648..2147483647)CV_32F- 32位浮点数(-FLT_MAX..FLT_MAX、INF、NAN)CV_64F- 64位浮点数(-DBL_MAX..DBL_MAX、INF、NAN)
好的,它是数组中每个单独元素的数据类型。要破译 的值5代表哪种数据类型(提示:上面的列表按升序排列,编号从 0 开始),我们可以参考Core HAL的文档,其中列出了这些值。
#define CV_32F 5
Run Code Online (Sandbox Code Playgroud)
因此,错误消息显示:
我期望得到 32 位浮点数组,但我得到了其他东西。
您没有向我们展示您到底是如何创建的frames,但可以安全地假设它是一个 8 位无符号整数数组。要解决这个问题,只需将其转换为正确的数据类型 - 即使第一个参数为cv.dnn.blobFromImagesbe np.float32(frames)。