Python вызов Canon EDSDK 13.11.10 Функция просмотра в реальном времени для EdsDownloadEvfImage занимает 2,6 с - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующая проблема с представлением в реальном времени с моим python интерфейсом ctypes для Canon EDSDK версии 13.11.10 для windows 10: вызов EdsDownloadEvfImage занимает около 2,6 с. Я не уверен, как улучшить скорость, так как это вызов функции EDSDK.

Ниже приведена временная информация для различных функций, вызываемых во время загрузки. Они вызываются после получения уведомления об изменении отображения на P C. Эти тесты были проведены на Canon EOS Rebel SL3.

downloadEvfData: EdsCreateMemoryStream ok. time: 0.000
downloadEvfData: EdsCreateEvfImageRef ok. time: 0.000
downloadEvfData: EdsDownloadEvfImage ok, time: 2.589
downloadEvfData: Length Ok = c_ulonglong(160035)
downloadEvfData: Get length ok. time: 0.002
downloadEvfData: Get pointer ok. time: 0.000
downlaodEvfData: copy bytes time: 0.000
downloadEvfData: full fn time: 2.598


downloadEvfData: EdsCreateMemoryStream ok. time: 0.000
downloadEvfData: EdsCreateEvfImageRef ok. time: 0.000
downloadEvfData: EdsDownloadEvfImage ok, time: 2.587
downloadEvfData: Length Ok = c_ulonglong(159924) 
downloadEvfData: Get length ok. time: 0.002
downloadEvfData: Get pointer ok. time: 0.001
downlaodEvfData: copy bytes time: 0.000
downloadEvfData: full fn time: 2.596

Как только я получаю уведомление об изменении выхода evf на P C - я запускаю потоки с примерно желаемой частотой кадров, чтобы начать процесс загрузки - следующие функции вызываются для каждого кадра живых данных {получить поток, получить ссылку на изображение evf, загрузить изображение evf, получить параметры, связанные с evf, такие как значения масштабирования, получить длину, получить указатель, выпустить ссылку на изображение evf, выпустить поток.}

Кажется, я ничего не могу сделать лучше, чем 2-3 кадра в секунду.

Ниже приведен пример кода из моей функции загрузки с использованием Canon EDSDK версии 13.11.10 для windows 10:

from ctypes import *

err = c_int32(-1)        
evfStream = c_void_p()
evfImageRef = c_void_p()

err = self.EDSDK64Dll.EdsCreateMemoryStream(0, byref(evfStream))

err = self.EDSDK64Dll.EdsCreateEvfImageRef(evfStream, byref(evfImageRef))

err = self.EDSDK64Dll.EdsDownloadEvfImage(inCameraRef, evfImageRef)

outLength = c_uint64(0)
err = self.EDSDK64Dll.EdsGetLength(evfStream, byref(outLength))

image_data = (c_ubyte * outLength.value)()
p_image_data = (POINTER(c_ubyte))(image_data)
# get the pointer to the starting memory location of the stream
err = self.EDSDK64Dll.EdsGetPointer(evfStream, byref(p_image_data))

# copy over the data from obtained location of image_data
# check if ctypes string_at can be used to speed up copy
arr_bytes = bytearray(string_at(p_image_data, outLength.value)) 

im = (Image.open(io.BytesIO(arr_bytes))).transpose(Image.FLIP_LEFT_RIGHT) # PIL image

A C# Пример для просмотра в реальном времени более высокая частота кадров на том же P C с использованием того же EDSDK.

...