import cv2
import numpy as np
import os

H_MIN = 127
S_MIN = 41
V_MIN = 28

H_MAX = 255
S_MAX = 204
V_MAX = 255

frame = 0

def gaussian(frame):
        return cv2.GaussianBlur(frame, (5,5), 0)

def erode(mask):
        kernel = np.ones((3,3), np.uint8)
        return cv2.erode(mask, kernel, iterations = 1)

def dilate(mask):
        kernel = np.ones((3,3), np.uint8)
        return cv2.dilate(mask, kernel, iterations = 1)

if __name__ == '__main__':
        cap = cv2.VideoCapture(0)
        while(1):
                ret, frame = cap.read()

                frame = frame[50:430, 200:540]

                cv2.imshow('result', frame)

                lpf_frame = gaussian(frame)

                hsv_frame = cv2.cvtColor(lpf_frame, cv2.COLOR_BGR2HSV)

                L = np.array([H_MIN, S_MIN, V_MIN])
                U = np.array([H_MAX, S_MAX, V_MAX])

                mask_frame = cv2.inRange(hsv_frame, L, U)

                res_frame = cv2.bitwise_and(frame, frame, mask = mask_frame)

                mask_frame = erode(mask_frame)
                mask_frame = dilate(mask_frame)

                font = cv2.FONT_HERSHEY_SIMPLEX

                cv2.imshow('frame', mask_frame)
                cv2.waitKey(10)


                contours, hierarchy = cv2.findContours(mask_frame, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

                draw = np.zeros(mask_frame.shape, np.uint8)

                bacilli = 0
                cluster = 0

                for each in contours:
                        area = cv2.contourArea(each)
                        if area > 55 and area < 100:
                                bacilli += 1
                                cv2.drawContours(frame, [each], 0, [0,0,255], 1)
                        elif area > 100 and area < 250:
                                cluster += 1
                                cv2.drawContours(frame, [each], 0, [0,255,0], 1)