将整数列表转换为位列表Python

弗朗西斯

我目前正在尝试将视频数据馈送到激光器(我们使用激光器进行通信)。激光器通过调制工作,共有2个状态,分别为0和1。因此,为了让我向激光器馈送视频数据,我首先需要将其转换为位。我的帧是从带有openCV的网络摄像机获取的,由2D数组表示,这些数组包含8位整数以获取灰度图像。当前,我将这些数组转换如下:

if __name__ == '__main__':
video = Video()

frame = video.getFrameBits()

Video类定义为:

class Video:
# scale_percent: percent of original size of frame
def __init__(self, scale_percent=100):
    self.cap = cv2.VideoCapture(0)

    # Get one frame to figure out sizing constraints
    _, frame = self.cap.read()

    width = int(frame.shape[1] * scale_percent / 100)
    height = int(frame.shape[0] * scale_percent / 100)
    self.dim = (width, height)

# color: If true show color frames. Not yet implemented
def getFrame(self, color=False):
    _, frame = self.cap.read()

    frame = cv2.resize(frame, self.dim, interpolation=cv2.INTER_AREA)

    if not color:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        return gray

def getFrameBits(self):
    frame = self.getFrame()

    for row in frame:
        for pixel in row:
            frame_bits.append(intToBits(pixel))
    
    return frame_bits

和int到bit的功能如下:

def intToBits(x):
    send = str(bin(x).lstrip('0b'))
    send = send.zfill(8)

    return send

我使用intToBits函数的原因是因为我希望能够采用我调用的这个数组frame,并将其直接送入激光器。在当前的实现中,前导零不会从数组中被截断。所以我得到类似的输出:[10010101,10010100,10010101,10010111,10010110,10010101,10010100,10010001,10010001,01011000,...]

整个代码的问题在于,它在我可用的微控制器上运行太慢。获得一帧大约需要5秒钟,这真是太糟糕了。我的第一个想法是摆脱getFrameBits中的嵌套for循环,如下所示:

frame_bits = [intToBits(pixel) for row in frame for pixel in row]

这确实节省了时间,但是我想看看是否可以进一步改善它。我们仍然需要大约1秒钟来获得帧,这更好,但是我们期望更大的采样率。

我的下一个想法是用C编写代码并在Python中运行,但是我对C不太熟悉。因此,尽管我愿意这样做,但我想确保它是正确的方向。

还有其他一些方法可以优化此代码吗?

谢谢!

沙米斯

有点位屏蔽应该可以解决问题:

伴随着一点点的矢量化-如果已经用C编写的numpy内置的内置代码支持您,则无需编写C代码。

import numpy as np
import cProfile, pstats, io

input_size = 1000000
#since I don't have your image, I made do with a random sample of 8bit numbers.
test_input = np.random.randint(0, 256, input_size)
#to check that we get the correct result, set input_size to 2
#and uncomment the line below
#test_input = [255, 7]

#your function for the speed comparison purposes
def intToBits(x):
    send = str(bin(x).lstrip('0b'))
    send = send.zfill(8)
    return send

#note, that in this case x is the whole array, not just one number
#to make the full use of the vectorization
#also the output is not a bitfield, but a string
#the > 0 at the end is to convert the result into booleans.
#strictly speaking it isn't necessary if you are fine with 0 1 integers.
def binary_repr(x):
    return(
    np.dstack((
    np.bitwise_and(x, 0b10000000) >> 7,
    np.bitwise_and(x, 0b1000000) >> 6,
    np.bitwise_and(x, 0b100000) >> 5,
    np.bitwise_and(x, 0b10000) >> 4,
    np.bitwise_and(x, 0b1000) >> 3,
    np.bitwise_and(x, 0b100) >> 2,
    np.bitwise_and(x, 0b10) >> 1,
    np.bitwise_and(x, 0b1)
    )).flatten() > 0)

#starting the profiler.
pr = cProfile.Profile()
pr.enable()

#the two computations that we want to compare
a = []
for i in range(input_size):
    a.append(intToBits(test_input[i]))
print(a)
b = binary_repr(test_input)
print(b)

#the comparison
sortby = 'cumulative'
pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())

为了完整起见,探查器将得出以下结果:

  ncalls  tottime  percall  cumtime  percall filename:lineno(function)
  1000000    0.577    0.000    0.920    0.000 (intToBits)
        2    0.195    0.098    0.195    0.098 {built-in method builtins.print}
  1000000    0.125    0.000    0.125    0.000 {method 'lstrip' of 'str' objects}
  1000000    0.119    0.000    0.119    0.000 {built-in method builtins.bin}
  1000000    0.099    0.000    0.099    0.000 {method 'zfill' of 'str' objects}
  1000008    0.082    0.000    0.082    0.000 {method 'append' of 'list' objects}
        1    0.030    0.030    0.062    0.062 (binary_repr)

如您所见,即使生成数据也比切换到按位表示形式花费更多的时间。尽管由于输出格式有点不同(一个大型数组而不是数组数组),您将需要对其进行一些修改以适合您的代码,但这样做值得。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将整数转换为位列表

来自分类Dev

如何在Python中将整数转换为位列表

来自分类Dev

将整数列表转换为单词

来自分类Dev

将字符串列表转换为整数列表

来自分类Dev

将长整数列表转换为整数

来自分类Dev

Python将字符串列表转换为整数列表

来自分类Dev

(Python) 将整数列表转换为元组/集合会改变整数的位置

来自分类Dev

如何将整数列表转换为字节?

来自分类Dev

将整数列表转换为Unicode C#

来自分类Dev

将整数列表转换为字符串

来自分类Dev

Haskell sqrt-将整数列表转换为Float

来自分类Dev

将整数列表转换为字符串

来自分类Dev

将整数列表转换为Unicode C#

来自分类Dev

将纯数字从文件转换为整数列表

来自分类Dev

如何将整数列表转换为字节?

来自分类Dev

将整数列表转换为浮点数

来自分类Dev

将字符串数组转换为整数列表?

来自分类Dev

在python中将8位列表转换为32位整数数组

来自分类Dev

Python解析,将字符串转换为整数列表

来自分类Dev

如何将整数列表转换为列表列表?

来自分类Dev

将字符串列表从文件转换为整数列表

来自分类Dev

将逗号分隔的字符串列表转换为整数列表

来自分类Dev

将包含整数列表的字符串列表转换为数组

来自分类Dev

Ansible-如何将字符串列表转换为整数列表?

来自分类Dev

将字符串列表转换为从1开始的整数列表

来自分类Dev

将字符串列表转换为Common Lisp中的整数列表

来自分类Dev

将字符串列表从文件转换为整数列表

来自分类Dev

将对象列表转换为通过检查的整数列表

来自分类Dev

在Python中x元素后仅用一个逗号将整数列表转换为字符串

Related 相关文章

热门标签

归档