我的 python ctypes 接口与适用于 Windows 10 的佳能 EDSDK 版本 13.11.10 的实时视图存在以下问题: EdsDownloadEvfImage 调用大约需要 2.6 秒。我不确定如何提高速度,因为这是对 EDSDK 函数的调用。
以下是下载期间调用的不同函数的一些时间信息。这些在收到将显示更改为 PC 的通知后被调用。这些测试是在佳能 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 输出更改为 PC 的通知 - 我开始以大约所需的帧速率生成线程以开始下载过程 - 为每一帧实时数据调用以下函数 {获取流,获取 evf 图像参考,下载 evf 图像,获取 evf 相关参数,如缩放值、获取长度、获取指针、释放 evf 图像参考、释放流。}
我似乎不能做得比 2-3 fps 更好。
以下是我使用适用于 windows 10 的佳能 EDSDK 版本 13.11.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
用于实时取景的 AC# 示例在使用相同 EDSDK 的同一台 PC 上以更快的帧速率工作。