'''\r
-browse.py shows how to implement a simple hi resolution image navigation\r
+browse.py\r
+=========\r
+\r
+Sample shows how to implement a simple hi resolution image navigation\r
+\r
+Usage\r
+-----\r
+browse.py [image filename]\r
+\r
'''\r
\r
import numpy as np\r
import cv2\r
import sys\r
\r
-print 'This sample shows how to implement a simple hi resolution image navigation.'\r
-print 'USAGE: browse.py [image filename]'\r
-print \r
-\r
-if len(sys.argv) > 1:\r
- fn = sys.argv[1]\r
- print 'loading %s ...' % fn\r
- img = cv2.imread(fn)\r
-else:\r
- sz = 4096\r
- print 'generating %dx%d procedural image ...' % (sz, sz)\r
- img = np.zeros((sz, sz), np.uint8)\r
- track = np.cumsum(np.random.rand(500000, 2)-0.5, axis=0)\r
- track = np.int32(track*10 + (sz/2, sz/2))\r
- cv2.polylines(img, [track], 0, 255, 1, cv2.CV_AA)\r
-\r
-small = img\r
-for i in xrange(3):\r
- small = cv2.pyrDown(small)\r
-\r
-def onmouse(event, x, y, flags, param):\r
- h, w = img.shape[:2]\r
- h1, w1 = small.shape[:2]\r
- x, y = 1.0*x*h/h1, 1.0*y*h/h1\r
- zoom = cv2.getRectSubPix(img, (800, 600), (x+0.5, y+0.5))\r
- cv2.imshow('zoom', zoom)\r
-\r
-cv2.imshow('preview', small)\r
-cv2.setMouseCallback('preview', onmouse)\r
-cv2.waitKey()\r
+if __name__ == '__main__':\r
+ print 'This sample shows how to implement a simple hi resolution image navigation.'\r
+ print 'USAGE: browse.py [image filename]'\r
+ print \r
+\r
+ if len(sys.argv) > 1:\r
+ fn = sys.argv[1]\r
+ print 'loading %s ...' % fn\r
+ img = cv2.imread(fn)\r
+ else:\r
+ sz = 4096\r
+ print 'generating %dx%d procedural image ...' % (sz, sz)\r
+ img = np.zeros((sz, sz), np.uint8)\r
+ track = np.cumsum(np.random.rand(500000, 2)-0.5, axis=0)\r
+ track = np.int32(track*10 + (sz/2, sz/2))\r
+ cv2.polylines(img, [track], 0, 255, 1, cv2.CV_AA)\r
+\r
+ small = img\r
+ for i in xrange(3):\r
+ small = cv2.pyrDown(small)\r
+\r
+ def onmouse(event, x, y, flags, param):\r
+ h, w = img.shape[:2]\r
+ h1, w1 = small.shape[:2]\r
+ x, y = 1.0*x*h/h1, 1.0*y*h/h1\r
+ zoom = cv2.getRectSubPix(img, (800, 600), (x+0.5, y+0.5))\r
+ cv2.imshow('zoom', zoom)\r
+\r
+ cv2.imshow('preview', small)\r
+ cv2.setMouseCallback('preview', onmouse)\r
+ cv2.waitKey()\r
\r
import video\r
\r
-hsv_map = np.zeros((180, 256, 3), np.uint8)\r
-h, s = np.indices(hsv_map.shape[:2])\r
-hsv_map[:,:,0] = h\r
-hsv_map[:,:,1] = s\r
-hsv_map[:,:,2] = 255\r
-hsv_map = cv2.cvtColor(hsv_map, cv2.COLOR_HSV2BGR)\r
-cv2.imshow('hsv_map', hsv_map)\r
-\r
-cv2.namedWindow('hist', 0)\r
-hist_scale = 10\r
-def set_scale(val):\r
- global hist_scale\r
- hist_scale = val\r
-cv2.createTrackbar('scale', 'hist', hist_scale, 32, set_scale)\r
-\r
-try: fn = sys.argv[1]\r
-except: fn = 'synth:bg=../cpp/baboon.jpg:class=chess:noise=0.05'\r
-cam = video.create_capture(fn)\r
-\r
-t = clock()\r
-while True:\r
- flag, frame = cam.read()\r
- cv2.imshow('camera', frame)\r
- \r
- small = cv2.pyrDown(frame)\r
-\r
- hsv = cv2.cvtColor(small, cv2.COLOR_BGR2HSV)\r
- dark = hsv[...,2] < 32\r
- hsv[dark] = 0\r
- h = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )\r
-\r
-\r
- h = np.clip(h*0.005*hist_scale, 0, 1)\r
- vis = hsv_map*h[:,:,np.newaxis] / 255.0\r
- cv2.imshow('hist', vis)\r
- \r
-\r
- t1 = clock()\r
- #print (t1-t)*1000\r
- t = t1\r
-\r
- ch = cv2.waitKey(1)\r
- if ch == 27:\r
- break\r
+if __name__ == '__main__':\r
+\r
+ hsv_map = np.zeros((180, 256, 3), np.uint8)\r
+ h, s = np.indices(hsv_map.shape[:2])\r
+ hsv_map[:,:,0] = h\r
+ hsv_map[:,:,1] = s\r
+ hsv_map[:,:,2] = 255\r
+ hsv_map = cv2.cvtColor(hsv_map, cv2.COLOR_HSV2BGR)\r
+ cv2.imshow('hsv_map', hsv_map)\r
+\r
+ cv2.namedWindow('hist', 0)\r
+ hist_scale = 10\r
+ def set_scale(val):\r
+ global hist_scale\r
+ hist_scale = val\r
+ cv2.createTrackbar('scale', 'hist', hist_scale, 32, set_scale)\r
+\r
+ try: fn = sys.argv[1]\r
+ except: fn = 'synth:bg=../cpp/baboon.jpg:class=chess:noise=0.05'\r
+ cam = video.create_capture(fn)\r
+\r
+ while True:\r
+ flag, frame = cam.read()\r
+ cv2.imshow('camera', frame)\r
+ \r
+ small = cv2.pyrDown(frame)\r
+\r
+ hsv = cv2.cvtColor(small, cv2.COLOR_BGR2HSV)\r
+ dark = hsv[...,2] < 32\r
+ hsv[dark] = 0\r
+ h = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )\r
+\r
+\r
+ h = np.clip(h*0.005*hist_scale, 0, 1)\r
+ vis = hsv_map*h[:,:,np.newaxis] / 255.0\r
+ cv2.imshow('hist', vis)\r
+ \r
+ ch = cv2.waitKey(1)\r
+ if ch == 27:\r
+ break\r
--- /dev/null
+import Tkinter as tk\r
+from ScrolledText import ScrolledText\r
+from glob import glob\r
+from common import splitfn\r
+\r
+#from IPython.Shell import IPShellEmbed\r
+#ipshell = IPShellEmbed()\r
+\r
+exclude_list = ['demo', 'common']\r
+\r
+class LinkManager:\r
+ def __init__(self, text, url_callback = None):\r
+ self.text = text\r
+ self.text.tag_config("link", foreground="blue", underline=1)\r
+ self.text.tag_bind("link", "<Enter>", self._enter)\r
+ self.text.tag_bind("link", "<Leave>", self._leave)\r
+ self.text.tag_bind("link", "<Button-1>", self._click)\r
+\r
+ self.url_callback = url_callback\r
+ self.reset()\r
+\r
+ def reset(self):\r
+ self.links = {}\r
+ def add(self, action):\r
+ # add an action to the manager. returns tags to use in\r
+ # associated text widget\r
+ tag = "link-%d" % len(self.links)\r
+ self.links[tag] = action\r
+ return "link", tag\r
+\r
+ def _enter(self, event):\r
+ self.text.config(cursor="hand2")\r
+ def _leave(self, event):\r
+ self.text.config(cursor="")\r
+ def _click(self, event):\r
+ for tag in self.text.tag_names(tk.CURRENT):\r
+ if tag.startswith("link-"):\r
+ proc = self.links[tag]\r
+ if callable(proc):\r
+ proc()\r
+ else:\r
+ if self.url_callback:\r
+ self.url_callback(proc)\r
+\r
+class App:\r
+ def __init__(self):\r
+ root = tk.Tk()\r
+ root.title('OpenCV Demo')\r
+\r
+ self.win = win = tk.PanedWindow(root, orient=tk.HORIZONTAL, sashrelief=tk.RAISED, sashwidth=4)\r
+ self.win.pack(fill=tk.BOTH, expand=1)\r
+\r
+ left = tk.Frame(win)\r
+ right = tk.Frame(win) \r
+ win.add(left)\r
+ win.add(right)\r
+ \r
+ scrollbar = tk.Scrollbar(left, orient=tk.VERTICAL)\r
+ self.demos_lb = demos_lb = tk.Listbox(left, yscrollcommand=scrollbar.set)\r
+ scrollbar.config(command=demos_lb.yview)\r
+ scrollbar.pack(side=tk.RIGHT, fill=tk.Y)\r
+ demos_lb.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)\r
+ \r
+ self.samples = {}\r
+ for fn in glob('*.py'):\r
+ name = splitfn(fn)[1]\r
+ if fn[0] != '_' and name not in exclude_list:\r
+ demos_lb.insert(tk.END, name)\r
+ self.samples[name] = fn\r
+ demos_lb.bind('<<ListboxSelect>>', self.on_demo_select)\r
+\r
+ self.text = text = ScrolledText(right, font=('arial', 12, 'normal'), width = 30, wrap='word')\r
+ text.pack(fill='both', expand=1)\r
+ self.linker = linker = LinkManager(text, self.on_link)\r
+\r
+ self.text.tag_config("header1", font=('arial', 14, 'bold'))\r
+ self.text.tag_config("header2", font=('arial', 12, 'bold'))\r
+\r
+ text.config(state='disabled')\r
+\r
+ def on_link(self, url):\r
+ print url\r
+\r
+ def on_demo_select(self, evt):\r
+ name = self.demos_lb.get( self.demos_lb.curselection()[0] )\r
+ fn = self.samples[name]\r
+ loc = {}\r
+ execfile(fn, loc)\r
+ descr = loc.get('__doc__', 'no-description')\r
+ \r
+ self.linker.reset()\r
+ self.text.config(state='normal')\r
+ self.text.delete(1.0, tk.END)\r
+ self.format_text(descr)\r
+ self.text.config(state='disabled')\r
+\r
+ def format_text(self, s):\r
+ text = self.text\r
+ lines = s.splitlines()\r
+ for i, s in enumerate(lines):\r
+ s = s.rstrip()\r
+ if i == 0 and not s:\r
+ continue\r
+ sn = len(s)\r
+ if s and s == '='*sn:\r
+ text.tag_add('header1', 'end-2l', 'end-1l')\r
+ elif s and s == '-'*sn:\r
+ text.tag_add('header2', 'end-2l', 'end-1l')\r
+ else:\r
+ text.insert('end', s+'\n')\r
+\r
+ def format_line(self, s):\r
+ text = self.text\r
+ pos, n = 0, len(s)\r
+ while pos < n:\r
+ next = s.find('http://', pos)\r
+ if next < 0:\r
+ next = n\r
+ test.insert(tk.END, s[pos:next])\r
+ pos = next\r
+ \r
+\r
+ #text.insert(tk.END, "click here!", linker.add('http://asdfsdaf')) \r
+ \r
+\r
+\r
+ def run(self):\r
+ tk.mainloop()\r
+\r
+\r
+if __name__ == '__main__':\r
+ App().run()\r
import video\r
import sys\r
\r
-try: fn = sys.argv[1]\r
-except: fn = video.presets['chess']\r
+if __name__ == '__main__':\r
+ try: fn = sys.argv[1]\r
+ except: fn = video.presets['chess']\r
\r
-def nothing(*arg):\r
- pass\r
+ def nothing(*arg):\r
+ pass\r
\r
-cv2.namedWindow('edge')\r
-cv2.createTrackbar('thrs1', 'edge', 2000, 5000, nothing)\r
-cv2.createTrackbar('thrs2', 'edge', 4000, 5000, nothing)\r
+ cv2.namedWindow('edge')\r
+ cv2.createTrackbar('thrs1', 'edge', 2000, 5000, nothing)\r
+ cv2.createTrackbar('thrs2', 'edge', 4000, 5000, nothing)\r
\r
-cap = video.create_capture(fn)\r
-while True:\r
- flag, img = cap.read()\r
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r
- thrs1 = cv2.getTrackbarPos('thrs1', 'edge')\r
- thrs2 = cv2.getTrackbarPos('thrs2', 'edge')\r
- edge = cv2.Canny(gray, thrs1, thrs2, apertureSize=5)\r
- vis = img.copy()\r
- vis /= 2\r
- vis[edge != 0] = (0, 255, 0)\r
- cv2.imshow('edge', vis)\r
- ch = cv2.waitKey(5)\r
- if ch == 27:\r
- break\r
+ cap = video.create_capture(fn)\r
+ while True:\r
+ flag, img = cap.read()\r
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r
+ thrs1 = cv2.getTrackbarPos('thrs1', 'edge')\r
+ thrs2 = cv2.getTrackbarPos('thrs2', 'edge')\r
+ edge = cv2.Canny(gray, thrs1, thrs2, apertureSize=5)\r
+ vis = img.copy()\r
+ vis /= 2\r
+ vis[edge != 0] = (0, 255, 0)\r
+ cv2.imshow('edge', vis)\r
+ ch = cv2.waitKey(5)\r
+ if ch == 27:\r
+ break\r
\r
\r
Press ESC to stop.\r
'''\r
-print help_message\r
-\r
-w, h = 512, 512\r
-\r
-args, args_list = getopt.getopt(sys.argv[1:], 'o:', [])\r
-args = dict(args)\r
-out = None\r
-if '-o' in args:\r
- fn = args['-o']\r
- out = cv2.VideoWriter(args['-o'], cv.CV_FOURCC(*'DIB '), 30.0, (w, h), False)\r
- print 'writing %s ...' % fn\r
-\r
-a = np.zeros((h, w), np.float32)\r
-cv2.randu(a, np.array([0]), np.array([1]))\r
-\r
-def process_scale(a_lods, lod):\r
- d = a_lods[lod] - cv2.pyrUp(a_lods[lod+1])\r
- for i in xrange(lod):\r
- d = cv2.pyrUp(d)\r
- v = cv2.GaussianBlur(d*d, (3, 3), 0)\r
- return np.sign(d), v\r
- \r
-scale_num = 6\r
-for frame_i in count():\r
- a_lods = [a]\r
- for i in xrange(scale_num):\r
- a_lods.append(cv2.pyrDown(a_lods[-1])) \r
- ms, vs = [], []\r
- for i in xrange(1, scale_num):\r
- m, v = process_scale(a_lods, i)\r
- ms.append(m)\r
- vs.append(v)\r
- mi = np.argmin(vs, 0)\r
- a += np.choose(mi, ms) * 0.025\r
- a = (a-a.min()) / a.ptp()\r
-\r
- if out:\r
- out.write(a)\r
- vis = a.copy()\r
- draw_str(vis, (20, 20), 'frame %d' % frame_i)\r
- cv2.imshow('a', vis)\r
- if cv2.waitKey(5) == 27:\r
- break\r
+\r
+if __name__ == '__main__':\r
+ print help_message\r
+\r
+ w, h = 512, 512\r
+\r
+ args, args_list = getopt.getopt(sys.argv[1:], 'o:', [])\r
+ args = dict(args)\r
+ out = None\r
+ if '-o' in args:\r
+ fn = args['-o']\r
+ out = cv2.VideoWriter(args['-o'], cv.CV_FOURCC(*'DIB '), 30.0, (w, h), False)\r
+ print 'writing %s ...' % fn\r
+\r
+ a = np.zeros((h, w), np.float32)\r
+ cv2.randu(a, np.array([0]), np.array([1]))\r
+\r
+ def process_scale(a_lods, lod):\r
+ d = a_lods[lod] - cv2.pyrUp(a_lods[lod+1])\r
+ for i in xrange(lod):\r
+ d = cv2.pyrUp(d)\r
+ v = cv2.GaussianBlur(d*d, (3, 3), 0)\r
+ return np.sign(d), v\r
+ \r
+ scale_num = 6\r
+ for frame_i in count():\r
+ a_lods = [a]\r
+ for i in xrange(scale_num):\r
+ a_lods.append(cv2.pyrDown(a_lods[-1])) \r
+ ms, vs = [], []\r
+ for i in xrange(1, scale_num):\r
+ m, v = process_scale(a_lods, i)\r
+ ms.append(m)\r
+ vs.append(v)\r
+ mi = np.argmin(vs, 0)\r
+ a += np.choose(mi, ms) * 0.025\r
+ a = (a-a.min()) / a.ptp()\r
+\r
+ if out:\r
+ out.write(a)\r
+ vis = a.copy()\r
+ draw_str(vis, (20, 20), 'frame %d' % frame_i)\r
+ cv2.imshow('a', vis)\r
+ if cv2.waitKey(5) == 27:\r
+ break\r