我实际上在pcduino上用python做一个程序,我正在从外部板读取电压值。我的程序工作正常,我可以在控制台上打印值,但现在我想以图形方式显示这些值。
我想做的一个例子是显示背景图像(从文件导入的.jpg),然后根据电压数组的值和位置执行:
将要绘制的背景部分取决于我的数组索引,颜色将取决于此索引处的值(即:左侧为索引1,右侧为索引2;红色为3.3V,蓝色为2.2V,绿色为1.1V,0V无修改
def Setup():
img = ImageRead('Background.jpg')
Show(img)
def Loop():
while(1):
pos = pos + 1
V[pos]=analog_read(3)*3.3/4096 #converting level to a voltage
print "V[%d] = %f" %(pos, V[pos]) #this actually works fine
Paintbackground(pos, V[pos]) #desired function
我的目标是让'Paintbackground'像这样:
def Paintbackground(pos, val):
#Zone assignement
if (pos==1): zone = 'left'
elif (pos==2): zone = 'right'
#Color assignement
if (val==0.0): color = 'none'
elif (val==1.1): color = 'green'
elif (val==2.2): color = 'blue'
elif (val==3.3): color = 'red'
#Modify the image and show the modification in real time
img = ImageModify(zone, color) #looking for this kind of instruction
Refresh(img) #looking for this kind of instruction
我看到我可以使用openCV来加载和修改图像,但我没有看到任何实时升级/刷新的方法(无需关闭窗口或保存然后重新加载文件需要花费很多时间“)。
否则我也看到openGL是一个库,我有很多工具可以进行图形设计,但没有加载文件.jpg的可能性
请注意,我没有太多使用Python编程的经验,而且我的水平很低(即使我花了最近2天看教程和谷歌搜索)
答案 0 :(得分:0)
我已经用OpenCV创建了一些简单的例子,展示了如何在运行时修改图像。它会在每次刷新时随机添加一个白点。
import cv2
import random
import numpy as np
img = np.zeros((100,100))
cv2.startWindowThread()
while(1):
cv2.imshow('',img)
cv2.waitKey(25) # here you specify refresh rate in ms
img[random.randint(0,99),random.randint(0,99)] = 255
有关详细信息,您可以搜索OpenCV文档:http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html
答案 1 :(得分:0)
由于您的目标是对控制台输出进行实时可视化,因此最好创建和修改绘图而不是修改图像。我可以考虑以下内容。
import matplotlib.pyplot as plt
from time import sleep
img = plt.imread("background.png")
img_height = 500 # images height in pixel
img_width = 800 # image width
fig, ax = plt.subplots()
ax.imshow(img)
right = plt.axvspan(0, img_width//2, facecolor='green', alpha=0.5)
left = plt.axvspan(img_width//2, img_width, facecolor='green', alpha=0.5)
colors = {0.0: None, 1.1: 'green', 2.2: 'blue', 3.3: 'red'}
zone = {1: left, 2: right}
plt.axis([0, img_width, 0, img_height])
plt.show(block=False)
def paint_background(pos, val):
c = colors[val]
if c is None:
zone[pos].set_alpha(0)
else:
zone[pos].set_alpha(0.5)
zone[pos].set_facecolor(c)
plt.draw()
# Demonstrate how it looks like
example_sequence = [
(1, 1.1), (2, 3.3), (1, 0.0), (2, 2.2),
(1, 1.1), (2, 2.2), (2, 0.0), (2, 2.2)]
for (pos, val) in example_sequence:
paint_background(pos, val)
sleep(1)
输出看起来类似于下面的屏幕截图,彩色区域会根据您的问题中的描述而变化。
使用matplotlib可以为您提供许多其他功能,例如添加标题或设置轴描述,如果您愿意,还可以将图表序列写入文件。
答案 2 :(得分:0)
这是一个使用补丁构建多个蒙版的版本。
from time import sleep
import matplotlib.pyplot as plt
import matplotlib.patches as patches
img = plt.imread("background.png")
img_height = 500
img_width = 800
fig, ax = plt.subplots()
ax.imshow(img)
boxwidth = img_width//3
boxheight = img_height//3
zone = {}
for x in range(3):
for y in range(3):
p = ax.add_patch(patches.Rectangle(
(x*boxwidth, y*boxheight), boxwidth, boxheight,
facecolor='green', alpha=0.5))
zone[x*3 + y] = p
colors = {0.0: None, 1.1: 'green', 2.2: 'blue', 3.3: 'red'}
plt.axis([0, img_width, 0, img_height])
plt.show(block=False)
def paint_background(pos, val):
c = colors[val]
if c is None:
zone[pos].set_alpha(0)
else:
zone[pos].set_alpha(0.5)
zone[pos].set_facecolor(c)
plt.draw()
example_sequence = [
(1, 1.1), (2, 3.3), (1, 0.0), (2, 2.2),
(5, 1.1), (2, 2.2), (8, 0.0), (2, 2.2)]
for (pos, val) in example_sequence:
paint_background(pos, val)
sleep(1)
这会给你一个这样的输出: