| 
 
DIVFL.py 跟隨主程式
 
import numpy as np
import cv2
from PARAM import *
from DIV2 import DIV
from motorm import turn
from Fcolor import Fcolor
from time import time
from time import sleep
XC=int(Lx/2); YC=int(Ly/2)
acc,r1,r2=Fcolor()
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, Lx)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Ly)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
frate=1/0.15
out = cv2.VideoWriter('DIVFL.avi', fourcc, frate, (Lx,Ly))
FW=open('DIVFL.txt','w')
t=0; tm=0.
while(tm < 120 and cap.isOpened()):
#while(t < 10 and cap.isOpened()):
    ret,frame = cap.read(); t+=1;
    if(t==1): t0=round(time(),2); t2=t0;
    t1=round(time(),2); tm=round(t1-t0,2); dt=round(t1-t2,2); t2=t1
    if ret == True:
        out.write(frame)
        #cv2.imshow('frame',frame)
        img1,img2,NB1,BXY=DIV(r1,r2,frame)
        a=np.arange(3)
        if(NB1==0): DR=-1;X0=0;Y0=0; X1=XC; Y1=YC
        else:
            A=np.array(BXY); XA=A[:,0]; YA=A[:,1]
            X0=round(np.average(XA)+0.5,2); Y0=round(np.average(YA)+0.5,2)
            X1=int(X0*F*10); Y1=int(Y0*F*10)
            if(X0 < 2): DR=3
            elif(X0 > 6): DR=7
            else: DR=1
            if(NB1>12): DR=0
            img3=frame[Y1:Y1+10,X1:X1+10,:]
            for n in range(3):
                a[n]=int(np.average(img3[:,:,n:n+1]))
        cv2.circle(img1,(X1,Y1), 10, (0, 255, 255), 2)
        img3=cv2.resize(frame, (XC,YC), interpolation=cv2.INTER_AREA)
        img4=cv2.resize(img1, (XC,YC), interpolation=cv2.INTER_AREA)
        #cv2.imshow('img2', img2)
        cv2.imshow('img3', img3)
        cv2.imshow('img4', img4)
        if(t==1):
            cv2.waitKey(0);t0=round(time(),2); t2=t0;
            t1=round(time(),2); tm=round(t1-t0,2); dt=round(t1-t2,2); t2=t1
        #print(t,tm,DR,NB1,X0,Y0,a)
        st=('%4d %6.2f %4d %4d %3d %3d %4d %4d %4d' \
             %(t,tm,DR,NB1,X0,Y0,a[0],a[1],a[2]))
        print(st)
        if cv2.waitKey(1) & 0xFF == ord('q'): break
        #DR=0
        if(DR==1): turn(0.3,0.3,0.05); turn(0,0,0.01);
        if(DR==0): turn(0.,0.,0.05); turn(0,0,0.01);
        if(DR==-1): turn(-0.4,0.4,0.05); turn(0,0,0.05);
        if(DR==-2): turn(-0.3,-0.3,0.05); turn(0,0,0.01);
        if(DR==3): turn(0.0,0.4,0.05); turn(0,0,0.01);
        if(DR==7): turn(0.4,0.2,0.05); turn(0,0,0.01);
    else: break
cap.release()
out.release()
cv2.destroyAllWindows()
 | 
| 
 
DIV2.py 窗格分析
 
import numpy as np
import cv2
from PARAM import *
def DIV(r1,r2,img):
    img1=np.copy(img)
    img2=cv2.resize(img1, (Lx2,Ly2), interpolation=cv2.INTER_AREA)
    SS=0; cen=[]; NCC=[]; NCD=[]; NK=0
    D=10; NX=int(Lx2/D); NY=int(Ly2/D)
    NB1=0; NB=0; BXY=[]
    TH0=0.73; TH1=0.21; fl=0.5; fh=1.5
    TH0=r1; TH1=r2
    L0=fl*TH0; H0=fh*TH0; L1=fl*TH1; H1=fh*TH1
    Tc=0
    for i in range(NX):
        for j in range(NY):
            X1=D*i;X2=D*(i+1)
            Y1=D*j;Y2=D*(j+1)
            cv2.rectangle(img2,(X1,Y1),(X2,Y2),(0, 255, 0), 1)
            cv2.rectangle(img1,(X1*F,Y1*F),(X2*F,Y2*F),(255,0,0), 2)
            cv2.rectangle(img,(X1*F,Y1*F),(X2*F,Y2*F),(255,0,0), 1)
            img3=img2[Y1:Y2,X1:X2,:]
            blue=0
            for I in range(D):
                for J in range(D):
                    #if(i==6 and j==3): print(I,J,img3[I][J])
                    c0=float(img3[I][J][0]);
                    c1=float(img3[I][J][1]);
                    c2=float(img3[I][J][2]);
                    Tc=c0+c1+c2
                    if(Tc>200*3): continue
                    if(Tc<100): continue
                    if(c0>1 and L0 | 
| 
 
Fcolor.py 取得標的物的色碼
 
import numpy as np
import cv2
from PARAM import *
def Fcolor():
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, Lx)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, Ly)
    XC=int(Lx/2); YC=int(Ly/2)
    t=0
    while t < 4:
        ret,frame = cap.read(); t+=1
        if(ret==True):
            img3=frame[YC:YC+10,XC:XC+10,:]
            a=np.arange(3)
            for n in range(3): a[n]=int(np.average(img3[:,:,n:n+1]))
            r1=round(float(a[1])/float(a[0]),2);
            r2=round(float(a[2])/float(a[0]),2);
            print(t,'focus:a=',a,r1,r2)
            cv2.circle(frame,(XC,YC), 10, (0, 155, 255), 2)
            cv2.imshow('frame',frame)
            cv2.waitKey(0)
    cv2.destroyAllWindows()
    cap.release()
    return a,r1,r2
 |