2014-03-27
# -*- coding: utf-8 -*- """ Created on Tue Mar 25 13:06:27 2014 @author: lxx """ # -*- coding: utf-8 -*- """ Created on Mon Mar 24 15:38:06 2014 @author: lxx """ # -*- coding: utf-8 -*- """ Created on Mon Mar 24 10:32:59 2014 @author: lxx """ import wx import cv2 import os global events global image global startPointx global startPointy global flagDraw global i global data filename="jiangnan.jpg" txtname1="Pindata.txt" txtname2="Holedata.txt" image = cv2.imread(filename) class InsertFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, "Frame With Button",size=(300, 300)) panel = wx.Panel(self) #创建画板 button1 = wx.Button(panel, label="image_scr", pos=(100, 10), size=(100, 50)) self.Bind(wx.EVT_BUTTON,self.Image_scr,button1) button2 = wx.Button(panel, label="Cancel_img", pos=(100, 60), size=(100, 50)) self.Bind(wx.EVT_BUTTON,self.Cancel_img,button2) button3 = wx.Button(panel, label="Pin_data", pos=(100,110), size=(100, 50)) self.Bind(wx.EVT_BUTTON,self.Pin_data,button3) button4 = wx.Button(panel, label="Hole_data", pos=(100,160), size=(100, 50)) self.Bind(wx.EVT_BUTTON,self.Hole_data,button4) def Image_scr(self, event): global data global startPointx global startPointy global flagDraw global i global image data=[] # image = cv2.imread(filename) i=0 startPointx = 0 startPointy = 0 flagDraw = False cv2.namedWindow("rectangle",cv2.WINDOW_NORMAL) #cv2.namedWindow("rectangle_1",cv2.WINDOW_NOR cv2.imshow(‘rectangle‘,image) show_img=cv2.imshow(‘rectangle‘,image) def onMouseEvent(event,x,y,flags,param): global startPointx global startPointy global flagDraw global i #鼠标左键按下响应 if(event==1): #第一点 print "Position is: %d,%d" ,x,y startPointx = x startPointy = y i=i+1 cv2.putText(image,str(i),(startPointx,startPointy),2,1,(249,99,201)) #标数字 flagDraw = True a = str(x) b = str(y) data.append(a) data.append(b) #鼠标移动响应 if(event==0): #滑动过程 if(flagDraw==True): imgc = cv2.copyMakeBorder(image,0,0,0,0,cv2.BORDER_CONSTANT) #画矩形框 cv2.rectangle(imgc, (startPointx,startPointy), (x,y), (249,99,201),2) #cv2.putText(imgc,(x,y),CV_FONT_HERSHEY_PLAIN,2.0,(255,0,0),thickness = 2) cv2.imshow(‘rectangle‘, imgc) # print "EndPosition is: %d,%d" ,x,y #鼠标左键抬起响应 if(event==4): #第二点 if(flagDraw==True): cv2.rectangle(image, (startPointx,startPointy), (x,y), (249,99,201),2) #cv2.imshow(‘rectangle_1‘, image) flagDraw = False print "EndPosition is: %d,%d" ,x,y c = str(x) d = str(y) data.append(c) data.append(d) cv2.setMouseCallback(‘rectangle‘, onMouseEvent) cv2.waitKey() def Cancel_img(self,events): global data global i global image image = cv2.imread(filename) del data[-1] del data[-1] del data[-1] del data[-1] i=i-1 if len(data)>0: a=[] b=[] for eachline in data: eachline=eachline.strip() eachline=eachline.split(" ") for k in eachline: k=str(k) b.append(k) if len(b)==4: a.append(b) b=[] ii=0 for q in a: xa=int(q[0]) ya=int(q[1]) xb=int(q[2]) yb=int(q[3]) ii=ii+1 if i==0: ii=1 #创造新的图片,将坐标写进去 cv2.rectangle(image, (xa,ya),(xb,yb),(249,99,201),2) cv2.putText(image,str(ii),(xa,ya),2,1,(249,99,201)) cv2.imshow(‘rectangle‘, image) else: cv2.imshow(‘rectangle‘, image) def Pin_data(self,events): global data l=open(txtname1,‘w‘) f=open(txtname1,‘r‘) i_mg = cv2.imread(filename) cv2.destroyAllWindows() # data=str(data) a=[] b=[] for eachline in data: eachline=eachline.strip() eachline=eachline.split(",") for k in eachline: k=str(k) b.append(k) if len(b)==4: a.append(b) b=[] i=0 for picture in a : x = int(picture[0]) y = int(picture[1]) w = int(picture[2]) h = int(picture[3]) i+=1 I_mg = i_mg[y:h,x:w] c = cv2.imwrite(str(i)+"Pin.BMP", I_mg) for z in a: for p in z : p=str(p) l.write(p) l.write(" ") l.write("\n") l.close() f.close() def Hole_data(self,events): global data l=open(txtname2,‘w‘) f=open(txtname2,‘r‘) i_mg = cv2.imread(filename) cv2.destroyAllWindows() # data=str(data) a=[] b=[] for eachline in data: eachline=eachline.strip() eachline=eachline.split(",") for k in eachline: k=str(k) b.append(k) if len(b)==4: a.append(b) b=[] i=0 for picture in a : x = int(picture[0]) y = int(picture[1]) w = int(picture[2]) h = int(picture[3]) i+=1 I_mg = i_mg[y:h,x:w] c = cv2.imwrite(str(i)+"Hole.BMP", I_mg) for z in a: for p in z : p=str(p) l.write(p) l.write(" ") l.write("\n") l.close() f.close() if __name__ == "__main__": app = wx.PySimpleApp() frame = InsertFrame(parent=None, id=-1) frame.Show() app.MainLoop()
用界面控制程序的操作,可以截图,保存数据,也可以后退
出现的问题以及解决:
1. 刚开始按照之前的滑鼠直接粘帖过来,之前是由键盘控制窗口的退出的,然后转为用界面控制之后,控制不了,一直跳不出滑鼠的循环,经过普霖的指点,不要用循环,因为每次滑一次而已,而且,用另外一个按键控制窗口的关闭,控制窗口关闭的是cv2.destroyAllWindows()。
2.。保存数据:因为按键与按键之间是并列关系的,不能互相关连,所以保存数据的时候保存不了。然后马麟叫我将数据data做成全局变量,然后解决了.
3..在画图后退这一部分,刚开始是可以口退了,当又重新画的时候,之前删去的又全部都出来了,结果是因为虽然image做了全局变量,但是在下面(后退的那部分)没有再次标明image是全局变量。要在每一个用到全局变量的地方再次用global image。
原文:http://www.cnblogs.com/heizaiaha/p/3627518.html