parent
f8e1e88ce2
commit
aa695abad2
1 changed files with 78 additions and 0 deletions
@ -0,0 +1,78 @@ |
||||
import numpy as np |
||||
import cv2, cv |
||||
|
||||
help_message = ''' |
||||
USAGE: watershed.py [<image>] |
||||
|
||||
Use keys 1 - 7 to switch marker color |
||||
SPACE - update segmentation |
||||
r - reset |
||||
a - switch autoupdate |
||||
ESC - exit |
||||
|
||||
''' |
||||
|
||||
class App: |
||||
def __init__(self, fn): |
||||
self.img = cv2.imread(fn) |
||||
h, w = self.img.shape[:2] |
||||
self.markers = np.zeros((h, w), np.int32) |
||||
self.markers_vis = self.img.copy() |
||||
self.cur_marker = 1 |
||||
self.colors = np.int32( list(np.ndindex(2, 2, 2)) ) * 255 |
||||
|
||||
cv2.imshow('img', self.markers_vis) |
||||
|
||||
self.prev_pt = None |
||||
self.need_update = False |
||||
self.auto_update = True |
||||
cv2.setMouseCallback('img', self.onmouse) |
||||
|
||||
|
||||
def onmouse(self, event, x, y, flags, param): |
||||
pt = (x, y) |
||||
if event == cv.CV_EVENT_LBUTTONDOWN: |
||||
self.prev_pt = pt |
||||
if self.prev_pt and flags & cv.CV_EVENT_FLAG_LBUTTON: |
||||
color = map(int, self.colors[self.cur_marker]) |
||||
cv.Line(self.markers, self.prev_pt, pt, self.cur_marker, 5) |
||||
cv.Line(self.markers_vis, self.prev_pt, pt, color, 5) |
||||
self.need_update = True |
||||
self.prev_pt = pt |
||||
cv2.imshow('img', self.markers_vis) |
||||
else: |
||||
self.prev_pt = None |
||||
|
||||
def watershed(self): |
||||
m = self.markers.copy() |
||||
cv2.watershed(self.img, m) |
||||
vis = np.uint8( (self.img + self.colors[np.maximum(m, 0)]) / 2 ) |
||||
cv2.imshow('watershed', vis) |
||||
self.need_update = False |
||||
|
||||
def run(self): |
||||
while True: |
||||
ch = cv2.waitKey(10) |
||||
if ch == 27: |
||||
break |
||||
if ch >= ord('1') and ch <= ord('7'): |
||||
self.cur_marker = ch - ord('0') |
||||
print 'marker: ', self.cur_marker |
||||
if ch == ord(' ') or (self.need_update and self.auto_update): |
||||
self.watershed() |
||||
if ch in [ord('a'), ord('A')]: |
||||
self.auto_update = not self.auto_update |
||||
print 'auto_update if', ['off', 'on'][self.auto_update] |
||||
if ch in [ord('r'), ord('R')]: |
||||
self.markers = np.zeros(self.img.shape[:2], np.int32) |
||||
self.markers_vis = self.img.copy() |
||||
cv2.imshow('img', self.markers_vis) |
||||
cv2.destroyWindow('watershed') |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
import sys |
||||
try: fn = sys.argv[1] |
||||
except: fn = '../cpp/fruits.jpg' |
||||
print help_message |
||||
App(fn).run() |
Loading…
Reference in new issue