axis = np.cross(vt[0], vt[1])\r
return axis * np.arctan2(s, c)\r
\r
+def draw_str(dst, (x, y), s):\r
+ cv2.putText(dst, s, (x+1, y+1), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 0), thickness = 2, linetype=cv2.CV_AA)\r
+ cv2.putText(dst, s, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.0, (255, 255, 255), linetype=cv2.CV_AA)\r
import numpy as np\r
import cv2\r
\r
-img = cv2.imread('../cpp/baboon.jpg', False)\r
\r
-def callback(k):\r
- k = 2*(k-10)\r
- st = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (abs(k), abs(k)))\r
- op = cv2.MORPH_BLACKHAT\r
- if k > 0:\r
- op = cv2.MORPH_TOPHAT\r
- res = cv2.morphologyEx(img, op, st)\r
- cv2.imshow('img', res)\r
+if __name__ == '__main__':\r
+ import sys\r
+ from itertools import cycle\r
+ from common import draw_str\r
\r
-callback(20)\r
-cv2.createTrackbar('k', 'img', 10, 20, callback)\r
+ try: fn = sys.argv[1]\r
+ except: fn = '../cpp/baboon.jpg'\r
+ img = cv2.imread(fn)\r
\r
+ modes = cycle(['erode/dilate', 'open/close', 'blackhat/tophat', 'gradient'])\r
+ str_modes = cycle(['ellipse', 'rect', 'cross'])\r
+ cur_mode = modes.next()\r
+ cur_str_mode = str_modes.next()\r
\r
-cv2.waitKey()\r
+ def update(dummy=None):\r
+ sz = cv2.getTrackbarPos('op/size', 'morphology')\r
+ iters = cv2.getTrackbarPos('iters', 'morphology')\r
+ opers = cur_mode.split('/')\r
+ if len(opers) > 1:\r
+ sz = sz - 10\r
+ op = opers[sz > 0]\r
+ sz = abs(sz)\r
+ else:\r
+ op = opers[0]\r
+ sz = sz*2+1\r
+\r
+ str_name = 'MORPH_' + cur_str_mode.upper()\r
+ oper_name = 'MORPH_' + op.upper()\r
+ st = cv2.getStructuringElement(getattr(cv2, str_name), (sz, sz))\r
+ res = cv2.morphologyEx(img, getattr(cv2, oper_name), st, iterations=iters)\r
+ \r
+ draw_str(res, (10, 20), 'mode: ' + cur_mode)\r
+ draw_str(res, (10, 40), 'operation: ' + oper_name)\r
+ draw_str(res, (10, 60), 'structure: ' + str_name)\r
+ draw_str(res, (10, 80), 'ksize: %d iters: %d' % (sz, iters))\r
+ cv2.imshow('morphology', res)\r
+\r
+ cv2.namedWindow('morphology')\r
+ cv2.createTrackbar('op/size', 'morphology', 12, 20, update)\r
+ cv2.createTrackbar('iters', 'morphology', 1, 10, update)\r
+ update()\r
+ print "Controls:"\r
+ print " 1 - change operation"\r
+ print " 2 - change structure element shape"\r
+ print\r
+ while True:\r
+ ch = cv2.waitKey()\r
+ if ch == 27:\r
+ break\r
+ if ch == ord('1'):\r
+ cur_mode = modes.next()\r
+ if ch == ord('2'):\r
+ cur_str_mode = str_modes.next()\r
+ update()\r