我正在尝试使用 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

但是当我调用该函数时,我收到如下错误:-
OpenCV(3.4.1) Error: Assertion failed (image.depth() == 5) in blobFromImages, file /opt/opencv/modules/dnn/src/dnn.cpp

blobFromImage() 在类似的单帧上运行良好。 据我所知, blobFromImages() 需要一个帧数组。因此,我传递了一个形状为 (32, 480, 640, 3) 的 numpy 数组作为参数 。有人可以帮我找出我错过了什么吗?我似乎无法找到使用 blobFromImages() 的示例。我想使用它,因为它可能比使用 blobFromImage() 减少我的处理时间。

最佳答案

首先让我们分析错误消息并将其翻译成易于理解的内容。

Assertion failed (image.depth() == 5) in blobFromImages

由于这来自 OpenCV 的 C++ 实现,因此可以安全地假设 image cv::Mat 的一个实例(我们可以检查源代码来确定这一点)。 cv::Mat::depth() 的文档说明如下:



好的,所以它是数组中每个单独元素的数据类型。要破译5的值代表哪种数据类型(提示:上面的列表是按升序排列的,编号从0开始),我们可以引用Core HAL的文档,其中列出了这些值。
#define     CV_32F   5

所以,错误信息说:



您没有向我们展示您是如何创建 frames 的,但可以安全地假设它是一个 8 位无符号整数数组。要解决这个问题,只需将其转换为正确的数据类型——即将 cv.dnn.blobFromImages 的第一个参数设为 np.float32(frames)

关于python - blobFromImages 中的断言失败 image.depth(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55873713/

10-11 04:14