
##################GET the color code on the bottom line########
def bottclr(img):
    img1=np.copy(img)
    img2=cv2.resize(img1,(160,120))
    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)
    Y1=90; Y2=86; Y3=82
    for x in range(160):
        print(x,img2[Y1,x,:],hsv[Y1,x,:],img2[Y2,x,:],hsv[Y2,x,:],
          img2[Y3,x,:],hsv[Y3,x,:])
    cv2.line(img2,(0,Y1),(159,Y1),(0,255,0),1)
    cv2.line(img2,(0,Y2),(159,Y2),(0,255,0),1)
    cv2.line(img2,(0,Y3),(159,Y3),(0,255,0),1)
    img2=cv2.resize(img2,(640,480))
    cv2.imshow('fcolor',img2)
    #cv2.waitKey(0)
    
    
def censcan(img):
    Lx=img.shape[1]; Ly=img.shape[0]
    im1=np.copy(img)
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    YC=int(Ly/2); NC=0; NBW=0; NWB=0
    for j in range(1,Lx):
        #print(j,img[YC,j-1,:],hsv[YC,j-1,:],hsv[YC,j,:])
        if(NC>Lx/4): 
            print('NC=',NC);
            return 0
        if(hsv[YC,j-1,1]>40): NC+=1
        if(0<=hsv[YC,j-1,1]<40 and hsv[YC,j-1,2]<40 and hsv[YC,j,2]>150): 
            NBW+=1
            #print('NBW=',NBW,YC,j,(hsv[YC,j-1,2],hsv[YC,j,2]))
            #cv2.circle(im1,(j-1,YC),4,(0,0,255),-1)
        if(0<=hsv[YC,j-1,1]<40 and hsv[YC,j-1,2]>150 and hsv[YC,j,2]<40): 
            NWB+=1  
            #print('NWB=',NWB)
            #cv2.circle(im1,(j-1,YC),6,(0,255,0),-1)
    if(NWB>7 or NBW>7): 
        KC=1; #print('NWB,NBW=',NWB,NBW,' KC=',KC)
    else: KC=0    
    #cv2.imshow('im1',im1)
    #cv2.waitKey(0)
    return KC



