【问题标题】:How to plot binary data in python?如何在python中绘制二进制数据?
【发布时间】:2017-05-24 06:11:50
【问题描述】:

首先我知道我的问题经常被问到。但我没有在其中找到解决方案。

我使用 USBTMC 来控制示波器。 Here 你可以找到更多关于它的信息。我能够捕获屏幕并将其写入文件(见图)。但我想每隔n 秒实时绘制屏幕。例如,我想使用matplotlib.pyplot

这是我的代码(拼命尝试用pyplot 绘制数据):

import usbtmc
from time import sleep 
import matplotlib.pyplot as plot
import numpy as np
import subprocess

maxTries = 3

scope = usbtmc.Instrument(0x0699, 0x03a6)
print scope.ask("*IDN?")

scope.write("ACQ:STOPA SEQ")
scope.write("ACQ:STATE ON")

while ( True ):
  #get trigger state  
  trigState = scope.ask("TRIG:STATE?")
  #check if Acq complete 
  if ( trigState.endswith('SAVE') ):
    print 'Acquisition complete. Writing into file ...'
    #save screen
    scope.write("SAVE:IMAG:FILEF PNG")
    scope.write("HARDCOPY START")

    #HERE I get binary data
    screenData = scope.read_raw()

    #HERE I try to convert it?
    strData = np.fromstring( screenData, dtype=np.uint8 )

    #HERE I try to plot previous
    plot.plot( strData )
    plot.show()

    #rewrite in file (this works fine) 
    try:
      outFile = open("screen.png", "wb")
      outFile.write( screenData )
    except IOError:
      print 'Error: cannot write to file'
    else:
      print 'Data was written successfully in file: ', outFile.name
    finally:
      outFile.close()
 #continue doing something

运行此代码后,我得到...看看图片。

【问题讨论】:

  • 您是否尝试过plt.imshow(strData),但首先您需要根据屏幕尺寸对数据进行整形:strData.reshape(screen_y, screen_x),其中 screen_x * screen_y = len(strData)
  • 我像你说的那样试过了,我收到以下错误Traceback (most recent call last): File "./ScreenCapture.py", line 31, in <module> strData.reshape( screen_y, screen_x ) ValueError: cannot reshape array of size 77878 into shape (77878,77878)
  • 我应该提一下,如果你的数组大小是 77878,那么屏幕 x,y 应该是这个因素。但是 77878 的因数是 1693 x 46,这是一个奇怪的屏幕尺寸,所以你得到的数据可能包含的信息不仅仅是屏幕像素,或者不是 8 位。
  • 如何知道这些数据的特征?
  • screenData 是一个纯粹的png image。我认为您不想浏览字节并自己解码。一个简单的选择可能是使用plt.imread

标签: python matplotlib binary-data data-conversion


【解决方案1】:

很遗憾,我无法对其进行测试,但您可以尝试类似的方法

import io

screenData = scope.read_raw()
arrayData = plt.imread(io.BytesIO(screenData))
plt.imshow(arrayData)
plt.show()

我想指出,对于实时绘图,最好不要从示波器屏幕获取图像,而是从原始数据获取。这应该允许更快的操作。

【讨论】:

  • 你是对的。但我不知道该怎么做。顺便说一句,我需要查看示波器显示屏上的所有设置。
  • 根据您的建议出现以下错误:Traceback (most recent call last): File "./ScreenCapture.py", line 33, in <module> arrayData = plot.imread(io.BytesIO(screenData)) File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2177, in imread return _imread(*args, **kwargs) File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1258, in imread return handler(fname) RuntimeError: _image_module::readpng: file not recognized as a PNG file。我认为这个示波器不支持以png 格式保存。如果改为eps 会怎样?
  • 因为这个outFile = open("screen.png", "wb"); outFile.write( screenData ) 适合你,也因为你设置了scope.write("SAVE:IMAG:FILEF PNG"),所以我觉得你确实有一个png 图像。打开保存的文件而不是 io-stream 时,您是否遇到相同的错误?
  • 不,打开.png(使用feh)时没有任何错误。或者我不明白你。你的意思是我应该尝试用io打开这个文件吗?
  • 我的意思是,如果你使用plt.imread("screen.png") 会出现同样的错误
猜你喜欢
  • 2021-07-24
  • 2020-11-17
  • 1970-01-01
  • 2011-03-04
  • 2017-07-10
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多