contours.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env python
  2. '''
  3. This program illustrates the use of findContours and drawContours.
  4. The original image is put up along with the image of drawn contours.
  5. Usage:
  6. contours.py
  7. A trackbar is put up which controls the contour level from -3 to 3
  8. '''
  9. # Python 2/3 compatibility
  10. from __future__ import print_function
  11. import sys
  12. PY3 = sys.version_info[0] == 3
  13. if PY3:
  14. xrange = range
  15. import numpy as np
  16. import cv2
  17. def make_image():
  18. img = np.zeros((500, 500), np.uint8)
  19. black, white = 0, 255
  20. for i in xrange(6):
  21. dx = int((i%2)*250 - 30)
  22. dy = int((i/2.)*150)
  23. if i == 0:
  24. for j in xrange(11):
  25. angle = (j+5)*np.pi/21
  26. c, s = np.cos(angle), np.sin(angle)
  27. x1, y1 = np.int32([dx+100+j*10-80*c, dy+100-90*s])
  28. x2, y2 = np.int32([dx+100+j*10-30*c, dy+100-30*s])
  29. cv2.line(img, (x1, y1), (x2, y2), white)
  30. cv2.ellipse( img, (dx+150, dy+100), (100,70), 0, 0, 360, white, -1 )
  31. cv2.ellipse( img, (dx+115, dy+70), (30,20), 0, 0, 360, black, -1 )
  32. cv2.ellipse( img, (dx+185, dy+70), (30,20), 0, 0, 360, black, -1 )
  33. cv2.ellipse( img, (dx+115, dy+70), (15,15), 0, 0, 360, white, -1 )
  34. cv2.ellipse( img, (dx+185, dy+70), (15,15), 0, 0, 360, white, -1 )
  35. cv2.ellipse( img, (dx+115, dy+70), (5,5), 0, 0, 360, black, -1 )
  36. cv2.ellipse( img, (dx+185, dy+70), (5,5), 0, 0, 360, black, -1 )
  37. cv2.ellipse( img, (dx+150, dy+100), (10,5), 0, 0, 360, black, -1 )
  38. cv2.ellipse( img, (dx+150, dy+150), (40,10), 0, 0, 360, black, -1 )
  39. cv2.ellipse( img, (dx+27, dy+100), (20,35), 0, 0, 360, white, -1 )
  40. cv2.ellipse( img, (dx+273, dy+100), (20,35), 0, 0, 360, white, -1 )
  41. return img
  42. if __name__ == '__main__':
  43. print(__doc__)
  44. img = make_image()
  45. h, w = img.shape[:2]
  46. _, contours0, hierarchy = cv2.findContours( img.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  47. contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
  48. def update(levels):
  49. vis = np.zeros((h, w, 3), np.uint8)
  50. levels = levels - 3
  51. cv2.drawContours( vis, contours, (-1, 2)[levels <= 0], (128,255,255),
  52. 3, cv2.LINE_AA, hierarchy, abs(levels) )
  53. cv2.imshow('contours', vis)
  54. update(3)
  55. cv2.createTrackbar( "levels+3", "contours", 3, 7, update )
  56. cv2.imshow('image', img)
  57. 0xFF & cv2.waitKey()
  58. cv2.destroyAllWindows()