0

Windows 10 用の Canon EDSDK バージョン 13.11.10 への Python ctypes インターフェイスのライブ ビューで次の問題があります。 EdsDownloadEvfImage の呼び出しに約 2.6 秒かかります。これは EDSDK 関数の呼び出しであるため、速度を改善する方法がわかりません。

以下は、ダウンロード中に呼び出されるさまざまな関数のタイミング情報です。これらは、PC への表示変更の通知を受け取った後に呼び出されます。これらのテストは 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

PC への evf 出力変更の通知を受け取ったら - ダウンロード プロセスを開始するために必要なフレーム レートでスレッドの生成を開始します - ライブ データの各フレームに対して次の関数が呼び出されます {ストリームの取得、evf 画像参照の取得、evf 画像のダウンロード、ズーム値、長さの取得、ポインターの取得、evf 画像参照の解放、ストリームの解放などの evf 関連パラメーターを取得します。}

2-3 fps よりも優れているようには見えません。

以下は、Windows 10 用の Canon 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 ではるかに高速なフレーム レートで動作します。

4

0 に答える 0