def tilt(img):
    #print('inside tilt',img.shape)
    Lx=img.shape[1]; Ly=img.shape[0]
    im1=np.copy(img)
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    YC=int(Ly/2); NC=0; NBW=0; NWB=0; X=[]
    for i in range(Ly):
        #for j in range(1,int(Lx/3)):
        for j in range(1,Lx):
            DD=abs(int(hsv[i,j,2])-int(hsv[i,j-1,2]))
            #if(i==YC): print(i,j,hsv[i,j-1,:],hsv[i,j,:],DD,NBW)
            #if(0<=hsv[i,j-1,1]<40 and hsv[i,j,2]>160 and DD>40): 
            if(0<=hsv[i,j-1,1]<40 and DD>40): 
                NBW+=1;  #print('NBW=',NBW,i,j);
                if(NBW==1): x1=j; X.append([j,i]); continue
                if(NBW>1 and abs(j-x1)<10): 
                    X.append([j,i]); 
                    cv2.circle(im1,(j-1,i),4,(0,0,255),-1); break
                else: x1=j               
    print('X=',X); XP2=0; px2=(0,0)
    for y in range(Ly-1,0,-1):
        xm=-1
        for i in range(len(X)):
            if(X[i][1]==y): 
                xy=X[i][0]
                if(xy>xm): xm=xy; XP2=i
        #print('y=',y,' xm=',xm)
        if(xm>0): px2=(xm,y); break 
    XP3=0; px3=(0,0)
    for y in range(Ly-1):
        yy=[];
        for i in range(len(X)):
            if(X[i][1]==y): yy.append(X[i][0])
        if(len(yy)>0): xm=max(yy)
        print('y2=',y,' xm=',xm)
        if(xm>Lx/2): px3=(xm,y); break 
    XP1=0; px1=(0,0)
    for y in range(Ly-1):
        yy=[]; 
        for i in range(len(X)):
            if(X[i][1]==y): yy.append(X[i][0])
        if(len(yy)>0): xm=min(yy)
        print('y1=',y,' xm=',xm)
        if(xm<Lx/2): px1=(xm,y); break 
    print('XP1=',XP1,' px1=',px1,X[XP1])
    print('XP2=',XP2,' px2=',px2,X[XP2])
    print('XP3=',XP3,' px3=',px3,X[XP3])
    p1=X[0]; p2=[Lx,0]; p3=X[-1]
    p1=px1; p2=px2; p3=px3
    q1=p1; q2=(p1[0],p2[1]); q3=(p3[0],p1[1])
    #q3=p3; q2=p2; q1=[p3[0],0];
    print(p1,p2,p3,'\n',q1,q2,q3)
    rows,cols,ch = img.shape
    #print('rows:',rows,cols,ch)
    print('p1,2,3=',p1,p2,p3,' q1,2,3=',q1,q2,q3)
    cv2.circle(im1,p1,6,(0,255,255),-1); 
    cv2.circle(im1,p2,10,(0,0,255),-1); 
    cv2.circle(im1,p3,10,(255,0,0),-1); 
    pts1 = np.float32([p1,p2,p3])
    pts2 = np.float32([q1,q2,q3])
    M = cv2.getAffineTransform(pts1,pts2)
    #print('type(M)',type(M),M.shape,M)
    co2=int(cols*1.2); ro2=int(rows*1.2)
    imgTL=cv2.warpAffine(img,M,(co2,ro2)) 
    cv2.imshow('im1',im1)
    cv2.imshow('imgTL',imgTL)
    cv2.waitKey(0)
    return imgTL


def crop(img):
    img2=np.copy(img)
    gray=cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    #如果大於 127 就等於 255，反之等於 0。
    ret,bina=cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)     
    cnts,_ = cv2.findContours(bina.copy(), cv2.RETR_EXTERNAL,
          cv2.CHAIN_APPROX_SIMPLE) # cv2.RETR_LIST
    cx=max(cnts,key=cv2.contourArea);cax=cv2.contourArea(cx);
    (x,y,w,h)=cv2.boundingRect(cx);
    cv2.rectangle(img2,(x,y),(x+w,y+h),(0,0,255),3)
    imgc=img[y:y+h,x:x+w,:]
    '''
    for c in cnts:
        (x,y,w,h)=cv2.boundingRect(c);
        if(w*h<1000): continue
        cv2.drawContours(img2,c,-1,(0,255,0),2)
    cv2.imshow('crop',img2)
    '''
    #cv2.imshow('imgcrop',imgc)
    #cv2.waitKey(0)
    return imgc

def TVS(img):
    Lx=img.shape[1]; Ly=img.shape[0]; Ly1=int(Ly/10)
    im1=np.copy(img)
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    YC=int(Ly/2); NC=0; NBW=0; NWB=0; cut=[]; bkdot=[]
    YB=[]
    for j in range(Lx-1):
        NSW=0; SW=[]
        for i in range(Ly1*2,Ly-Ly1*2):
            KW=1
            if(hsv[i,j,2]<120): 
                NSW+=1; 
                cv2.circle(im1,(j,i),1,(255,0,0),-1)
            if(NSW>10): KW=0; break
        if(KW==1): YB.append(i); #print(j,NSW,len(YB)) #,hsv[:,j,2]); 
    LYB=len(YB)
    #print('TVS_len(YB)=',len(YB))
    #cv2.imshow('TVS_im1',im1)
    #cv2.waitKey(0)
    return LYB




