Преобразовать Numpy ndarray типа dtype (uint8) в изображение, читаемое в формате OpenCV

#python #windows #numpy #opencv #direct3d

#python #Windows #numpy #opencv #direct3d

Вопрос:

Короче говоря, я изучаю, как сделать простой захват экрана с помощью этой библиотеки (реализация Python API дублирования рабочего стола Windows) и передать захваченные данные прямо в OpenCV,,.

Захваченные данные являются np.ndarray of dtype uint8 со значениями в диапазоне (0, 255) . Я попробовал несколько предложений здесь, на Stack Overflow и других веб-сайтах, но не смог обойти это и постоянно сталкивался с ошибками.

Вот мой текущий код:

 import d3dshot
import cv2

# D3D init
d = d3dshot.create(capture_output="numpy", frame_buffer_size=60)

# Choose display
for i, display in enumerate(d.displays):
    current_display = display
    print('['   str(i 1)   '] '   display.name   'n')

# Set display
current_display.i = int(input("Select display by nr.: ")) - 1
d.display = d.displays[current_display.i]
print('nYou've selected ['   str(current_display.i)   '] '   current_display.name)

# Start capturing
d.capture(target_fps=10,)

# Send frame to opencv
while True:
    #Displayed the image
    img = d.get_latest_frame()

    #Dump it like it's hot
    print(img.shape, img.dtype)
    """
    Here we will convert from np.ndarray of dtype uint8 to opencv supported img
    """
    # Pass img to Open CV
    cv2.imshow("Test Window", img)
    cv2.waitKey(0)
  

Дамп возвращает:

 Traceback (most recent call last):
  File ".capture.py", line 26, in <module>
    print(img.shape, img.dtype)
AttributeError: 'NoneType' object has no attribute 'shape'
  

Мой вопрос, конечно, в том, np.ndarray dtype uint8 в изображение, поддерживаемое OpenCV?

Комментарии:

1. Правильные массивы Numpy совместимы с OpenCV. Что в вашем коде не удается, и вы получаете сообщение об ошибке. Добавьте print(img.shape, img.dtype) после извлечения img, чтобы посмотреть, что у вас есть. Обычная проблема заключается в том, что захват кадра не выполняется, и у вас нет никакого изображения.

2. Он возвращает Traceback (most recent call last): File ".capture.py", line 26, in <module> print(img.shape, img.dtype) AttributeError: 'NoneType' object has no attribute 'shape'

3. Я полагаю, это означает, что ваш захват кадра пуст. Извините, я не знаю D3DShot. Убедитесь, что он работает, и что вы правильно обращаетесь к нему, и ваш код правильный.

4. Я только что узнал, что мне нужно сделать задержку в 100 мс после инициализации. Это была проблема. В любом случае спасибо за помощь.

Ответ №1:

Итак, причина была очень простой.. Для инициализации захвата D3DShot потребовалась некоторая задержка (я установил ее на 100 мс), и массив, наконец, не был пустым и успешно передан в OpenCV. Вот обновленный код:

 import d3dshot
import cv2
import time

# D3D init
d = d3dshot.create(capture_output="numpy", frame_buffer_size=60)

# Choose display
for i, display in enumerate(d.displays):
    current_display = display
    print('['   str(i 1)   '] '   display.name   'n')

# Set display
current_display.i = int(input("Select display by nr.: ")) - 1
d.display = d.displays[current_display.i]
print('nYou've selected ['   str(current_display.i)   '] '   current_display.name)

# Start capturing
d.capture(target_fps=60)
time.sleep(0.1)

# Send frame to opencv
while True:
    #Displayed the image
    img = d.get_latest_frame()

    #Dump it like it's hot
    print(img.shape, img.dtype)

    # Send to Open CV
    cv2.imshow("Test Window", img)
    cv2.waitKey(1)