断言blobFromImages中的image.depth()失败

时间:2019-04-26 19:14:14

标签: python opencv

我正在尝试使用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()减少我的处理时间。

1 个答案:

答案 0 :(得分:1)

首先让我们分析错误消息并将其转换为易于理解的内容。

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

由于这来自OpenCV的C ++实现,因此可以安全地假设imagecv::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

因此,错误消息显示:

  

我期望得到32位浮点数组,但我得到了其他东西。


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