воскресенье, 20 февраля 2011 г.

Работа с HighGui

Теперь я решил познакомиться с Highgui частью (хотя в реалиях новой версии, это наполовину core часть)



Программа №1 - реализация кнопок в OpenCV
import cv

def main():
 cv.ShowImage('Main',img1)
 cv.CreateTrackbar('Change Picture','Main',val,1,switcher)
 return 0
 
def switcher(pos):
 if pos == 0:
  cv.ShowImage('Main',img1)
 else:
  cv.ShowImage('Main',img2)  

if __name__ == '__main__':
 img1 = cv.LoadImage('1.jpg')
 img2 = cv.LoadImage('2.bmp')
 val=0
 main()
 cv.WaitKey(0)

Коментарии - т.к. в OpenCV нету кнопок, то для этого применяется ползунок, с 2 возможными значениями.

Программа №2 - рисуем всякие штучки на картинке
import cv,numpy

class Painter:
    def __init__(self, windowname, dests):
        self.prev_pt = None
        self.windowname = windowname
        self.dests = dests
        cv.SetMouseCallback(self.windowname, self.on_mouse)
        
    def on_mouse(self, event, x, y, flags, param):
        pt = (x, y)
        if event == cv.CV_EVENT_LBUTTONUP or not (flags & 
   cv.CV_EVENT_FLAG_LBUTTON):
            self.prev_pt = None
        if event == cv.CV_EVENT_LBUTTONDOWN:
            self.prev_pt = pt
        if event == cv.CV_EVENT_MOUSEMOVE and (flags & 
   cv.CV_EVENT_FLAG_LBUTTON) :
            if self.prev_pt:
                cv.Line(self.dests, self.prev_pt, pt, 
                cv.ScalarAll(255), 5, 8, 0)
            self.prev_pt = pt
  
class Boxes:
 def __init__(self, windowname, image):
  self.box = [-1,-1,0,0]
  self.prev_pt = None 
  self.dests = image
  self.windowname = windowname
  cv.SetMouseCallback(self.windowname, self.on_mouse)
   
 def draw_box(self):
  cv.Rectangle(self.dests,(self.box[0],self.box[1]),
  (self.box[0]+self.box[2],self.box[1]+self.box[3]),
  cv.Scalar(0x00,0x00,0xff),5)
 
 def on_mouse(self, event, x, y, flags, param): 
  if  event == cv.CV_EVENT_MOUSEMOVE and (flags & 
   cv.CV_EVENT_FLAG_LBUTTON):
   self.box[2] = x - self.box[0]
   self.box[3] = y - self.box[1]
  if event == cv.CV_EVENT_LBUTTONDOWN:
   self.box = [x,y,0,0]
  if event == cv.CV_EVENT_LBUTTONUP:
   drawing_box == False
   if self.box[2] < 0:
    self.box[0] = self.box[0] + self.box[2]
    self.box[2] = -1
   if self.box[3] < 0:
    self.box[1] = self.box[1] + self.box[3]
    self.box[3] = -1
   self.draw_box()

def main():
 sk = None
 bx = None
 img = cv.LoadImage('1.jpg') 
 imgClear = cv.CloneImage(img)
 while True:
  cv.ShowImage("image", img) 
  c = cv.WaitKey(10)
  if c == 27:
   break
  elif c == ord('r'):
   print 'refresh image'
   cv.ShowImage("image", imgClear)
   img = cv.CloneImage(imgClear)
   if sk:
    sk = Painter("image", img)
    print 'drawing lines'
   if bx:
    bx = Boxes("image", img)
    print 'drawing boxes'
  elif c == ord('l'):
   bx = None
   sk = Painter("image", img)
   print 'drawing lines'
  elif c == ord('t'):
   cv.Rectangle(img, (1, 1), (1, 1),
   cv.Scalar(0x00, 0x00, 0xff), 5)
  elif c == ord('b'):
   sk = None
   bx = Boxes("image", img)
   print 'drawing boxes'
 
if __name__ == '__main__':
 drawing_box = False
 print "Help:"
 print "\tpress 'l' to draw lines"
 print "\tpress 'b' to draw boxes"
 print "\tpress 'r' to refresh image"
 print "\tpress 't' to draw test Rectangle"
 print "\tpress 'Esc' to exit"
 main()
   
   

Коментарии - тут все просто, рисуем как карандашом, или квадратики (они рисуются только в 1 сторону, моей целью не было правильное рисование, но работа с прослушиванием действий мыши)

Комментариев нет:

Отправить комментарий