def vscan(img):
    Lx=img.shape[1]; Ly=img.shape[0]
    im1=np.copy(img)
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    YC=int(Ly/2); NC=0; NBW=0; NWB=0; cut=[]; bkdot=[]
    YB=[]
    for i in range(Ly):
        NSW=0; SW=[]
        for j in range(Lx-1):
            if(abs(int(hsv[i,j,2])-int(hsv[i,j+1,2]))>40): 
                NSW+=1; SW.append(j)
                cv2.circle(im1,(j,i),4,(255,0,0),-1)
        if(NSW>5): YB.append(i); #print(i,NSW,SW); 
    if(len(YB)==0): return []
    Y1=min(YB); Y2=max(YB)
    if(Y1>5):Y1=Y1-5
    if(Y2<Ly-5): Y2=Y2+5
    imgY=img[Y1:Y2,:,:]
    #cv2.imshow('YB',im1)
    #cv2.imshow('imgY',imgY)
    #cv2.waitKey(0)
    #-------------------------------------
    imgX=np.copy(imgY)
    im1=np.copy(imgX)
    hsv=cv2.cvtColor(imgX,cv2.COLOR_BGR2HSV)
    Lx=imgX.shape[1]; Ly=imgX.shape[0]
    NBK=0
    for j in range(Lx):
        NBK=0
        for i in range(Ly):
            if(hsv[i,j,2]<150): 
                NBK+=1
                cv2.circle(im1,(j,i),1,(255,0,0),-1)
        bkdot.append(NBK)
        #print(j,'NBK=',NBK)
    mnbk=min(bkdot); lenbk=len(bkdot)
    #print('mnbk=',mnbk,' lenbk=',lenbk)
    for i in range(Lx): bkdot[i]=bkdot[i]-mnbk
    bs=sorted(bkdot)
    nsec=0; XX1=[]; sec=[]
    for i in range(Lx-1):
        if(bkdot[i]==0 and bkdot[i+1]>0): 
            IX=i; 
            nsec+=1; XX1.append(IX)
            #print('nsec=',nsec,i,bkdot[i:i+3])
            cv2.line(im1,(IX,0),(IX,Ly-1),(0,0,0),2)
    #print('nsec_XX1=',nsec,XX1)
    XX2=XX1.copy()
    if(nsec>2): DX=int((XX1[2]-XX1[0])/2*0.6)
    else: DX=0
    #print('DX=',DX)
    #input('1111')
    if(nsec>2):
        for i in range(1,nsec):
            if((XX1[i]-XX1[i-1])<DX):
                XX2.pop(i); break
        nsec=len(XX2)
    #print('nsec=',nsec,'XX2=',XX2)
    #cv2.imshow('vim1',im1)    
    imgvl=np.copy(im1)
    NUM=[]
    for j in range(nsec-1):
        imgj=imgX[:,XX2[j]:XX2[j+1],:]
        #cv2.imshow('imgj_'+str(j),imgj)
        NUM.append(imgj)
    #cv2.waitKey(0)
    return NUM,imgvl




    
