Не удалось выполнить диссертацию image.depth () в blobFromImages - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь создать блоб из нескольких кадров, используя blobFromImages в модуле dnn.

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) в качестве параметра .Может кто-нибудь помочь мне выяснить, что мне не хватает?Я не могу найти примеры с использованием blobFromImages ().Я хотел бы использовать это, поскольку это может уменьшить мое время обработки, чем использование blobFromImage ().

1 Ответ

1 голос
/ 26 апреля 2019

Сначала давайте проанализируем сообщение об ошибке и переведем его во что-то простое для понимания.

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

Поскольку это исходит из реализации 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

Итак, сообщение об ошибке гласит:

Я ожидал получить массив из 32-битных чисел с плавающей запятой, но я получил что-то еще.


Вы не показываете, как именно вы создали frames, но можно с уверенностью предположить, что это массив 8-битных целых чисел без знака.Чтобы решить эту проблему, просто преобразуйте ее в правильный тип данных, то есть укажите первый аргумент cv.dnn.blobFromImages как np.float32(frames).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...