Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 blobFromImages中的image.depth()断言失败_Python_Opencv - Fatal编程技术网

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

Python blobFromImages中的image.depth()断言失败,python,opencv,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 = n

我正在尝试使用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()需要一个帧数组。因此,我将一个形状为(32480640,3)的numpy数组作为参数传递。有人能帮我找出我遗漏了什么吗?我似乎找不到使用blobFromImages()的示例。我想使用它,因为它可能比使用blobFromImage()减少处理时间。

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

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

由于这是来自OpenCV的C++实现,所以可以假定 Is/Cuth>是一个实例(我们可以检查源代码来确定这个)。文件说明如下:

返回矩阵元素的深度

该方法返回矩阵元素深度的标识符(每个通道的类型)。例如,对于16位有符号元素数组,该方法返回
CV\u 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开始),我们可以参考列出值的文档

#define     CV_32F   5
因此,错误消息显示:

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



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

深度在
cv::Mat
中表示元素的数据类型。值5对应32位浮点看看给它
np.float32(frames)
是否能解决它。谢谢你,@DanMašek。这确实解决了问题!