def tarbox(image):
    Lx=image.shape[1]; Ly=image.shape[0]; Acr1=Lx*Ly*0.001; Acr2=Lx*Ly*0.02
    Lxg=Lx; Lyg=Ly; Fg=1; YC=int(Ly/3)
    #img2 = cv2.resize(image, (Lxg,Lyg), interpolation=cv2.INTER_AREA)
    img1=np.copy(image)
    img2=np.copy(image)
    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    cnts1,_ = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL,
          cv2.CHAIN_APPROX_SIMPLE) # cv2.RETR_LIST
    lcnts1=len(cnts1); 
    #print('tarbox_Lx=',Lx,Ly,' Acr1,2=',Acr1,Acr2)
    #print('lcnts1=',lcnts1)
    N1=0; ax=0; cx=0; px=0; mx1=0; Kc1=0; xx1=[0 for i in range(5)]
    clone1=img2.copy(); data1=[]; M1=0; Mimg=[]; data0=[]
    cln=img2.copy()
    for c in cnts1:
        M=cv2.moments(c)
        if(M['m00']==0): M['m00']=1
        cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])
        area = cv2.contourArea(c); area3=round(area,3); #print(j,area3)
        area=int(area)
        (x,y,w,h)=cv2.boundingRect(c); Ac=w*h; asp=round(h/w,2)        
        if(Ac<1000): continue
        if(cY<YC):
            #if(Ac<Acr1/2 or Ac>Acr2/4): print('Error1 Ac=',Ac,cY,cX); continue
            if(Ac<Acr1/2 or Ac>Acr2/10): continue
        else:
            #if(Ac<Acr1 or Ac>Acr2): print('Error2 Ac=',Ac,cY,cX); continue
            if(Ac<Acr1 or Ac>Acr2): continue
        if(asp>0.8 or asp<0.3): continue
        #if(area<10000): continue
        M1+=1
        #print('==================M1=',M1)
        xx1=(x,y,w,h); mx1=(cX,cY)
        imgc=img1[y:y+h,x:x+w,:]
        d=[Ac,xx1,mx1]; data0.append(d)
        Mimg.append(imgc)
        cv2.circle(cln,mx1,8,(0,255,255),-1)
        x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]
        cv2.rectangle(cln,(x,y),(x+w,y+h),(0,255,255),16)
        KC=censcan(imgc)
        #print('M1,KC=',M1,KC)
        #KC=1
        if(KC==0): 
            cv2.rectangle(clone1,(x,y),(x+w,y+h),(0,0,255),8)
            clone1s=cv2.resize(clone1,(Lxs,Lys))
            #cv2.imshow('clone1',clone1s)
            #cv2.waitKey(0)
            continue
        cv2.destroyAllWindows();
        '''
        imgc1=crop(imgc)
        cv2.imshow('imgc1',imgc1)
        imgTL=tilt(imgc1)
        cv2.imshow('tarTL',imgTL)
        imgcp=crop(imgTL)
        cv2.imshow('tarcrop',imgcp)
        imgc=np.copy(imgcp)
        '''
        LYB=TVS(imgc)
        if(LYB==0): 
            cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,0,255),8)
            clone1s=cv2.resize(clone1,(Lxs,Lys))
            #cv2.imshow('clone1',clone1s)
            #cv2.waitKey(0)
            continue
        Kc1=1; N1+=1; 
        xx1=(x,y,w,h); mx1=(cX,cY)
        d=[Ac,xx1,mx1]; data1.append(d)
        #print(N1,xx1,area,Ac,asp,KC)
        cv2.circle(clone1,mx1,6,(0,125,255),-1)
        x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]
        cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),8)
        #cv2.imshow('tarbox',clone1)    
    lenda=len(data1)
    #print('N1=',N1,lenda,data1)
    clns=cv2.resize(cln,(Lxs,Lys))
    #cv2.imshow('clns',clns)
    #cv2.waitKey(0)
    return lenda,data1,clone1


