#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)