>>见下面的编辑<<
我正在通过pyUSB使用FTDI D2xx驱动程序处理来自串行的特殊像素化CCD相机的数据.
相机可以在PC上以高带宽运行,最高可达80帧/秒.我很喜欢这种速度,但是知道Python不可行,因为它是一种脚本语言,但我想知道我能接近多少 - 是否是我在代码中遗漏的一些优化,线程化,或使用其他方法.我立刻认为打破最耗时的循环并将它们放在C代码中,但我没有太多的C代码经验,也不确定让Python与它内联进行的最佳方法,如果可能的话.我使用SciPy/Numpy在Python中大量开发了复杂的算法,这些算法已经过优化并具有可接受的性能,因此我需要一种方法来加速数据采集以反馈到Python,如果这是最好的方法.
难度,以及我使用Python而不是其他语言的原因,是因为需要能够轻松地跨平台运行它(我在Windows中开发,但是我将代码放在嵌入式Linux板上,制作一个独立系统).如果你建议我使用其他代码,比如C,我怎样才能跨平台工作?我从来没有在Windows和Linux之间编译像C这样的低级语言,所以我想确定这个过程 - 我必须为每个系统编译它,对吧?你有什么建议?
ReadStream: 'RXcount'是114733,用于设备读取,从字符串到字节等效格式化
返回表示二进制值的字节列表(0-255)
当前执行时间:0.037秒
def ReadStream(RXcount):
global ftdi
RXdata = ftdi.read(RXcount)
RXdata = list(struct.unpack(str(len(RXdata)) + 'B', RXdata))
return RXdata
Run Code Online (Sandbox Code Playgroud)
ProcessRawData:将字节列表重新整形为与像素方向匹配的数组
在修剪掉一些不需要的字节后,在3584x32阵列中产生结果.
数据是唯一的,因为每个14行的块代表设备上一行像素的14位(跨越8位/字节= 256位的32字节),即256×256像素.处理后的数组有32列字节,因为每个字节(二进制)代表8个像素(32个字节*8位= 256个像素).还在研究如何做到这一点...... 我之前已经发布了一个问题
当前执行时间:0.01秒......不错,它只是Numpy
def ProcessRawData(RawData):
if len(RawData) == 114733:
ProcessedMatrix = np.ndarray((1, 114733), dtype=int)
np.copyto(ProcessedMatrix, RawData)
ProcessedMatrix = ProcessedMatrix[:, 1:-44]
ProcessedMatrix = np.reshape(ProcessedMatrix, (-1, 32))
return ProcessedMatrix
else:
return None
Run Code Online (Sandbox Code Playgroud)
最后,
GetFrame:设备有一个模式,它只输出一个像素是否检测到任何东西,使用数组的最低位(每第14行) - 获取该数据并转换为每个像素的int
结果为256x256数组,在每第14行处理后,这些字节将被读取为二进制(32字节跨... 32字节*8位= 256像素跨)
当前执行时间:0.04秒
def GetFrame(ProcessedMatrix):
if np.shape(ProcessedMatrix) == …Run Code Online (Sandbox Code Playgroud)