def PLAN(img):
    #print('inside PLAN',img.shape)
    Lx=img.shape[1]; Ly=img.shape[0]; YC=int(Ly/2)
    img1=np.copy(img)
    im1=np.copy(img)
    gray=cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    #如果大於 127 就等於 255，反之等於 0
    ret,bina=cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)     
    DYL=0; LX=0; RX=Lx
    for x in range(int(Lx/10)):
        if(bina[YC,x]==0): continue
        else:
            Y1=YC
            for i in range(1,YC-1):
                if(bina[YC+i,x]==255 and bina[YC+i-1,x]==255): Y1=YC+i
                if(bina[YC+i,x]==255 and bina[YC+i+1,x]==0): break
            Y2=YC
            for i in range(1,YC+1):
                if(bina[YC-i,x]==255 and bina[YC-i+1,x]==255): Y2=YC-i
                if(bina[YC-i,x]==255 and bina[YC-i-1,x]==0): break
            DY=Y1-Y2
            if(DY>DYL): LX=x; DYL=DY; Y1X=Y1; Y2X=Y2
        #print(x,'LT:',Y1,Y2,Y1-Y2,(LX,DYL,Y1X,Y2X))
    DYR=0
    for x in range(Lx-1,Lx-int(Lx/10),-1):
        if(bina[YC,x]==0): continue
        else:
            Y3=YC
            for i in range(1,YC-1):
                if(bina[YC+i,x]==255 and bina[YC+i-1,x]==255): Y3=YC+i
                if(bina[YC+i,x]==255 and bina[YC+i+1,x]==0): break
            Y4=YC
            for i in range(1,YC+1):
                if(bina[YC-i,x]==255 and bina[YC-i+1,x]==255): Y4=YC-i
                if(bina[YC-i,x]==255 and bina[YC-i-1,x]==0): break
            DY=Y3-Y4
            if(DY>DYR): RX=x; DYR=DY; Y3X=Y3; Y4X=Y4
        #print(x,'RT:',Y3,Y4,Y3-Y4,(RX,DYR,Y3X,Y4X))
    p1=(LX,Y2X); p2=(LX,Y1X); p3=(RX,Y4X)
    q1=(0,0); q2=(0,Y1X); q3=(RX,0)
    #print('p1,2,3=',p1,p2,p3,' q1,2,3=',q1,q2,q3)
    cv2.circle(im1,p1,6,(0,255,255),-1); 
    cv2.circle(im1,p2,10,(0,0,255),-1); 
    cv2.circle(im1,p3,10,(255,0,0),-1); 
    pts1 = np.float32([p1,p2,p3])
    pts2 = np.float32([q1,q2,q3])
    M = cv2.getAffineTransform(pts1,pts2)
    #print('type(M)',type(M),M.shape,M)
    rows,cols,ch = img.shape
    co2=int(cols*1.0); ro2=int(rows*1.0)
    imgTL=cv2.warpAffine(img,M,(co2,ro2)) 
    #cv2.imshow('im1',im1)
    #cv2.imshow('bina',bina)
    #cv2.imshow('imgTL',imgTL)
    #print('PLAN done')
    #cv2.waitKey(0)
    return imgTL





def whitebox(image):
    #---------------------------- white color----------
    low=np.array([10,0 ,150 ])
    upp=np.array([250,40 ,255 ])
    Lx=image.shape[1]; Ly=image.shape[0]; Lxs=int(Lx/4); Lys=int(Ly/4);
    Lx2=int(Lx/2); Ly2=int(Ly/2);
    #img=cv2.resize(image,(640,480))
    # use half of the original resolution 
    #img=cv2.resize(image,(Lx2,Ly2))
    img=np.copy(image)
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    mask1=cv2.inRange(hsv,low,upp)
    imgmask=cv2.bitwise_and(img,img,mask=mask1)
    img3=np.copy(imgmask)
    Lx=img3.shape[1]; Ly=img3.shape[0]; Ac=Lx*Ly
    #img3=cv2.resize(imgmask,(640,480))
    #-------------------------------------
    lenda,data1,imgt=tarbox(img3)
    #-------------------------------------
    imgts=cv2.resize(imgt,(int(Lxs/2),int(Lys/2)))
    mask1s=cv2.resize(mask1,(int(Lxs/2),int(Lys/2)))
    #print('imgt.shape=',imgt.shape)
    #cv2.imshow('mask1',mask1s)
    cv2.imshow('imgts',imgts)
    cv2.waitKey(0)
    cv2.destroyAllWindows();
    PL=[]; blue=[]; NUMP=[]
    if(lenda>0):
        #print('tarbox_lenda=',lenda)
        for i in range(lenda):
            (x,y,w,h)=data1[i][1]; A=w*h; ratA=round(A/Ac,5)
            imgi=img[y:y+h,x:x+w,:]
            imgir=cv2.resize(imgi,(128,128))
            cv2.imshow('tar_'+str(i),imgi)
            #print('i_white=',i,w,h,A,ratA)
            PL.append(imgi)
        #cv2.waitKey(0)
        cv2.destroyAllWindows();
        for i in range(lenda):
            (x,y,w,h)=data1[i][1]
            imgi=img3[y:y+h,x:x+w,:]
            imgi=img[y:y+h,x:x+w,:]
            imgir=cv2.resize(imgi,(128,128))
            cv2.imshow('tar_'+str(i),imgi)
            imgTL=PLAN(imgi)
            #cv2.waitKey(0)
            #imgTL=tilt(imgi)
            #cv2.imshow('tar_'+str(i),imgTL)
            #imgc=crop(imgTL)
            #imgTL=np.copy(imgi)
            imgc=np.copy(imgTL)
            NUM,imgvl=vscan(imgc)
            #blue.append(imgTL)
            blue.append(imgvl)
            NUMP.append(NUM)
            #print('i_white=',i)
    cv2.waitKey(0)
    return lenda,data1,imgt,blue,NUMP,PL





