Как исправить OpenCV, используя несколько камер на карте PCIe, возвращая черную рамку? - PullRequest
0 голосов
/ 09 октября 2019

Я использую python OpenCV на компьютере с Windows 10 для обработки кадров с USB-камер. При запуске камер с USB-карты PCIe VideoCapture.read () большую часть времени возвращает черные рамки соответствующего размера и иногда считывает правильное изображение.

Я уже тестировал запуск камер сUSB-концентратор и обнаружил, что концентратор приведет к ошибкам подключения. По этой причине я перешел к запуску камер с карты PCIe USB 3.0, скорость которой должна быть более чем достаточной для сбора кадров со всех камер (особенно это видно из того факта, что уменьшение частоты кадров не приводит к улучшению).

Мой код выглядит так:

import cv2

code_should_be_running = True  # boolean to shut the loop down externally
camera = cv2.VideoCapture(0)  # OpenCV camera connection handle


while code_should_be_running:
    read_success, frame = camera.read()  # where the frames are returned black

    if read_success:
        processed_frame = process_frame(frame)  # OpenCV-based processing of frame
        cv2.imshow('Window Name', processed_frame)
        cv2.waitKey(1)

Я уверен, что это не проблема на уровне Python (хотя я думаю, что обходной путь все еще может быть на этом уровне). Это происходит потому, что при пошаговом выполнении кода кадры просто возвращаются черными в месте, указанном в комментарии в коде, и обработка не имеет к этому никакого отношения.

Я предполагаю, что это связано с тем, что OpenCV имеет дело с тем, как проходят соединения с USB-камерами. Однако я подумал, что карта PCIe расширит возможности OpenCV для одновременного использования камер. Пропускная способность не может быть проблемой здесь, потому что карта PCIe рассчитана на большее количество кадров, чем эти камеры могли бы производить на полной скорости. Кроме того, когда я тестировал USB-концентратор, я получал реальные ошибки соединения, но это не дает ошибок соединения, а просто возвращает черный (0 значений) кадр.

1 Ответ

0 голосов
/ 09 октября 2019

Я нашел ответ, и я добавлю его сюда в целях документации. Это немного выходит за рамки моего опыта, поэтому не стесняйтесь комментировать неправильный язык или неверные предположения.

OpenCV блокирует канал на контроллере USB для использования с VideoCapture. Любой другой объект VideoCapture, который пытается установить связь через этот канал, будет иметь проблемы со связью (хотя это не относится к другим устройствам, отличным от OpenCV, если этот канал связи имеет пропускную способность). Данная материнская плата имеет так много каналов для своих USB-соединений. Карта PCIe, которая у меня была, имея 4 порта, добавила только один канал. Вы можете купить карты PCIe, которые добавляют более одного канала. Вы должны убедиться, что ни один дескриптор VideoCapture не использует тот же канал.

Играя с ним, я хотел найти способ определить, какой канал использовал порт USB при подключении камеры, чтобы можно было определить,Камера может вызвать проблемы там, где она подключена. Я не уверен, что лучший способ сделать это, но я заметил одну вещь: если вы перейдете в (Windows 10) Диспетчер устройств -> Контроллеры универсальной последовательной шины -> -> ПодробностиЗакладка -> Свойство: Расположение Пути Значение PCI в скобках будет уникальным для контроллера USB.

Пример: PCIROOT (0) #PCI ( 1C00 ) # PCI (0000) #PCI (0100) #PCI (0000) #PCI (0400) #PCI (0000) #PCI (0100) #PCI (0000) #USBROOT (0) #USB (3) #USB (5)

Таким образом, если это значение не соответствует ни одному другому устройству VideoCapture, у него не будет проблем.

Конечно, вы всегда можете переключиться на камеры Ethernet для настройки нескольких камер, что, я считаю, является текущим рекомендуемым методом. ,Но я оставляю это здесь для всех, кому это нужно.

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