在运行时python中修改图像

时间:2016-02-20 16:03:17

标签: python user-interface opencv opengl runtime

我实际上在pcduino上用python做一个程序,我正在从外部板读取电压值。我的程序工作正常,我可以在控制台上打印值,但现在我想以图形方式显示这些值。

我想做的一个例子是显示背景图像(从文件导入的.jpg),然后根据电压数组的值和位置执行:

  • 将图像的左侧涂成红色,而不是在控制台上为位置1打印3.3V
  • 将图像的右侧涂成红色,而不是在控制台
  • 上为位置2打印3.3V

将要绘制的背景部分取决于我的数组索引,颜色将取决于此索引处的值(即:左侧为索引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天看教程和谷歌搜索)

3 个答案:

答案 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)

输出看起来类似于下面的屏幕截图,彩色区域会根据您的问题中的描述而变化。

enter image description here

使用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)

这会给你一个这样的输出:

enter image description here