if __name__ == '__main__':
    from time import sleep
    import cv2
    import numpy as np
    #print('fcolor.py as a main')

    '''
    for t in range(4):
        fn='PNG/LA_0_'+str(t)+'.png'
        print(t,fn)
        img1=cv2.imread(fn)
        imgTL=PLAN(img1)
        cv2.imshow('img1',img1)
        cv2.imshow('imgTL',imgTL)
        cv2.waitKey(0)
    input('PPPPP')
    '''





    low=np.array([10,0 ,150 ])
    upp=np.array([250,40 ,255 ])
    PIC=['P2.JPG','P3.JPG','P4.JPG','P5.JPG','P6.JPG']
    PIC=[]
    for i in range(15):
        s='plate02/P'+str(i+1).zfill(2)+'.jpg'
        s='plate02/P'+str(i+1).zfill(2)+'.JPG'
        PIC.append(s)
    #print('PIC=',PIC)
    for j in range(0,1):
        #ret,img=cap.read()
        fn=PIC[j]
        imgi=cv2.imread(fn)
        Lx=imgi.shape[1]; Ly=imgi.shape[0]; Lxs=int(Lx/4); Lys=int(Ly/4);
        print(j,fn,'imgi.shape=',imgi.shape,'Lxs,Lys=',Lxs,Lys)
        imgis=cv2.resize(imgi,(Lxs,Lys))
        #cv2.imshow('imgis',imgis)
        #cv2.waitKey(0)
        #continue
        #bottclr(imgi)
        #============================================
        lenda,data1,imgt,blue,NUMP,PL=whitebox(imgi)
        #============================================
        #if cv2.waitKey(1) & 0xFF == ord('q'): break
        cv2.destroyAllWindows();
        '''
        for t in range(len(blue)):
            fn='BL_'+str(t)
            print(t,fn)
            cv2.imshow(fn,blue[t])
        #input('BBBB')
        for t in range(len(PL)):
            fn='PNG/LA_'+str(j)+'_'+str(t)+'.png'
            cv2.imwrite(fn,PL[t])
        '''
        print('lencheck:',len(blue),len(NUMP))
        for t in range(len(NUMP)):
            fn='BL_'+str(t)
            cv2.imshow(fn,blue[t])
            lent=len(NUMP[t])
            print('NUMP_t=',t,lent)
            cv2.waitKey(0)
            for s in range(lent):
                fn='PNG/P_'+str(j)+'_'+str(t)+str(s)+'.png'
                cv2.imwrite(fn,NUMP[t][s])
                #print(t,s,fn)

#cv2.waitKey(0)
cv2.destroyAllWindows();
#cap.release()
