全球名称' img'没有定义?

时间:2014-03-13 17:30:58

标签: python opencv interface wxpython

我是新的编程接口。我正在用wxpython和openCV创建一个简单的界面来打开图像,保存它并关闭界面。你可以在下面看到我的代码。我可以打开图像并关闭界面。甚至,我显示了打开和保存例程的对话框,但保存是我遇到问题的地方。我不知道如何向OnSave发送要保存的img(图像对象)。这对我来说并不清楚。你能帮助我吗?提前谢谢。

import wx
import cv2

class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
    wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200, 150))
    menubar = wx.MenuBar()
    file = wx.Menu()
    edit = wx.Menu()
    help = wx.Menu()
    file.Append(101, '&Open', 'Open a new document')
    file.Append(102, '&Save', 'Save the document')
    file.AppendSeparator()
    quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
    file.AppendItem(quit)

    menubar.Append(file, '&File')
    menubar.Append(edit, '&Edit')
    menubar.Append(help, '&Help')

    self.SetMenuBar(menubar)
    self.CreateStatusBar()

    self.Bind(wx.EVT_MENU, self.OnOpen, id=101)
    self.Bind(wx.EVT_MENU, self.OnSave, id=102)
    self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

def OnOpen(self, event):
    openFileDialog = wx.FileDialog(self, "Open", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    openFileDialog.ShowModal()
    path = openFileDialog.GetPath()
    openFileDialog.Destroy()
    img = cv2.imread(str(path))
    cv2.imshow('img', img)
    return img

def OnSave(self, event):
    saveFileDialog = wx.FileDialog(self, "Save As", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    saveFileDialog.ShowModal()
    path_save = saveFileDialog.GetPath()
    print path_save
    saveFileDialog.Destroy()
    cv2.imwrite(str(path_save), img)

def OnQuit(self, event):
    self.Close()

class MyApp(wx.App):
    def OnInit(self):
       frame = MyMenu(None, -1, 'menu1.py')
       frame.Show(True)
       return True

app = MyApp(0)
app.MainLoop()

我收到以下错误:

NameError:未定义全局名称“img”

编辑(最终版):

import wx
import cv2
import numpy as np


class MyMenu(wx.Frame):
def __init__(self, parent, id, title):
    wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200, 150))
    img = np.array([0])
    menubar = wx.MenuBar()
    file = wx.Menu()
    edit = wx.Menu()
    help = wx.Menu()
    file.Append(101, '&Open', 'Open a new document')
    file.Append(102, '&Save', 'Save the document')
    file.AppendSeparator()
    quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')
    file.AppendItem(quit)

    menubar.Append(file, '&File')
    menubar.Append(edit, '&Edit')
    menubar.Append(help, '&Help')

    self.SetMenuBar(menubar)
    self.CreateStatusBar()

    self.Bind(wx.EVT_MENU, self.OnOpen, id=101)
    self.Bind(wx.EVT_MENU, self.OnSave, id=102)
    self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

def OnOpen(self, event):
    openFileDialog = wx.FileDialog(self, "Open", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
    openFileDialog.ShowModal()
    path = openFileDialog.GetPath()
    openFileDialog.Destroy()
    self.img = cv2.imread(str(path))
    cv2.imshow('img', self.img)

def OnSave(self, event):
    saveFileDialog = wx.FileDialog(self, "Save As", "", "",
                                   "PNG files (*.png)|*.png|BMP files (*.bmp)|*.bmp",
                                   wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
    saveFileDialog.ShowModal()
    path_save = saveFileDialog.GetPath()
    print path_save
    saveFileDialog.Destroy()
    cv2.imwrite(str(path_save), self.img)

def OnQuit(self, event):
    self.Close()


class MyApp(wx.App):
def OnInit(self):
    frame = MyMenu(None, -1, 'menu1.py')
    frame.Show(True)
    return True

app = MyApp(0)
app.MainLoop()

1 个答案:

答案 0 :(得分:1)

查看它是指img中使用的OnSave,如果你看,img未在范围内定义,也不是全局 em>已定义。