Python调用Canon EDSDK 13.11.10 EdsDownloadEvfImage的实时查看函数需要2.6秒

Python调用Canon EDSDK 13.11.10 EdsDownloadEvfImage的实时查看函数需要2.6秒,python,edsdk,canon-sdk,Python,Edsdk,Canon Sdk,对于windows 10的Canon EDSDK 13.11.10版的python ctypes接口,我在live view中遇到以下问题:EdsDownloadEvfImage调用大约需要2.6秒。我不知道如何提高速度,因为这是对EDSDK函数的调用 下面是下载过程中调用的不同函数的一些计时信息。这些测试是在收到将显示器更改为PC的通知后调用的。这些测试是在佳能EOS Rebel SL3上完成的 downloadEvfData: EdsCreateMemoryStream ok. time:

对于windows 10的Canon EDSDK 13.11.10版的python ctypes接口,我在live view中遇到以下问题: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更好的了

下面是我使用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

live view的C#示例在使用相同EDSDK的同一台PC上的帧速率要快得多。

听起来好像您正在生成多个线程,每个帧一个线程。如果是这样,它的速度很慢也就不足为奇了。您应该有一个线程在循环中下载帧。@JohannesBildstein谢谢您的评论。让我们仔细考虑一下如果你有一个线程,那么我就可以按顺序下载所有帧,然后在EDDSK C++上调用EDSNDRODAVEDFIGIN时间:每帧2.587秒,这使得我的帧率更差,因为它们至少要间隔这么多时间。在尝试多线程方法之前,我尝试了一个线程,所以我知道了。这个问题主要是关于C++ EDDSK调用所花费的时间-我认为较低的帧速率是…的副产品…当然当然还有其他一些我做得不对的问题。逻辑是正确的,但问题是只有一个线程可以同时调用EDSSUnLoDaveFIfI图。正在下载一个帧,所有其他线程都在等待该帧完成。在任何情况下,速度缓慢也可能是由硬件造成的。您是否尝试使用其他USB电缆或端口?@JohannesBildstein我同意,如果有多个线程,则这些线程与其他线程之间可能在某个点存在争用ra资源!?但我不确定为什么我会在单线程版本中看到同样的延迟和低帧速率,以及如何解决它。无论如何,我会再检查一次。是的,已经尝试了不同的USB电缆和端口,并获得了类似的定时问题。并且使用了C-Sharp版本的相同设置,该版本具有大约0.5秒的延迟和非常低的帧速率e、 谢谢你回来。