import numpy.core.multiarray
import cv2
import pytesseract
import numpy as np
import time
from datetime import datetime
from picamera import PiCamera
from pytesseract import Output

import cv2
import pytesseract
from pytesseract import Output
import numpy as np
import re
def parse(image): 
    custom_oem=r'--oem 3 --psm 11'
    # https://github.com/adrianlazaro8/Tesseract_sevenSegmentsLetsGoDigital
    data = pytesseract.image_to_data(img, lang='lets', config=custom_oem, output_type=Output.DICT)
    print(data)
    results = []
    for i in range(len(data['text'])):
        text = data['text'][i].strip('.,-_')
        text = re.sub('[^0-9]', '', text)
        if text:
            results.append(text)
    if len(results) == 2:
        results = list(map(lambda x: int(x) / 10.,results ))
        if results[0] < 100 and results[1] < 1000:
            return results
    return None
def thresholding(image):
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    pixel_values = image.reshape((-1, 1))
    pixel_values = np.float32(pixel_values)
    print(pixel_values.shape)
    # define stopping criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)
    # number of clusters (K)
    k = 3
    _, labels, (centers) = cv2.kmeans(pixel_values, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    # convert back to 8 bit values
    centers = np.uint8(centers)

    # flatten the labels array
    labels = labels.flatten()
    # convert all pixels to the color of the centroids
    segmented_image = centers[labels.flatten()]
    segmented_image = segmented_image.reshape(image.shape)
    
    # disable only the cluster number 2 (turn the pixel into black)
    masked_image = np.copy(image)
    # convert to the shape of a vector of pixel values
    masked_image = masked_image.reshape((-1, 1))
    # color (i.e cluster) to disable
    cluster = 2
    masked_image[labels != cluster] = [0]
    # convert back to original shape
    masked_image = masked_image.reshape(image.shape)
    
    return masked_image
   
    
    image = cv2.medianBlur(image,3)
    #image = np.invert(image)
    return cv2.threshold(image, 140, 255, cv2.THRESH_BINARY)[1]
    return image
def thresholding2(image):
    
    image = cv2.medianBlur(image,7)
    #image = np.invert(image)
    return image
 
def crop(image):
    top=314
    left=230
    height= 150
    width=400
    return image[top : (top + height) , left: (left + width)]



camera = PiCamera(
    resolution=(800, 600)
)
camera.awb_mode = 'off'
camera.awb_gains = (1.5, 2.0)
camera.shutter_speed = 60000
camera.iso = 800
while True:
    file = "/home/pi/solar-monitor/camera/" + str(datetime.now()) + ".jpg"
    camera.capture(file)
    print("Captured.")
    img = cv2.imread(file)
    img = crop(img)
    img = thresholding2(img)
    print(parse(img))
    cv2.imwrite(file + '_r.jpg', img)
    time.sleep(2)