У меня есть следующая проблема с представлением в реальном времени с моим 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.