cv.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
  5. def chose(contour):
  6. sm = cv2.arcLength(contour, True)
  7. approx = cv2.approxPolyDP(contour, sm*0.025, True)
  8. if len(approx) == 7 or len(approx) == 8: return 'circle'
  9. lower = 100
  10. upper = 200
  11. def lower_update(value):
  12. global lower
  13. lower = value
  14. def upper_update(value):
  15. global upper
  16. upper = value
  17. cv2.createTrackbar("Lower", "Image", lower, 255, lower_update)
  18. cv2.createTrackbar("Upper", "Image", upper, 255, upper_update)
  19. def recognize(image):
  20. hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
  21. binary = np.zeros(hsv.shape[:-1])
  22. binary[np.any(hsv > 190, axis=2)] = 1
  23. contours = cv2.findContours(binary.astype('uint8'), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]
  24. corner_left_up, corner_right_down = None, None
  25. for i,contour in enumerate(contours):
  26. if chose(contour) == 'circle':
  27. x = contour[:, 0, 0]
  28. y = contour[:, 0, 1]
  29. x_max, x_min, y_max, y_min = x.max(), x.min(), y.max(), y.min()
  30. if not corner_left_up or corner_left_up[0] < x_min or corner_left_up[1] < y_min:
  31. corner_left_up = (x_max, y_max)
  32. elif not corner_right_down or corner_right_down[0] < x_min or corner_right_down[1] < y_min:
  33. corner_right_down = (x_min, y_min)
  34. shape = (corner_left_up[0]-corner_right_down[0], corner_left_up[1]-corner_right_down[1])
  35. image = image[corner_right_down[1]:corner_left_up[1],corner_right_down[0]:corner_left_up[0]]
  36. image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  37. thresh = cv2.adaptiveThreshold(image,upper,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2)
  38. binary = np.zeros(image.shape)
  39. binary[image < thresh] = 1
  40. # polys = []
  41. # for cont in cnts:
  42. # eps = 0.044 * cv2.arcLength(cont, True)
  43. # rect = cv2.minAreaRect(cont)
  44. # box = cv2.boxPoints(rect)
  45. # box = np.intp(box)
  46. # approx = cv2.approxPolyDP(box, eps, True)
  47. # approx = approx[:, 0, :].tolist()
  48. # polys.append(approx)
  49. cv2.imshow('Image', binary)
  50. cv2.waitKey(1)
  51. # return polys, shape
  52. if __name__ == "__main__":
  53. while True:
  54. image = cv2.imread('falling_ball/image3.png')
  55. print(recognize(image))