{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d40a8c1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05de5b3e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fcolor.py as a main\n",
      "imgi.shape= (3024, 4032, 3)\n",
      "1 (577, 1353, 166, 93) 13908 15438 0.56\n",
      "2 (72, 1253, 186, 115) 14214 21390 0.62\n",
      "3 (959, 1230, 165, 97) 13324 16005 0.59\n",
      "4 (1335, 1226, 150, 84) 11571 12600 0.56\n",
      "5 (1642, 1172, 173, 108) 13528 18684 0.62\n",
      "6 (599, 1132, 183, 78) 6084 14274 0.43\n",
      "7 (1247, 891, 148, 70) 906 10360 0.47\n",
      "8 (1608, 839, 180, 103) 5074 18540 0.57\n",
      "N1= 8 8 [[15438, (577, 1353, 166, 93), (659, 1397)], [21390, (72, 1253, 186, 115), (167, 1309)], [16005, (959, 1230, 165, 97), (1040, 1277)], [12600, (1335, 1226, 150, 84), (1409, 1266)], [18684, (1642, 1172, 173, 108), (1727, 1225)], [14274, (599, 1132, 183, 78), (688, 1160)], [10360, (1247, 891, 148, 70), (1325, 924)], [18540, (1608, 839, 180, 103), (1700, 885)]]\n",
      "imgt.shape= (1920, 2560, 3)\n",
      "imgi.shape= (3024, 4032, 3)\n",
      "1 (678, 1326, 167, 88) 13926 14696 0.53\n",
      "2 (1440, 1229, 155, 86) 12150 13330 0.55\n",
      "3 (1064, 1221, 162, 92) 13512 14904 0.57\n",
      "4 (181, 1202, 186, 109) 14021 20274 0.59\n",
      "5 (1757, 1195, 175, 103) 14091 18025 0.59\n",
      "6 (1468, 1104, 156, 106) 5307 16536 0.68\n",
      "7 (1090, 856, 125, 78) 4633 9750 0.62\n",
      "8 (0, 853, 197, 88) 6046 17336 0.45\n",
      "9 (1732, 852, 189, 99) 7079 18711 0.52\n",
      "N1= 9 9 [[14696, (678, 1326, 167, 88), (760, 1368)], [13330, (1440, 1229, 155, 86), (1516, 1271)], [14904, (1064, 1221, 162, 92), (1144, 1265)], [20274, (181, 1202, 186, 109), (277, 1259)], [18025, (1757, 1195, 175, 103), (1843, 1245)], [16536, (1468, 1104, 156, 106), (1557, 1158)], [9750, (1090, 856, 125, 78), (1149, 888)], [17336, (0, 853, 197, 88), (106, 903)], [18711, (1732, 852, 189, 99), (1824, 897)]]\n",
      "imgt.shape= (1920, 2560, 3)\n",
      "imgi.shape= (3024, 4032, 3)\n",
      "1 (1398, 1467, 196, 135) 6617 26460 0.69\n",
      "2 (1473, 1454, 163, 65) 3309 10595 0.4\n",
      "3 (675, 1321, 147, 83) 4454 12201 0.56\n",
      "4 (962, 1045, 334, 186) 58365 62124 0.56\n",
      "5 (328, 749, 184, 102) 2829 18768 0.55\n",
      "6 (1004, 684, 253, 124) 15894 31372 0.49\n",
      "7 (841, 403, 123, 83) 585 10209 0.67\n",
      "8 (1044, 306, 144, 96) 8050 13824 0.67\n",
      "9 (770, 292, 332, 163) 3829 54116 0.49\n",
      "10 (1976, 159, 143, 64) 1420 9152 0.45\n",
      "11 (1267, 127, 168, 84) 3466 14112 0.5\n",
      "12 (1934, 0, 153, 77) 8945 11781 0.5\n",
      "N1= 12 12 [[26460, (1398, 1467, 196, 135), (1485, 1536)], [10595, (1473, 1454, 163, 65), (1554, 1480)], [12201, (675, 1321, 147, 83), (732, 1356)], [62124, (962, 1045, 334, 186), (1128, 1136)], [18768, (328, 749, 184, 102), (451, 806)], [31372, (1004, 684, 253, 124), (1131, 752)], [10209, (841, 403, 123, 83), (920, 445)], [13824, (1044, 306, 144, 96), (1117, 355)], [54116, (770, 292, 332, 163), (946, 370)], [9152, (1976, 159, 143, 64), (2052, 191)], [14112, (1267, 127, 168, 84), (1333, 157)], [11781, (1934, 0, 153, 77), (2003, 31)]]\n",
      "imgt.shape= (1920, 2560, 3)\n",
      "imgi.shape= (3024, 4032, 3)\n",
      "1 (425, 1401, 170, 98) 14403 16660 0.58\n",
      "2 (813, 1268, 167, 102) 13608 17034 0.61\n",
      "3 (1193, 1254, 148, 88) 11684 13024 0.59\n",
      "4 (1497, 1194, 171, 110) 13221 18810 0.64\n",
      "5 (1147, 1139, 170, 98) 5230 16660 0.58\n",
      "6 (0, 1086, 183, 87) 1247 15921 0.48\n",
      "7 (1098, 924, 149, 68) 891 10132 0.46\n",
      "8 (1467, 865, 172, 104) 6278 17888 0.6\n",
      "9 (1903, 0, 197, 97) 16235 19109 0.49\n",
      "N1= 9 9 [[16660, (425, 1401, 170, 98), (509, 1448)], [17034, (813, 1268, 167, 102), (895, 1317)], [13024, (1193, 1254, 148, 88), (1266, 1297)], [18810, (1497, 1194, 171, 110), (1581, 1247)], [16660, (1147, 1139, 170, 98), (1225, 1187)], [15921, (0, 1086, 183, 87), (99, 1116)], [10132, (1098, 924, 149, 68), (1176, 956)], [17888, (1467, 865, 172, 104), (1546, 911)], [19109, (1903, 0, 197, 97), (1996, 43)]]\n",
      "imgt.shape= (1920, 2560, 3)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "##################GET the color code on the bottom line########\n",
    "def bottclr(img):\n",
    "    img1=np.copy(img)\n",
    "    img2=cv2.resize(img1,(160,120))\n",
    "    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)\n",
    "    Y1=90; Y2=86; Y3=82\n",
    "    for x in range(160):\n",
    "        print(x,img2[Y1,x,:],hsv[Y1,x,:],img2[Y2,x,:],hsv[Y2,x,:],\n",
    "          img2[Y3,x,:],hsv[Y3,x,:])\n",
    "    cv2.line(img2,(0,Y1),(159,Y1),(0,255,0),1)\n",
    "    cv2.line(img2,(0,Y2),(159,Y2),(0,255,0),1)\n",
    "    cv2.line(img2,(0,Y3),(159,Y3),(0,255,0),1)\n",
    "    img2=cv2.resize(img2,(640,480))\n",
    "    cv2.imshow('fcolor',img2)\n",
    "    #cv2.waitKey(0)\n",
    "    \n",
    "    \n",
    "def tarbox(image):\n",
    "    Lx=image.shape[1]; Ly=image.shape[0];\n",
    "    Lxg=Lx; Lyg=Ly; Fg=1\n",
    "    img2 = cv2.resize(image, (Lxg,Lyg), interpolation=cv2.INTER_AREA)\n",
    "    img2=np.copy(image)\n",
    "    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n",
    "    cnts1,_ = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL,\n",
    "          cv2.CHAIN_APPROX_SIMPLE) # cv2.RETR_LIST\n",
    "    lcnts1=len(cnts1); \n",
    "    #print('lcnts1=',lcnts1)\n",
    "    N1=0; ax=0; cx=0; px=0; mx1=0; Kc1=0; xx1=[0 for i in range(5)]\n",
    "    clone1=img2.copy(); data1=[]\n",
    "    for c in cnts1:\n",
    "        M=cv2.moments(c)\n",
    "        if(M['m00']==0): M['m00']=1\n",
    "        cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])\n",
    "        area = cv2.contourArea(c); area3=round(area,3); #print(j,area3)\n",
    "        area=int(area)\n",
    "        (x,y,w,h)=cv2.boundingRect(c); Ac=w*h; asp=round(h/w,2)\n",
    "        if(Ac<2000*4 or Ac>8000*10): continue\n",
    "        if(asp>0.7 or asp<0.4): continue\n",
    "        #if(area<10000): continue\n",
    "        Kc1=1; N1+=1; \n",
    "        xx1=(x,y,w,h); mx1=(cX,cY)\n",
    "        d=[Ac,xx1,mx1]; data1.append(d)\n",
    "        print(N1,xx1,area,Ac,asp)\n",
    "        cv2.circle(clone1,mx1,6,(0,125,255),-1)\n",
    "        x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]\n",
    "        cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),8)\n",
    "        #cv2.imshow('tarbox',clone1)    \n",
    "    lenda=len(data1)\n",
    "    print('N1=',N1,lenda,data1)\n",
    "    #cv2.waitKey(0)\n",
    "    return lenda,data1,clone1\n",
    "\n",
    "\n",
    "def whitebox(image):\n",
    "    #---------------------------- white color----------\n",
    "    low=np.array([10,0 ,150 ])\n",
    "    upp=np.array([250,40 ,255 ])\n",
    "    #img=cv2.resize(image,(640,480))\n",
    "    img=cv2.resize(image,(1280*2,960*2))\n",
    "    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low,upp)\n",
    "    imgmask=cv2.bitwise_and(img,img,mask=mask1)\n",
    "    img3=np.copy(imgmask)\n",
    "    #img3=cv2.resize(imgmask,(640,480))\n",
    "    lenda,data1,imgt=tarbox(img3)\n",
    "    imgts=cv2.resize(imgt,(1280,960))\n",
    "    print('imgt.shape=',imgt.shape)\n",
    "    #cv2.imshow('mask1',mask1)\n",
    "    cv2.imshow('imgts',imgts)\n",
    "    blue=[]; \n",
    "    if(lenda>0):\n",
    "        for i in range(lenda):\n",
    "            (x,y,w,h)=data1[i][1]\n",
    "            imgi=img3[y:y+h,x:x+w,:]\n",
    "            imgi=img[y:y+h,x:x+w,:]\n",
    "            imgir=cv2.resize(imgi,(128,128))\n",
    "            cv2.imshow('tar_'+str(i),imgi)\n",
    "            #cv2.waitKey(0)\n",
    "            blue.append(imgi)\n",
    "    #return lenda,data1,imgt,blue\n",
    "\n",
    "\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    from time import sleep\n",
    "    import cv2\n",
    "    import numpy as np\n",
    "    print('fcolor.py as a main')\n",
    "    low=np.array([10,0 ,150 ])\n",
    "    upp=np.array([250,40 ,255 ])\n",
    "    PIC=['P2.JPG','P3.JPG','P4.JPG','P5.JPG','P6.JPG']\n",
    "    for j in range(5):\n",
    "        #ret,img=cap.read()\n",
    "        #if(j==0): fn='P2A.png'\n",
    "        #if(j==0): fn='P2.JPG'\n",
    "        #if(j==1): fn='P3.JPG'\n",
    "        fn=PIC[j]\n",
    "        imgi=cv2.imread(fn)\n",
    "        print('imgi.shape=',imgi.shape)\n",
    "        #bottclr(imgi)\n",
    "        whitebox(imgi)\n",
    "        #if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        cv2.waitKey(0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13964cca",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0735e624",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import cv2\n",
    "from  motorm import turn\n",
    "from time import sleep\n",
    "\n",
    "def tarbox(image):\n",
    "    Lx=image.shape[1]; Ly=image.shape[0];\n",
    "    Lxg=Lx; Lyg=Ly; Fg=1\n",
    "    img2 = cv2.resize(image, (Lxg,Lyg), interpolation=cv2.INTER_AREA)\n",
    "    img2=np.copy(image)\n",
    "    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n",
    "    cnts1,_ = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL,\n",
    "          cv2.CHAIN_APPROX_SIMPLE) # cv2.RETR_LIST\n",
    "    lcnts1=len(cnts1); #print('lcnts1=',lcnts1)\n",
    "    N1=0; ax=0; cx=0; px=0; mx1=0; Kc1=0; xx1=[0 for i in range(5)]\n",
    "    clone1=img2.copy(); data1=[]\n",
    "\n",
    "    #---------------only the largest contour concerned------\n",
    "    if(lcnts1>0):\n",
    "        cx=max(cnts1,key=cv2.contourArea)\n",
    "        areax=cv2.contourArea(cx); areax=round(areax,3); \n",
    "        if(areax>1000): \n",
    "            M=cv2.moments(cx)\n",
    "            if(M['m00']==0): M['m00']=1\n",
    "            cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])\n",
    "            area = cv2.contourArea(cx); area3=round(area,3); \n",
    "            area=int(area)\n",
    "            Kc1=1; N1+=1; (x,y,w,h)=cv2.boundingRect(cx);\n",
    "            xx1=(x,y,w,h); mx1=(cX,cY)\n",
    "            d=[area,xx1,mx1]; data1.append(d)\n",
    "            cv2.circle(clone1,mx1,6,(0,125,255),-1)\n",
    "            x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]\n",
    "            cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),1)\n",
    "    \n",
    "    for c in cnts1:\n",
    "        M=cv2.moments(c)\n",
    "        if(M['m00']==0): M['m00']=1\n",
    "        cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])\n",
    "        area = cv2.contourArea(c); area3=round(area,3); #print(j,area3)\n",
    "        area=int(area)\n",
    "        if(area<1000): continue\n",
    "        Kc1=1; N1+=1; (x,y,w,h)=cv2.boundingRect(c);\n",
    "        xx1=(x,y,w,h); mx1=(cX,cY)\n",
    "        d=[area,xx1,mx1]; #data1.append(d)\n",
    "        cv2.circle(clone1,mx1,6,(0,125,255),-1)\n",
    "        x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]\n",
    "        #cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),1)\n",
    "        #cv2.imshow('tarbox',clone1)\n",
    "    \n",
    "    lenda=len(data1)\n",
    "    #print(lenda,data1)\n",
    "    #cv2.waitKey(0)\n",
    "    return lenda,data1,clone1\n",
    "\n",
    "\n",
    "def bluebox(image):\n",
    "    #---------------------------- blue color----------\n",
    "    low=np.array([105,110 ,80 ])\n",
    "    upp=np.array([115,255 ,255 ])\n",
    "    #---------------------------- green color----------\n",
    "    low=np.array([40,80 ,60 ])\n",
    "    upp=np.array([60,255 ,255 ])\n",
    "    img=cv2.resize(image,(640,480))\n",
    "    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low,upp)\n",
    "    imgmask=cv2.bitwise_and(img,img,mask=mask1)\n",
    "    img3=cv2.resize(imgmask,(640,480))\n",
    "    lenda,data1,imgt=tarbox(img3)\n",
    "    cv2.imshow('mask1',mask1)\n",
    "    cv2.imshow('imgt',imgt)\n",
    "    blue=[]; \n",
    "    if(lenda>0):\n",
    "        for i in range(lenda):\n",
    "            (x,y,w,h)=data1[i][1]\n",
    "            imgi=img3[y:y+h,x:x+w,:]\n",
    "            imgir=cv2.resize(imgi,(128,128))\n",
    "            #cv2.imshow('tar_'+str(i),imgir)\n",
    "            #cv2.waitKey(0)\n",
    "            blue.append(imgir)\n",
    "    return lenda,data1,imgt,blue\n",
    "\n",
    "\n",
    "\n",
    "Lx=640; Ly=480; F=4; LX2=int(Lx/F); LY2=int(Ly/F)\n",
    "#.................2 masks for red color\n",
    "low1=np.array([170,60 ,90 ])\n",
    "upp1=np.array([180,255,220])\n",
    "low2=np.array([0,  60, 90 ])\n",
    "upp2=np.array([10, 255,255])\n",
    "print('low1=',low1,upp1,' low2=',low2,upp2)\n",
    "FW2=open('KBS.txt','w')\n",
    "tini=time.time()\n",
    "ncat=9; isx=128; isy=128\n",
    "mod1='model_NUM9C110.h5'\n",
    "mod1='model_GRN10C40.h5'\n",
    "LAB=['0','1','2','3','4','5','6','7','8','9']\n",
    "if(TS==1): model=keras.models.load_model(mod1)\n",
    "t00=time.time(); t02=t00\n",
    "tmodel=round(t00-tini,3)\n",
    "\n",
    "cap = cv2.VideoCapture(0)\n",
    "cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)\n",
    "cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)\n",
    "fourcc = cv2.VideoWriter_fourcc(*'XVID')\n",
    "out = cv2.VideoWriter('redM.avi', fourcc, 20.0, (640, 480))\n",
    "sleep(2)\n",
    "\n",
    "COLOR=0\n",
    "#--------------------- REDLINE under car------\n",
    "def REDLT(img):\n",
    "    #dri=input('dri=')\n",
    "    img1=np.copy(img)\n",
    "    imgA=cv2.resize(img1,(320,240))\n",
    "    img2=cv2.resize(img1,(80,60))\n",
    "    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low1,upp1)\n",
    "    mask2=cv2.inRange(hsv,low2,upp2)\n",
    "    mask3=mask1 | mask2\n",
    "    #mlow=int(60/2); mask3[0:mlow,:]=0; \n",
    "    red=[]; red2=[]; red3=[]; red4=[]; Y=60-1; blk=[]\n",
    "    Y1=59; Y2=49; Y3=39; Y4=29\n",
    "    for x in range(80):  \n",
    "        if(mask3[Y1,x]>100): red.append(x)\n",
    "        if(mask3[Y2,x]>100): red2.append(x)\n",
    "        if(mask3[Y3,x]>100): red3.append(x)\n",
    "        if(mask3[Y4,x]>100): red4.append(x)\n",
    "        if(15<x<65 and hsv[Y3,x,2]<50): blk.append(x)\n",
    "        #if(COLOR==1): print(x,img2[Y4,x,:],hsv[Y4,x,:],len(red4),\n",
    "        #        hsv[Y3,x,:],hsv[Y2,x,:])\n",
    "    if(len(blk)>25): \n",
    "        cv2.line(imgA,(0,Y3*4),(79*4,Y3*4),(255,255,0),2)\n",
    "        cv2.imshow('blk_U_turn',imgA)\n",
    "        return -100,0,0,0,0,imgA\n",
    "    #return dr,mid1,mid2,mid3,mid4,redmask\n",
    "    lred1=len(red); lred2=len(red2); lred3=len(red3); lred4=len(red4)\n",
    "    if(lred1>1): mid1=int(np.median(red))\n",
    "    else: mid1=-1; \n",
    "    if(lred2>1): mid2=int(np.median(red2))\n",
    "    else: mid2=-1\n",
    "    if(lred3>1): mid3=int(np.median(red3))\n",
    "    else: mid3=-1\n",
    "    if(lred4>1): mid4=int(np.median(red4))\n",
    "    else: mid4=-1\n",
    "    #--------------------drdrdr------\n",
    "    dr=-10\n",
    "    if(mid1<=30): dr=3\n",
    "    if(30<mid1<50 or 30<mid2<50 ): dr=1\n",
    "    if(mid1>=50): dr=7\n",
    "    mask3=cv2.resize(mask3,(320,240))\n",
    "    redmask=cv2.bitwise_and(imgA,imgA,mask=mask3)\n",
    "    dri=dr; a=[dri,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "    #--------------------------------------------------\n",
    "    cv2.line(redmask,(0,Y4*4),(79*4,Y4*4),(0,255,0),1)\n",
    "    cv2.circle(redmask,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.putText(redmask,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    if(COLOR==1):\n",
    "        a=[dr,mid1,mid2,mid3,mid4,lred1,lred2,lred3,lred4]\n",
    "        print('a=',a)\n",
    "        cv2.imshow('redmask',redmask)\n",
    "        cv2.waitKey(0)\n",
    "        input('1111')\n",
    "    return dr,mid1,mid2,mid3,mid4,redmask\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "#--------------------- REDLINE on the LefT-hand side of car------\n",
    "#---------------------find red pixels from hsv \n",
    "COLOR=0\n",
    "def cREDLT(img):\n",
    "    #dri=input('dri=')\n",
    "    img1=np.copy(img)\n",
    "    imgA=cv2.resize(img1,(320,240))\n",
    "    img2=cv2.resize(img1,(80,60))\n",
    "    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low1,upp1)\n",
    "    mask2=cv2.inRange(hsv,low2,upp2)\n",
    "    mask3=mask1 | mask2\n",
    "    #mlow=int(60/2); mask3[0:mlow,:]=0; \n",
    "    red=[]; red2=[]; red3=[]; red4=[]; Y=60-1; blk=[]\n",
    "    Y1=59; Y2=49; Y3=39; Y4=29\n",
    "    for x in range(65):  #since we focus on the left-hand side of the view\n",
    "        if(mask3[Y1,x]>100): red.append(x)\n",
    "        if(mask3[Y2,x]>100): red2.append(x)\n",
    "        if(mask3[Y3,x]>100): red3.append(x)\n",
    "        if(mask3[Y4,x]>100): \n",
    "            if(len(red4)>0 and red4[-1]<x-6): continue\n",
    "            else: red4.append(x)\n",
    "        if(15<x<65 and hsv[Y3,x,2]<50): blk.append(x)\n",
    "        if(COLOR==1): print(x,img2[Y4,x,:],hsv[Y4,x,:],len(red4),\n",
    "                hsv[Y3,x,:],hsv[Y2,x,:])\n",
    "    if(len(blk)>25): \n",
    "        cv2.line(imgA,(0,Y3*4),(79*4,Y3*4),(255,255,0),2)\n",
    "        cv2.imshow('blk_U_turn',imgA)\n",
    "        return -100,0,0,0,0,imgA\n",
    "    #return dr,mid1,mid2,mid3,mid4,redmask\n",
    "    lred1=len(red); lred2=len(red2); lred3=len(red3); lred4=len(red4)\n",
    "    if(lred1>1): mid1=int(np.median(red))\n",
    "    else: mid1=-1; \n",
    "    if(lred2>1): mid2=int(np.median(red2))\n",
    "    else: mid2=-1\n",
    "    if(lred3>1): mid3=int(np.median(red3))\n",
    "    else: mid3=-1\n",
    "    if(lred4>1): mid4=int(np.median(red4))\n",
    "    else: mid4=-1\n",
    "    #--------------------drdrdr------\n",
    "    dr=-10\n",
    "    if(mid1>3 and -1<mid3<8 and mid3<mid4<mid3+5): dr=30\n",
    "    if(mid1==-1 and -1<mid3<15 and mid4<=mid3): dr=31\n",
    "    if(mid1==-1 and mid2==-1 and mid3==-1 and mid4==-1): dr=33\n",
    "    #...........................................\n",
    "    if(mid1==-1 and mid3-mid2>20): dr=71\n",
    "    if(mid1>1 and mid2>mid1+12 or mid3>mid1+22): dr=72\n",
    "    if(mid1<10 and mid2>0 and (mid4-mid3)>(mid3-mid2)+5): dr=72\n",
    "    if(mid1<5 and mid2<5 and mid3>-1 and mid4>mid3+15): dr=73\n",
    "    if(mid1<5 and mid2<5 and mid3<5 and 30<mid4<55): dr=73\n",
    "    if(mid1>30 and mid2>mid1+4): dr=74\n",
    "    if(-1<mid1<10 and -1<mid2<10): dr=70\n",
    "    if(mid1>8): dr=71\n",
    "    mask3=cv2.resize(mask3,(320,240))\n",
    "    redmask=cv2.bitwise_and(imgA,imgA,mask=mask3)\n",
    "    dri=dr; a=[dri,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "    cv2.circle(imgA,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.line(imgA,(0,Y4*4),(79*4,Y4*4),(0,255,0),2)\n",
    "    cv2.line(redmask,(0,Y4*4),(79*4,Y4*4),(0,255,0),1)\n",
    "    cv2.circle(redmask,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.putText(imgA,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    cv2.putText(redmask,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    if(COLOR==1):\n",
    "        a=[dr,mid1,mid2,mid3,mid4,lred1,lred2,lred3,lred4]\n",
    "        print('a=',a)\n",
    "        cv2.imshow('redmask',redmask)\n",
    "        cv2.waitKey(0)\n",
    "        input('1111')\n",
    "    return dr,mid1,mid2,mid3,mid4,redmask\n",
    "\n",
    "\n",
    "\n",
    "KB=open('KB.txt','w')\n",
    "break_program = True\n",
    "sp='A'\n",
    "def on_press(key):\n",
    "    global break_program\n",
    "    global sp\n",
    "    sp=str(key).strip(\"'\")\n",
    "    #KB.write(KS+'\\n')\n",
    "    if sp == 'w' and break_program: turn(0.3,0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 's' and break_program: turn(-0.3,-0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 'a' and break_program: turn(0.0,0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 'd' and break_program: turn(0.3,0.0,0.1); turn(0,0,0.1)\n",
    "    if key == keyboard.Key.f1 and break_program:\n",
    "        print ('end pressed')\n",
    "        break_program = False\n",
    "\n",
    "\n",
    "\n",
    "listener =  keyboard.Listener(on_press=on_press)\n",
    "listener.start()\n",
    "\n",
    "\n",
    "#=====================KKKKKKKKKKKKKKKKKK\n",
    "if(1==2):\n",
    "    print('into KY_RED...')\n",
    "    t=0\n",
    "    while(t < 50 and cap.isOpened()):\n",
    "        ret,img=cap.read(); \n",
    "        if ret == False: break\n",
    "        dr,mid1,mid2,mid3,mid4,img1=RED(img)\n",
    "        ta=[mid1,mid2,mid3,lred1,lred2,lred3]\n",
    "        ws=str(t)+' '+sp+' '+str(ta)\n",
    "        if(t>0): print(ws)\n",
    "        KB.write(ws+'\\n')\n",
    "        out.write(img1)\n",
    "        cv2.imshow('img',img)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        cv2.waitKey(0)\n",
    "        t+=1\n",
    "    cap.release()\n",
    "    out.release()\n",
    "    cv2.destroyAllWindows()\n",
    "    KB.close()\n",
    "    input('sssss')\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def QLT33(cap):\n",
    "    turn(0.7,0.2,0.2); turn(0.3,0.3,0.1); turn(-0.3,0.3,0.1);\n",
    "    #turn(0.4,0.0,0.15); turn(-0.3,0.3,0.35); turn(0,0,0.05);\n",
    "    for j in range(100):\n",
    "        ret,img=cap.read()\n",
    "        DRU,mid1,mid2,mid3,mid4,img1=REDLT(img)\n",
    "        if(int(DRU/10)==7): DRU=7\n",
    "        #print('QLT33,j=',j,DRU,mid1,mid2,mid3,mid4)\n",
    "        img3s=cv2.resize(img1,(320,240))\n",
    "        cv2.imshow('LT',img3s)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        #cv2.waitKey(0)\n",
    "        #if(DRU==1 or DRU==7): \n",
    "        if(DRU==1 or DRU==-10 or DRU==7 or DRU==-100): \n",
    "            turn(0.5,0.0,0.05); turn(0,0,0.10);\n",
    "            print('QLT33,end_j=',j,DRU,mid1,mid2,mid3,mid4)\n",
    "            #sleep(2)\n",
    "            return\n",
    "        turn(-0.4,0.4,0.05); turn(0,0,0.05);\n",
    "    print('Unfortunate QLT33()...')\n",
    "    return\n",
    "\n",
    "def GODR(DR):\n",
    "    #.............................................. central redline....\n",
    "    if(DR==0): turn(0.0,0.0,0.10); turn(0,0,0.05);\n",
    "    if(DR==1): turn(0.3,0.3,0.10); turn(0,0,0.30);\n",
    "    if(DR==3): turn(0.0,0.4,0.10); turn(0,0,0.30);\n",
    "    if(DR==7): turn(0.4,0.0,0.10); turn(0,0,0.30);\n",
    "    #.............................................. LEFT redline....\n",
    "    if(DR==-100): turn(-0.4,0.4,0.50);turn(0.4,0.4,0.6);turn(-0.4,0.4,0.5)\n",
    "    if(DR==-10): turn(0.0,0.0,0.10); turn(0,0,0.05);\n",
    "    if(DR==30): turn(0.0,0.4,0.15); turn(0,0,0.00);\n",
    "    if(DR==31): turn(0.5,0.2,0.20); turn(0.2,0.5,0.05);\n",
    "    #if(DR==32): sleep(2); turn(0.0,0.4,0.10); turn(0,0,0.05);\n",
    "    if(DR==33): QLT33(cap)\n",
    "    if(DR==70): turn(0.4,0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==71): turn(0.4,0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==72): turn(0.4,-0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==73): turn(0.4,-0.2,0.10); turn(0,0,0.05);\n",
    "    #if(DR==-2): turn(-0.3,-0.3,0.05); turn(0,0,0.05);\n",
    "\n",
    "\n",
    "def load_images_from_folder(folder,nfile):\n",
    "    isz=128\n",
    "    images = []; N=0\n",
    "    afs=os.listdir(folder)\n",
    "    afso=sorted(afs)\n",
    "    for filename in afso:\n",
    "        N+=1\n",
    "        print(N,filename)\n",
    "        img = cv2.imread(os.path.join(folder,filename), cv2.IMREAD_GRAYSCALE)\n",
    "        if img is not None:\n",
    "            img = cv2.resize(img,(isz,isz))/255\n",
    "            images.append(img)\n",
    "    return np.array(images[:nfile])\n",
    "\n",
    "\n",
    "ML=0\n",
    "if(ML==1):\n",
    "    print('In ML block test...')\n",
    "    import os\n",
    "    path='PNG'; ncat=10; nfile=40;\n",
    "    ntest=6; pathT=path+'/S1/'\n",
    "    LAB=['0','1','2','3','4','5','6','7','8','9']\n",
    "    test=load_images_from_folder(pathT,ntest)\n",
    "    print(type(test),test.shape)\n",
    "    N=test.shape[0]\n",
    "    for i in range(N):\n",
    "        imgg=test[i,:,:]\n",
    "        cv2.imshow('imgg',imgg)\n",
    "        L1=modh5(model,LAB,imgg)\n",
    "        print(N,' L1=',L1)\n",
    "        cv2.waitKey(0)\n",
    "    #input('iiii')\n",
    "\n",
    "\n",
    "\n",
    "ret,img=cap.read()\n",
    "#cv2.imshow('img_in',img)\n",
    "if(1==1):\n",
    "    isz=128\n",
    "    ret,img=cap.read()\n",
    "    DRj,mid1,mid2,mid3,mid4,m0=REDLT(img)\n",
    "    m0[:,316:319,:]=[255,255,255]\n",
    "    m1=np.copy(m0);m2=np.copy(m0);m3=np.copy(m0);m4=np.copy(m0);m5=np.copy(m0);\n",
    "    imgM=np.hstack((m0,m1,m2,m3,m4,m5))\n",
    "    #cv2.imshow('img',img)\n",
    "    #cv2.imshow('imgM',imgM)\n",
    "    #cv2.waitKey(0)\n",
    "    FW1=open('redM.txt','w')\n",
    "    t00=time.time(); t02=t00\n",
    "    tmodel=round(t00-tini,3)\n",
    "    #-------------------RRRRRRR------\n",
    "    for j in range(1,200):\n",
    "        ret,img=cap.read()\n",
    "        #fnr='PNG/S3/N'+str(j).zfill(1)+'.png'\n",
    "        #imgr=cv2.imread(fnr)\n",
    "        #--------------------------------------\n",
    "        lenda,data1,imgt,blue=bluebox(img)\n",
    "        fn='PNG/MLd_'+str(j).zfill(3)+'.png'\n",
    "        fn2='PNG/DCa_'+str(j).zfill(3)+'.png'\n",
    "        lenblue=len(blue)\n",
    "        #print(j,fnr,' lenblue=',lenblue)\n",
    "        #print(j,' lenblue=',lenblue)\n",
    "        if(lenblue==1): \n",
    "            imgb=blue[0]; cv2.imwrite(fn,imgb)\n",
    "        elif(len(blue)>1): print('error len(blue)=',len(blue)); break\n",
    "        else: pass\n",
    "        cv2.imshow('imgt',imgt)\n",
    "        if(lenda>0):\n",
    "            BX=data1[0][1][0];BY=data1[0][1][1];\n",
    "            BW=data1[0][1][2];BH=data1[0][1][3]\n",
    "        else:\n",
    "            BX=0; BY=0; BW=0; BH=0; area=0; aspr=0\n",
    "        if(len(blue)==0): L1='X'\n",
    "        if(lenblue==1):\n",
    "            #bluein=np.copy(imgr)\n",
    "            #imggi=test[j-1,:,:]\n",
    "            #Li=modh5(model,LAB,imggi)\n",
    "            #cv2.imshow('imggi',imggi)\n",
    "            bluein=blue[0]\n",
    "            imgg=cv2.cvtColor(bluein,cv2.COLOR_BGR2GRAY)\n",
    "            imgg=cv2.resize(imgg,(isz,isz))/255\n",
    "            L1=modh5(model,LAB,imgg)\n",
    "            #cv2.imshow('imgg',imgg)\n",
    "            # Using cv2.putText() method\n",
    "            #color = 2**16-1  # 65535 is white color for 16 bis image\n",
    "            #imgg1=np.copy(imgg)\n",
    "            #cv2.putText(imgg1, 'Out:16', (40, 15), \n",
    "            #      cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1, cv2.LINE_AA)\n",
    "            #cv2.imshow('imgg1',imgg1)\n",
    "            imgg2=np.copy(imgb)\n",
    "            cv2.putText(imgg2,L1,(90,80),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "                 0.8, (0,255,255), 1, cv2.LINE_AA)\n",
    "            cv2.imshow('imgg2',imgg2)\n",
    "            cv2.imwrite(fn2,imgg2)\n",
    "            t01=time.time(); t=round(t01-t00,3); dt=round(t01-t02,3);\n",
    "            t02=t01\n",
    "            #print(' imgg.shape=',imgg.shape)\n",
    "            #print(j,t,dt,' L1=',L1,' Li=',Li)\n",
    "            area=data1[0][0]; \n",
    "            aspr=round(data1[0][1][2]/data1[0][1][3],2)\n",
    "        #print(j,'bluein.shape=',bluein.shape)\n",
    "        #cv2.waitKey(0)\n",
    "        #continue\n",
    "        #input('11111')\n",
    "        #--------------------------------------\n",
    "\n",
    "        imgi2=cv2.resize(img,(320,240))\n",
    "        cv2.imshow('imgin',imgi2)\n",
    "        DRj,mid1,mid2,mid3,mid4,img1=REDLT(img)\n",
    "        '''\n",
    "        j6=j%6\n",
    "        if(j6==0): m0=np.copy(img1); m0[:,316:319,:]=[255,255,255]\n",
    "        if(j6==1): m1=np.copy(img1); m1[:,316:319,:]=[255,255,255]\n",
    "        if(j6==2): m2=np.copy(img1); m2[:,316:319,:]=[255,255,255]\n",
    "        if(j6==3): m3=np.copy(img1); m3[:,316:319,:]=[255,255,255]\n",
    "        if(j6==4): m4=np.copy(img1); m4[:,316:319,:]=[255,255,255]\n",
    "        if(j6==5): m5=np.copy(img1); m5[:,316:319,:]=[255,255,255]\n",
    "        imgM=np.hstack((m0,m1,m2,m3,m4,m5))\n",
    "        cv2.imshow('imgM',imgM)\n",
    "        '''\n",
    "        #cv2.imwrite('DIR_'+str(j).zfill(3)+'.png',img1)\n",
    "        DR=DRj\n",
    "        a=[j,DRj,DR,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "        #if(int(DR/10)==7): DR=7\n",
    "        #if(int(DR/10)==8): DR=8\n",
    "        #if(DR==-10): DR=1\n",
    "        FW1.write(sa+'\\n')\n",
    "        img2=cv2.resize(img1,(640,480))\n",
    "        out.write(img2)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        #......................CCCCCC\n",
    "        #DR=1\n",
    "        #if(lenda==0): DR=0\n",
    "        #if(area<1000): DR=0\n",
    "        #print('data1=',data1,data1[0][1][2],data1[0][1][3],aspr)\n",
    "        #if(lenda>0 and aspr<0.5): DR=0\n",
    "        if(TS==0): L1=0\n",
    "        #print('j=',j,DRj,DR,mid1,mid2,mid3,mid4,(lenda,BX,BY,BW,BH,aspr,L1))\n",
    "        print('j,DR,L1=',j,DR,L1)\n",
    "        #cv2.waitKey(0)\n",
    "        GODR(DR)\n",
    "        #sleep(1)\n",
    "    FW1.close()\n",
    "    FW2.close()\n",
    "    cv2.destroyAllWindows()\n",
    "    cap.release()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5a2d322",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "09eac59d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df07bdbf",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a1c530b2",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6860d108",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import cv2\n",
    "from  motorm import turn\n",
    "from time import sleep\n",
    "from pynput import keyboard\n",
    "TS=1\n",
    "if(TS==1):\n",
    "    from tensorflow import keras\n",
    "    from trackh5 import modh5\n",
    "import time\n",
    "#from trackblue import tarbox\n",
    "#from trackblue import bluebox\n",
    "\n",
    "\n",
    "def modh5(model,LAB,img):\n",
    "    test=[]\n",
    "    test.append(img)\n",
    "    testa=np.array(test)\n",
    "    X_test=testa\n",
    "    X_test=X_test.reshape(X_test.shape[0],128,128,1).astype(\"float32\")\n",
    "    pred = np.argmax(model.predict(X_test),axis=1)\n",
    "    p1=pred[0]; L1=LAB[p1]\n",
    "    #print('pred=',pred,p1,L1)\n",
    "    return L1\n",
    "\n",
    "\n",
    "\n",
    "def tarbox(image):\n",
    "    Lx=image.shape[1]; Ly=image.shape[0];\n",
    "    Lxg=Lx; Lyg=Ly; Fg=1\n",
    "    img2 = cv2.resize(image, (Lxg,Lyg), interpolation=cv2.INTER_AREA)\n",
    "    img2=np.copy(image)\n",
    "    gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)\n",
    "    cnts1,_ = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL,\n",
    "          cv2.CHAIN_APPROX_SIMPLE) # cv2.RETR_LIST\n",
    "    lcnts1=len(cnts1); #print('lcnts1=',lcnts1)\n",
    "    N1=0; ax=0; cx=0; px=0; mx1=0; Kc1=0; xx1=[0 for i in range(5)]\n",
    "    clone1=img2.copy(); data1=[]\n",
    "\n",
    "    #---------------only the largest contour concerned------\n",
    "    if(lcnts1>0):\n",
    "        cx=max(cnts1,key=cv2.contourArea)\n",
    "        areax=cv2.contourArea(cx); areax=round(areax,3); \n",
    "        if(areax>1000): \n",
    "            M=cv2.moments(cx)\n",
    "            if(M['m00']==0): M['m00']=1\n",
    "            cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])\n",
    "            area = cv2.contourArea(cx); area3=round(area,3); \n",
    "            area=int(area)\n",
    "            Kc1=1; N1+=1; (x,y,w,h)=cv2.boundingRect(cx);\n",
    "            xx1=(x,y,w,h); mx1=(cX,cY)\n",
    "            d=[area,xx1,mx1]; data1.append(d)\n",
    "            cv2.circle(clone1,mx1,6,(0,125,255),-1)\n",
    "            x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]\n",
    "            cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),1)\n",
    "    \n",
    "    for c in cnts1:\n",
    "        M=cv2.moments(c)\n",
    "        if(M['m00']==0): M['m00']=1\n",
    "        cX=int(M['m10']/M['m00']); cY=int(M['m01']/M['m00'])\n",
    "        area = cv2.contourArea(c); area3=round(area,3); #print(j,area3)\n",
    "        area=int(area)\n",
    "        if(area<1000): continue\n",
    "        Kc1=1; N1+=1; (x,y,w,h)=cv2.boundingRect(c);\n",
    "        xx1=(x,y,w,h); mx1=(cX,cY)\n",
    "        d=[area,xx1,mx1]; #data1.append(d)\n",
    "        cv2.circle(clone1,mx1,6,(0,125,255),-1)\n",
    "        x,y,w,h=xx1[0],xx1[1],xx1[2],xx1[3]\n",
    "        #cv2.rectangle(clone1,(x,y),(x+w,y+h),(255,125,0),1)\n",
    "        #cv2.imshow('tarbox',clone1)\n",
    "    \n",
    "    lenda=len(data1)\n",
    "    #print(lenda,data1)\n",
    "    #cv2.waitKey(0)\n",
    "    return lenda,data1,clone1\n",
    "\n",
    "\n",
    "def bluebox(image):\n",
    "    #---------------------------- blue color----------\n",
    "    low=np.array([105,110 ,80 ])\n",
    "    upp=np.array([115,255 ,255 ])\n",
    "    #---------------------------- green color----------\n",
    "    low=np.array([40,80 ,60 ])\n",
    "    upp=np.array([60,255 ,255 ])\n",
    "    img=cv2.resize(image,(640,480))\n",
    "    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low,upp)\n",
    "    imgmask=cv2.bitwise_and(img,img,mask=mask1)\n",
    "    img3=cv2.resize(imgmask,(640,480))\n",
    "    lenda,data1,imgt=tarbox(img3)\n",
    "    cv2.imshow('mask1',mask1)\n",
    "    cv2.imshow('imgt',imgt)\n",
    "    blue=[]; \n",
    "    if(lenda>0):\n",
    "        for i in range(lenda):\n",
    "            (x,y,w,h)=data1[i][1]\n",
    "            imgi=img3[y:y+h,x:x+w,:]\n",
    "            imgir=cv2.resize(imgi,(128,128))\n",
    "            #cv2.imshow('tar_'+str(i),imgir)\n",
    "            #cv2.waitKey(0)\n",
    "            blue.append(imgir)\n",
    "    return lenda,data1,imgt,blue\n",
    "\n",
    "\n",
    "\n",
    "Lx=640; Ly=480; F=4; LX2=int(Lx/F); LY2=int(Ly/F)\n",
    "#.................2 masks for red color\n",
    "low1=np.array([170,60 ,90 ])\n",
    "upp1=np.array([180,255,220])\n",
    "low2=np.array([0,  60, 90 ])\n",
    "upp2=np.array([10, 255,255])\n",
    "print('low1=',low1,upp1,' low2=',low2,upp2)\n",
    "FW2=open('KBS.txt','w')\n",
    "tini=time.time()\n",
    "ncat=9; isx=128; isy=128\n",
    "mod1='model_NUM9C110.h5'\n",
    "mod1='model_GRN10C40.h5'\n",
    "LAB=['0','1','2','3','4','5','6','7','8','9']\n",
    "if(TS==1): model=keras.models.load_model(mod1)\n",
    "t00=time.time(); t02=t00\n",
    "tmodel=round(t00-tini,3)\n",
    "\n",
    "cap = cv2.VideoCapture(0)\n",
    "cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)\n",
    "cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)\n",
    "fourcc = cv2.VideoWriter_fourcc(*'XVID')\n",
    "out = cv2.VideoWriter('redM.avi', fourcc, 20.0, (640, 480))\n",
    "sleep(2)\n",
    "\n",
    "COLOR=0\n",
    "#--------------------- REDLINE under car------\n",
    "def REDLT(img):\n",
    "    #dri=input('dri=')\n",
    "    img1=np.copy(img)\n",
    "    imgA=cv2.resize(img1,(320,240))\n",
    "    img2=cv2.resize(img1,(80,60))\n",
    "    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low1,upp1)\n",
    "    mask2=cv2.inRange(hsv,low2,upp2)\n",
    "    mask3=mask1 | mask2\n",
    "    #mlow=int(60/2); mask3[0:mlow,:]=0; \n",
    "    red=[]; red2=[]; red3=[]; red4=[]; Y=60-1; blk=[]\n",
    "    Y1=59; Y2=49; Y3=39; Y4=29\n",
    "    for x in range(80):  \n",
    "        if(mask3[Y1,x]>100): red.append(x)\n",
    "        if(mask3[Y2,x]>100): red2.append(x)\n",
    "        if(mask3[Y3,x]>100): red3.append(x)\n",
    "        if(mask3[Y4,x]>100): red4.append(x)\n",
    "        if(15<x<65 and hsv[Y3,x,2]<50): blk.append(x)\n",
    "        #if(COLOR==1): print(x,img2[Y4,x,:],hsv[Y4,x,:],len(red4),\n",
    "        #        hsv[Y3,x,:],hsv[Y2,x,:])\n",
    "    if(len(blk)>25): \n",
    "        cv2.line(imgA,(0,Y3*4),(79*4,Y3*4),(255,255,0),2)\n",
    "        cv2.imshow('blk_U_turn',imgA)\n",
    "        return -100,0,0,0,0,imgA\n",
    "    #return dr,mid1,mid2,mid3,mid4,redmask\n",
    "    lred1=len(red); lred2=len(red2); lred3=len(red3); lred4=len(red4)\n",
    "    if(lred1>1): mid1=int(np.median(red))\n",
    "    else: mid1=-1; \n",
    "    if(lred2>1): mid2=int(np.median(red2))\n",
    "    else: mid2=-1\n",
    "    if(lred3>1): mid3=int(np.median(red3))\n",
    "    else: mid3=-1\n",
    "    if(lred4>1): mid4=int(np.median(red4))\n",
    "    else: mid4=-1\n",
    "    #--------------------drdrdr------\n",
    "    dr=-10\n",
    "    if(mid1<=30): dr=3\n",
    "    if(30<mid1<50 or 30<mid2<50 ): dr=1\n",
    "    if(mid1>=50): dr=7\n",
    "    mask3=cv2.resize(mask3,(320,240))\n",
    "    redmask=cv2.bitwise_and(imgA,imgA,mask=mask3)\n",
    "    dri=dr; a=[dri,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "    #--------------------------------------------------\n",
    "    cv2.line(redmask,(0,Y4*4),(79*4,Y4*4),(0,255,0),1)\n",
    "    cv2.circle(redmask,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.putText(redmask,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    if(COLOR==1):\n",
    "        a=[dr,mid1,mid2,mid3,mid4,lred1,lred2,lred3,lred4]\n",
    "        print('a=',a)\n",
    "        cv2.imshow('redmask',redmask)\n",
    "        cv2.waitKey(0)\n",
    "        input('1111')\n",
    "    return dr,mid1,mid2,mid3,mid4,redmask\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "#--------------------- REDLINE on the LefT-hand side of car------\n",
    "#---------------------find red pixels from hsv \n",
    "COLOR=0\n",
    "def cREDLT(img):\n",
    "    #dri=input('dri=')\n",
    "    img1=np.copy(img)\n",
    "    imgA=cv2.resize(img1,(320,240))\n",
    "    img2=cv2.resize(img1,(80,60))\n",
    "    hsv=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV)\n",
    "    mask1=cv2.inRange(hsv,low1,upp1)\n",
    "    mask2=cv2.inRange(hsv,low2,upp2)\n",
    "    mask3=mask1 | mask2\n",
    "    #mlow=int(60/2); mask3[0:mlow,:]=0; \n",
    "    red=[]; red2=[]; red3=[]; red4=[]; Y=60-1; blk=[]\n",
    "    Y1=59; Y2=49; Y3=39; Y4=29\n",
    "    for x in range(65):  #since we focus on the left-hand side of the view\n",
    "        if(mask3[Y1,x]>100): red.append(x)\n",
    "        if(mask3[Y2,x]>100): red2.append(x)\n",
    "        if(mask3[Y3,x]>100): red3.append(x)\n",
    "        if(mask3[Y4,x]>100): \n",
    "            if(len(red4)>0 and red4[-1]<x-6): continue\n",
    "            else: red4.append(x)\n",
    "        if(15<x<65 and hsv[Y3,x,2]<50): blk.append(x)\n",
    "        if(COLOR==1): print(x,img2[Y4,x,:],hsv[Y4,x,:],len(red4),\n",
    "                hsv[Y3,x,:],hsv[Y2,x,:])\n",
    "    if(len(blk)>25): \n",
    "        cv2.line(imgA,(0,Y3*4),(79*4,Y3*4),(255,255,0),2)\n",
    "        cv2.imshow('blk_U_turn',imgA)\n",
    "        return -100,0,0,0,0,imgA\n",
    "    #return dr,mid1,mid2,mid3,mid4,redmask\n",
    "    lred1=len(red); lred2=len(red2); lred3=len(red3); lred4=len(red4)\n",
    "    if(lred1>1): mid1=int(np.median(red))\n",
    "    else: mid1=-1; \n",
    "    if(lred2>1): mid2=int(np.median(red2))\n",
    "    else: mid2=-1\n",
    "    if(lred3>1): mid3=int(np.median(red3))\n",
    "    else: mid3=-1\n",
    "    if(lred4>1): mid4=int(np.median(red4))\n",
    "    else: mid4=-1\n",
    "    #--------------------drdrdr------\n",
    "    dr=-10\n",
    "    if(mid1>3 and -1<mid3<8 and mid3<mid4<mid3+5): dr=30\n",
    "    if(mid1==-1 and -1<mid3<15 and mid4<=mid3): dr=31\n",
    "    if(mid1==-1 and mid2==-1 and mid3==-1 and mid4==-1): dr=33\n",
    "    #...........................................\n",
    "    if(mid1==-1 and mid3-mid2>20): dr=71\n",
    "    if(mid1>1 and mid2>mid1+12 or mid3>mid1+22): dr=72\n",
    "    if(mid1<10 and mid2>0 and (mid4-mid3)>(mid3-mid2)+5): dr=72\n",
    "    if(mid1<5 and mid2<5 and mid3>-1 and mid4>mid3+15): dr=73\n",
    "    if(mid1<5 and mid2<5 and mid3<5 and 30<mid4<55): dr=73\n",
    "    if(mid1>30 and mid2>mid1+4): dr=74\n",
    "    if(-1<mid1<10 and -1<mid2<10): dr=70\n",
    "    if(mid1>8): dr=71\n",
    "    mask3=cv2.resize(mask3,(320,240))\n",
    "    redmask=cv2.bitwise_and(imgA,imgA,mask=mask3)\n",
    "    dri=dr; a=[dri,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "    cv2.circle(imgA,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(imgA,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.line(imgA,(0,Y4*4),(79*4,Y4*4),(0,255,0),2)\n",
    "    cv2.line(redmask,(0,Y4*4),(79*4,Y4*4),(0,255,0),1)\n",
    "    cv2.circle(redmask,(mid1*4,Y1*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid2*4,Y2*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid3*4,Y3*4),8,(0,255,0),-1)\n",
    "    cv2.circle(redmask,(mid4*4,Y4*4),8,(0,255,0),-1)\n",
    "    cv2.putText(imgA,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    cv2.putText(redmask,sa,(1,20),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "         0.5, (0,255,255), 1, cv2.LINE_AA)\n",
    "    if(COLOR==1):\n",
    "        a=[dr,mid1,mid2,mid3,mid4,lred1,lred2,lred3,lred4]\n",
    "        print('a=',a)\n",
    "        cv2.imshow('redmask',redmask)\n",
    "        cv2.waitKey(0)\n",
    "        input('1111')\n",
    "    return dr,mid1,mid2,mid3,mid4,redmask\n",
    "\n",
    "\n",
    "\n",
    "KB=open('KB.txt','w')\n",
    "break_program = True\n",
    "sp='A'\n",
    "def on_press(key):\n",
    "    global break_program\n",
    "    global sp\n",
    "    sp=str(key).strip(\"'\")\n",
    "    #KB.write(KS+'\\n')\n",
    "    if sp == 'w' and break_program: turn(0.3,0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 's' and break_program: turn(-0.3,-0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 'a' and break_program: turn(0.0,0.3,0.1); turn(0,0,0.1)\n",
    "    if sp == 'd' and break_program: turn(0.3,0.0,0.1); turn(0,0,0.1)\n",
    "    if key == keyboard.Key.f1 and break_program:\n",
    "        print ('end pressed')\n",
    "        break_program = False\n",
    "\n",
    "\n",
    "\n",
    "listener =  keyboard.Listener(on_press=on_press)\n",
    "listener.start()\n",
    "\n",
    "\n",
    "#=====================KKKKKKKKKKKKKKKKKK\n",
    "if(1==2):\n",
    "    print('into KY_RED...')\n",
    "    t=0\n",
    "    while(t < 50 and cap.isOpened()):\n",
    "        ret,img=cap.read(); \n",
    "        if ret == False: break\n",
    "        dr,mid1,mid2,mid3,mid4,img1=RED(img)\n",
    "        ta=[mid1,mid2,mid3,lred1,lred2,lred3]\n",
    "        ws=str(t)+' '+sp+' '+str(ta)\n",
    "        if(t>0): print(ws)\n",
    "        KB.write(ws+'\\n')\n",
    "        out.write(img1)\n",
    "        cv2.imshow('img',img)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        cv2.waitKey(0)\n",
    "        t+=1\n",
    "    cap.release()\n",
    "    out.release()\n",
    "    cv2.destroyAllWindows()\n",
    "    KB.close()\n",
    "    input('sssss')\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def QLT33(cap):\n",
    "    turn(0.7,0.2,0.2); turn(0.3,0.3,0.1); turn(-0.3,0.3,0.1);\n",
    "    #turn(0.4,0.0,0.15); turn(-0.3,0.3,0.35); turn(0,0,0.05);\n",
    "    for j in range(100):\n",
    "        ret,img=cap.read()\n",
    "        DRU,mid1,mid2,mid3,mid4,img1=REDLT(img)\n",
    "        if(int(DRU/10)==7): DRU=7\n",
    "        #print('QLT33,j=',j,DRU,mid1,mid2,mid3,mid4)\n",
    "        img3s=cv2.resize(img1,(320,240))\n",
    "        cv2.imshow('LT',img3s)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        #cv2.waitKey(0)\n",
    "        #if(DRU==1 or DRU==7): \n",
    "        if(DRU==1 or DRU==-10 or DRU==7 or DRU==-100): \n",
    "            turn(0.5,0.0,0.05); turn(0,0,0.10);\n",
    "            print('QLT33,end_j=',j,DRU,mid1,mid2,mid3,mid4)\n",
    "            #sleep(2)\n",
    "            return\n",
    "        turn(-0.4,0.4,0.05); turn(0,0,0.05);\n",
    "    print('Unfortunate QLT33()...')\n",
    "    return\n",
    "\n",
    "def GODR(DR):\n",
    "    #.............................................. central redline....\n",
    "    if(DR==0): turn(0.0,0.0,0.10); turn(0,0,0.05);\n",
    "    if(DR==1): turn(0.3,0.3,0.10); turn(0,0,0.30);\n",
    "    if(DR==3): turn(0.0,0.4,0.10); turn(0,0,0.30);\n",
    "    if(DR==7): turn(0.4,0.0,0.10); turn(0,0,0.30);\n",
    "    #.............................................. LEFT redline....\n",
    "    if(DR==-100): turn(-0.4,0.4,0.50);turn(0.4,0.4,0.6);turn(-0.4,0.4,0.5)\n",
    "    if(DR==-10): turn(0.0,0.0,0.10); turn(0,0,0.05);\n",
    "    if(DR==30): turn(0.0,0.4,0.15); turn(0,0,0.00);\n",
    "    if(DR==31): turn(0.5,0.2,0.20); turn(0.2,0.5,0.05);\n",
    "    #if(DR==32): sleep(2); turn(0.0,0.4,0.10); turn(0,0,0.05);\n",
    "    if(DR==33): QLT33(cap)\n",
    "    if(DR==70): turn(0.4,0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==71): turn(0.4,0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==72): turn(0.4,-0.0,0.10); turn(0,0,0.0);\n",
    "    if(DR==73): turn(0.4,-0.2,0.10); turn(0,0,0.05);\n",
    "    #if(DR==-2): turn(-0.3,-0.3,0.05); turn(0,0,0.05);\n",
    "\n",
    "\n",
    "def load_images_from_folder(folder,nfile):\n",
    "    isz=128\n",
    "    images = []; N=0\n",
    "    afs=os.listdir(folder)\n",
    "    afso=sorted(afs)\n",
    "    for filename in afso:\n",
    "        N+=1\n",
    "        print(N,filename)\n",
    "        img = cv2.imread(os.path.join(folder,filename), cv2.IMREAD_GRAYSCALE)\n",
    "        if img is not None:\n",
    "            img = cv2.resize(img,(isz,isz))/255\n",
    "            images.append(img)\n",
    "    return np.array(images[:nfile])\n",
    "\n",
    "\n",
    "ML=0\n",
    "if(ML==1):\n",
    "    print('In ML block test...')\n",
    "    import os\n",
    "    path='PNG'; ncat=10; nfile=40;\n",
    "    ntest=6; pathT=path+'/S1/'\n",
    "    LAB=['0','1','2','3','4','5','6','7','8','9']\n",
    "    test=load_images_from_folder(pathT,ntest)\n",
    "    print(type(test),test.shape)\n",
    "    N=test.shape[0]\n",
    "    for i in range(N):\n",
    "        imgg=test[i,:,:]\n",
    "        cv2.imshow('imgg',imgg)\n",
    "        L1=modh5(model,LAB,imgg)\n",
    "        print(N,' L1=',L1)\n",
    "        cv2.waitKey(0)\n",
    "    #input('iiii')\n",
    "\n",
    "\n",
    "\n",
    "ret,img=cap.read()\n",
    "#cv2.imshow('img_in',img)\n",
    "if(1==1):\n",
    "    isz=128\n",
    "    ret,img=cap.read()\n",
    "    DRj,mid1,mid2,mid3,mid4,m0=REDLT(img)\n",
    "    m0[:,316:319,:]=[255,255,255]\n",
    "    m1=np.copy(m0);m2=np.copy(m0);m3=np.copy(m0);m4=np.copy(m0);m5=np.copy(m0);\n",
    "    imgM=np.hstack((m0,m1,m2,m3,m4,m5))\n",
    "    #cv2.imshow('img',img)\n",
    "    #cv2.imshow('imgM',imgM)\n",
    "    #cv2.waitKey(0)\n",
    "    FW1=open('redM.txt','w')\n",
    "    t00=time.time(); t02=t00\n",
    "    tmodel=round(t00-tini,3)\n",
    "    #-------------------RRRRRRR------\n",
    "    for j in range(1,200):\n",
    "        ret,img=cap.read()\n",
    "        #fnr='PNG/S3/N'+str(j).zfill(1)+'.png'\n",
    "        #imgr=cv2.imread(fnr)\n",
    "        #--------------------------------------\n",
    "        lenda,data1,imgt,blue=bluebox(img)\n",
    "        fn='PNG/MLd_'+str(j).zfill(3)+'.png'\n",
    "        fn2='PNG/DCa_'+str(j).zfill(3)+'.png'\n",
    "        lenblue=len(blue)\n",
    "        #print(j,fnr,' lenblue=',lenblue)\n",
    "        #print(j,' lenblue=',lenblue)\n",
    "        if(lenblue==1): \n",
    "            imgb=blue[0]; cv2.imwrite(fn,imgb)\n",
    "        elif(len(blue)>1): print('error len(blue)=',len(blue)); break\n",
    "        else: pass\n",
    "        cv2.imshow('imgt',imgt)\n",
    "        if(lenda>0):\n",
    "            BX=data1[0][1][0];BY=data1[0][1][1];\n",
    "            BW=data1[0][1][2];BH=data1[0][1][3]\n",
    "        else:\n",
    "            BX=0; BY=0; BW=0; BH=0; area=0; aspr=0\n",
    "        if(len(blue)==0): L1='X'\n",
    "        if(lenblue==1):\n",
    "            #bluein=np.copy(imgr)\n",
    "            #imggi=test[j-1,:,:]\n",
    "            #Li=modh5(model,LAB,imggi)\n",
    "            #cv2.imshow('imggi',imggi)\n",
    "            bluein=blue[0]\n",
    "            imgg=cv2.cvtColor(bluein,cv2.COLOR_BGR2GRAY)\n",
    "            imgg=cv2.resize(imgg,(isz,isz))/255\n",
    "            L1=modh5(model,LAB,imgg)\n",
    "            #cv2.imshow('imgg',imgg)\n",
    "            # Using cv2.putText() method\n",
    "            #color = 2**16-1  # 65535 is white color for 16 bis image\n",
    "            #imgg1=np.copy(imgg)\n",
    "            #cv2.putText(imgg1, 'Out:16', (40, 15), \n",
    "            #      cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1, cv2.LINE_AA)\n",
    "            #cv2.imshow('imgg1',imgg1)\n",
    "            imgg2=np.copy(imgb)\n",
    "            cv2.putText(imgg2,L1,(90,80),cv2.FONT_HERSHEY_SIMPLEX,\n",
    "                 0.8, (0,255,255), 1, cv2.LINE_AA)\n",
    "            cv2.imshow('imgg2',imgg2)\n",
    "            cv2.imwrite(fn2,imgg2)\n",
    "            t01=time.time(); t=round(t01-t00,3); dt=round(t01-t02,3);\n",
    "            t02=t01\n",
    "            #print(' imgg.shape=',imgg.shape)\n",
    "            #print(j,t,dt,' L1=',L1,' Li=',Li)\n",
    "            area=data1[0][0]; \n",
    "            aspr=round(data1[0][1][2]/data1[0][1][3],2)\n",
    "        #print(j,'bluein.shape=',bluein.shape)\n",
    "        #cv2.waitKey(0)\n",
    "        #continue\n",
    "        #input('11111')\n",
    "        #--------------------------------------\n",
    "\n",
    "        imgi2=cv2.resize(img,(320,240))\n",
    "        cv2.imshow('imgin',imgi2)\n",
    "        DRj,mid1,mid2,mid3,mid4,img1=REDLT(img)\n",
    "        '''\n",
    "        j6=j%6\n",
    "        if(j6==0): m0=np.copy(img1); m0[:,316:319,:]=[255,255,255]\n",
    "        if(j6==1): m1=np.copy(img1); m1[:,316:319,:]=[255,255,255]\n",
    "        if(j6==2): m2=np.copy(img1); m2[:,316:319,:]=[255,255,255]\n",
    "        if(j6==3): m3=np.copy(img1); m3[:,316:319,:]=[255,255,255]\n",
    "        if(j6==4): m4=np.copy(img1); m4[:,316:319,:]=[255,255,255]\n",
    "        if(j6==5): m5=np.copy(img1); m5[:,316:319,:]=[255,255,255]\n",
    "        imgM=np.hstack((m0,m1,m2,m3,m4,m5))\n",
    "        cv2.imshow('imgM',imgM)\n",
    "        '''\n",
    "        #cv2.imwrite('DIR_'+str(j).zfill(3)+'.png',img1)\n",
    "        DR=DRj\n",
    "        a=[j,DRj,DR,mid1,mid2,mid3,mid4]; sa=str(a)\n",
    "        #if(int(DR/10)==7): DR=7\n",
    "        #if(int(DR/10)==8): DR=8\n",
    "        #if(DR==-10): DR=1\n",
    "        FW1.write(sa+'\\n')\n",
    "        img2=cv2.resize(img1,(640,480))\n",
    "        out.write(img2)\n",
    "        if cv2.waitKey(1) & 0xFF == ord('q'): break\n",
    "        #......................CCCCCC\n",
    "        #DR=1\n",
    "        #if(lenda==0): DR=0\n",
    "        #if(area<1000): DR=0\n",
    "        #print('data1=',data1,data1[0][1][2],data1[0][1][3],aspr)\n",
    "        #if(lenda>0 and aspr<0.5): DR=0\n",
    "        if(TS==0): L1=0\n",
    "        #print('j=',j,DRj,DR,mid1,mid2,mid3,mid4,(lenda,BX,BY,BW,BH,aspr,L1))\n",
    "        print('j,DR,L1=',j,DR,L1)\n",
    "        #cv2.waitKey(0)\n",
    "        GODR(DR)\n",
    "        #sleep(1)\n",
    "    FW1.close()\n",
    "    FW2.close()\n",
    "    cv2.destroyAllWindows()\n",
    "    cap.release()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4f352572",
   "metadata": {},
   "outputs": [],
   "source": [
    "#-----AI2.py\n",
    "\n",
    "import cv2\n",
    "import random\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow.keras.preprocessing import image\n",
    "from tensorflow.keras.optimizers import RMSprop\n",
    "from tensorflow import keras\n",
    "import tensorflow as tf\n",
    "import os \n",
    "import math\n",
    "import shutil\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "from tensorflow.keras.layers import Flatten\n",
    "from tensorflow.keras.layers import Conv2D\n",
    "from tensorflow.keras.layers import MaxPooling2D\n",
    "from tensorflow.keras.layers import Dropout\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 指定亂數種子\n",
    "seed = 7\n",
    "np.random.seed(seed)\n",
    "print('1st cell done...')\n",
    "\n",
    "# read image\n",
    "image_size=128\n",
    "\n",
    "def load_images_from_folder(folder,nfile):\n",
    "    images = []\n",
    "    for filename in os.listdir(folder):\n",
    "        img = cv2.imread(os.path.join(folder,filename), cv2.IMREAD_GRAYSCALE)\n",
    "        if img is not None:\n",
    "            img = cv2.resize(img,(image_size,image_size))/255\n",
    "            images.append(img)\n",
    "    return np.array(images[:nfile])\n",
    "\n",
    "\n",
    "\n",
    "# set no. of images for each lable\n",
    "\n",
    "path='PNG'; ncat=10; nfile=40; \n",
    "mod1='model_GRN10C40.h5'\n",
    "ntest=ncat*5; pathT=path+'/T/'\n",
    "LAB=['0','1','2','3','4','5','6','7','8','9']\n",
    "\n",
    "print('load path=',path)\n",
    "train = load_images_from_folder(path+'/N0/',nfile)\n",
    "print('type(train)=',type(train),train.shape)\n",
    "Y_train = np.zeros(train.shape[0])\n",
    "X_train = train\n",
    "train = load_images_from_folder(path+'/N1/',nfile)\n",
    "Y_train = np.append(Y_train, np.ones(train.shape[0])*1)\n",
    "X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>2):\n",
    "    train = load_images_from_folder(path+'/N2/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*2)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>3):\n",
    "    train = load_images_from_folder(path+'/N3/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*3)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>4):\n",
    "    train = load_images_from_folder(path+'/N4/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*4)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>5):\n",
    "    train = load_images_from_folder(path+'/N5/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*5)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>6):\n",
    "    train = load_images_from_folder(path+'/N6/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*6)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>7):\n",
    "    train = load_images_from_folder(path+'/N7/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*7)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>8):\n",
    "    train = load_images_from_folder(path+'/N8/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*8)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "if(ncat>9):\n",
    "    train = load_images_from_folder(path+'/N9/',nfile)\n",
    "    Y_train = np.append(Y_train, np.ones(train.shape[0])*9)\n",
    "    X_train = np.append(X_train, train, axis=0)\n",
    "\n",
    "\n",
    "\n",
    "print('X_train.shape_5=',X_train.shape); \n",
    "print('y_train.shape_5=',Y_train.shape)\n",
    "#print(Y_train)\n",
    "\n",
    "# One-hot編碼\n",
    "Y_train = to_categorical(Y_train)\n",
    "print('Y_train.shape2=',Y_train.shape)\n",
    "#print('Y2_train=',Y_train)\n",
    "#print(Y_train)\n",
    "\n",
    "# 將圖片轉換成 4D 張量\n",
    "X_train = X_train.reshape(X_train.shape[0], image_size, image_size, 1).astype(\"float32\")\n",
    "\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X_train, Y_train, test_size=0.1, random_state=42)\n",
    "\n",
    "\n",
    "'''\n",
    "print('show TEST dat : Fig and Label')\n",
    "for i in range(0,10):\n",
    "    img = X_train[i,:,:,0]\n",
    "    print(i,img.shape)\n",
    "    cv2.imshow('img',img)\n",
    "    cv2.waitKey(0)\n",
    "'''\n",
    "\n",
    "# 定義模型\n",
    "model = Sequential()\n",
    "model.add(Conv2D(16,(3,3),activation = 'relu', input_shape = (image_size, image_size,1)))\n",
    "model.add(MaxPooling2D(pool_size=(2,2)))\n",
    "model.add(Conv2D(32,(3,3),activation = 'relu'))\n",
    "model.add(MaxPooling2D(pool_size=(2,2)))\n",
    "model.add(Flatten())\n",
    "model.add(Dense(64,activation='relu'))\n",
    "model.add(Dropout(0.2))\n",
    "model.add(Dense(32,activation='relu'))\n",
    "model.add(Dense(ncat,activation='softmax'))\n",
    "\n",
    "model.summary()\n",
    "\n",
    "model.compile(loss = 'categorical_crossentropy',\n",
    "             optimizer = \"adam\",\n",
    "             metrics = ['accuracy'])\n",
    "\n",
    "print(X_train.shape)\n",
    "print(Y_train.shape)\n",
    "\n",
    "history = model.fit(X_train,Y_train,shuffle=True, validation_split=0.1,\n",
    "                                batch_size=128, epochs=60) \n",
    "\n",
    "# 顯示訓練和驗證準確度 使用accuracy instead of acc\n",
    "acc = history.history[\"accuracy\"]\n",
    "epochs = range(1, len(acc)+1)\n",
    "val_acc = history.history[\"val_accuracy\"]\n",
    "\n",
    "'''\n",
    "plt.plot(epochs, acc, \"bo-\", label=\"Training Acc\")\n",
    "plt.plot(epochs, val_acc, \"ro--\", label=\"Validation Acc\")\n",
    "plt.title(\"Training and Validation Accuracy\")\n",
    "plt.xlabel(\"Epochs\")\n",
    "plt.ylabel(\"Accuracy\")\n",
    "plt.legend()\n",
    "plt.show()\n",
    "'''\n",
    "\n",
    "\n",
    "# 顯示訓練和驗證損失\n",
    "loss = history.history[\"loss\"]\n",
    "epochs = range(1, len(loss)+1)\n",
    "val_loss = history.history[\"val_loss\"]\n",
    "\n",
    "'''\n",
    "plt.plot(epochs, loss, \"bo-\", label=\"Training Loss\")\n",
    "plt.plot(epochs, val_loss, \"ro--\", label=\"Validation Loss\")\n",
    "plt.title(\"Training and Validation Loss\")\n",
    "plt.xlabel(\"Epochs\")\n",
    "plt.ylabel(\"Loss\")\n",
    "plt.legend()\n",
    "plt.show()\n",
    "'''\n",
    "\n",
    "# 評估模型\n",
    "#print(X_train.shape)\n",
    "#print(Y_train.shape)\n",
    "#print(X_test.shape)\n",
    "#print(Y_test.shape)\n",
    "print(\"\\nTesting ...\")\n",
    "loss, accuracy = model.evaluate(X_train, Y_train, verbose=0)\n",
    "print(\"訓練資料集的準確度 = {:.2f}\".format(accuracy))\n",
    "loss, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
    "print(\"測試資料集的準確度 = {:.2f}\".format(accuracy))\n",
    "\n",
    "model.save(mod1)\n",
    "print('model ',mod1,' is saved...')\n",
    "\n",
    "#------- you split this into a new cell if you want a frequent test run-------\n",
    "\n",
    "model = keras.models.load_model(mod1)\n",
    "print('load ',mod1,' ... done')\n",
    "\n",
    "# read images\n",
    "\n",
    "test = load_images_from_folder(pathT,ntest)\n",
    "print('load is done path=',pathT)\n",
    "X_test = test\n",
    "X_test = X_test.reshape(X_test.shape[0], image_size, image_size, 1).astype(\"float32\")\n",
    "print('X_test:type,len,shape=',type(X_test),len(X_test),X_test.shape)\n",
    "pred = np.argmax(model.predict(X_test),axis=1)      \n",
    "print()\n",
    "#print(X_test)\n",
    "print('pred=',pred)\n",
    "for i in range(ntest):\n",
    "    img = X_test[i,:,:,0]\n",
    "    print(i,'pred[i]=',pred[i],' LAB=',LAB[pred[i]])\n",
    "    cv2.imshow('img',img)\n",
    "    cv2.waitKey(0)\n",
    "    \n",
    "    \n",
    "    \n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
