main.cpp

#include <iostream>
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <string.h>
using namespace std;
using namespace cv;
int port(char op)
{
    //串口部分代码串口部分代码串口部分代码串口部分代码串口部分代码串口部分代码
     int fd;
     struct termios options, newstate;
     char buff[1];
     char * buf = new char[5];//分配内存空间
     fd=open("/dev/ttyUSB0", O_RDWR|O_NONBLOCK|O_NOCTTY|O_NDELAY);    //打开串口
     if(fd==-1)
           printf("can not open the COM!\\n");
     else
           printf("open COMß ok!\\n");

     if(fcntl(fd, F_SETFL, 0) <0 ) //改为阻塞模式
       printf("fcntl failed\\n");
     else
       printf("fcntl=%d\\n", fcntl(fd, F_SETFL, 0));
     //获取串口
     tcgetattr(fd, &options);
     //设置波特率
     cfsetispeed(&options, B115200);
     cfsetospeed(&options, B115200);
     //串口设置
     options.c_cflag |= (CLOCAL | CREAD);
     options.c_cflag &= ~PARENB;//设置无奇偶校验位,N
     options.c_cflag &= ~CSTOPB; //设置停止位1
     options.c_cflag &= ~CSIZE;
     options.c_cflag |= CS8; //设置数据位
     options.c_cc[VTIME]=0;//阻塞模式的设置
     options.c_cc[VMIN]=1;
     //激活新配置
     tcsetattr(fd, TCSANOW, &options);

     cout<<buf[0]<<endl;
     sprintf(buf, "%c",op);
      write(fd, buf, sizeof(buf));
      tcflush(fd, TCIOFLUSH);//清除所有正在发送的I/O数据
      read(fd, buf, size_t(buf));
      cout<<buf<<endl;

          read(fd,buff,sizeof(buff));
          cout<<buff<<endl;
          sleep(0.5);

      return buf[0];
}
int rate(int x,int y,int weigh,int hight,Mat &color)
{
    int ber=0;
    int y1=y+hight;
    int x1=x+weigh;
    if(y1>=color.rows)
        y1=color.rows;
    if(x1>=color.cols)
        x1=color.cols;
    for(int i=y;i<y1;i++)
    {
        for(int j=x;j<x1;j++)
        {
            int h,s,v;
            h=color.at<Vec3b>(i,j)[0];
            s=color.at<Vec3b>(i,j)[1];
            v=color.at<Vec3b>(i,j)[2];
            if(v<=50||v>=200)
            {
                ber++;
            }
        }
     }
    return ber;
}
int main()
{
    VideoCapture cap;
    cap.open(0);
    if(!cap.isOpened())
        return 0;
    while(1)
        {
        int zhuangtai=1,bili=0;
        int areazong[50]={0};
        int biaojix[40]={0};
        int biaojiy[40]={0};
        int zhongxinx[40]={0};
        int zhongxiny[40]={0};
        int juli[40]={0};
        int zuox[40]={0};
        int zuoy[40]={0};
        int shangx[40]={0};
        int shangy[40]={0};
        int xiax[40]={0};
        int xiay[40]={0};
        int youx[40]={0};
        int youy[40]={0};

        int num=0;
        int biaoji=0;
        Mat frame;
        cap>>frame;
        Mat green,blue,black;
        Mat grayput,tidai,toushi,red,sobx,soby,sob,lv,lvzhi,color,toushired,toushigreen,toushiblue,toushiwhile,colorblack;
        cvtColor(frame,color,COLOR_BGR2HSV);
        frame.copyTo(tidai);
        Mat element = getStructuringElement(MORPH_RECT,Size(1,1));
        Mat element1 = getStructuringElement(MORPH_RECT,Size(3,3));
        vector<Mat> hsvSplit1;
        //
        cvtColor(frame,grayput,COLOR_BGR2HSV);
        grayput.copyTo(red);
        grayput.copyTo(toushired);
        //专门为绿色搞
        cvtColor(frame,lvzhi,COLOR_BGR2HSV);
        split(lvzhi, hsvSplit1);
        equalizeHist(hsvSplit1[1],hsvSplit1[1]);
        merge(hsvSplit1,lv);//直方化1
        frame.copyTo(black);
        Scalar bl=Scalar(100,43,150);
        Scalar bh=Scalar(150,255,255);
        Scalar gl=Scalar(35,68,150);
        Scalar gh=Scalar(90,255,255);

        for(int i=0;i<grayput.rows;i++)
            for(int j=0;j<grayput.cols;j++)
            {
                int h,s,v;
                h=grayput.at<Vec3b>(i,j)[0];
                s=grayput.at<Vec3b>(i,j)[1];
                v=grayput.at<Vec3b>(i,j)[2];
                if(((h>=0&&h<=25)||h>=156)&&s>=46&&v>=150)//v得大于黑色的v,v得注意点
                {
                    red.at<Vec3b>(i,j)[0]=255;
                    red.at<Vec3b>(i,j)[1]=255;
                    red.at<Vec3b>(i,j)[2]=255;
                }
            }

        cvtColor(red,red,COLOR_BGR2GRAY);
        threshold(red,red,254,255,THRESH_BINARY);
        inRange(grayput,bl,bh,blue);//稳定1
        inRange(grayput,gl,gh,green);
        morphologyEx(green,green,MORPH_ERODE,element1);
        int g=0;int blu=0;int r=0;int b=0;int w=0;int blac=0;//标识符
        //让绿色试试
        vector<vector<Point>> greencontours;
        vector<Vec4i>greenhierarchy;
        findContours(green,greencontours,greenhierarchy,RETR_LIST,CHAIN_APPROX_NONE,Point());
        vector<RotatedRect>boxgreen(greencontours.size());//定义最小外接矩形集合
        for (int i = 0; i < greencontours.size(); i++)
        {
            double area=contourArea(greencontours[i]);
            //double len=arcLength(greencontours[i],true);
            if(area>800&&area<6000)
            {
            boxgreen[i] = minAreaRect(Mat(greencontours[i]));//绿色
            Point2f green[4];
            boxgreen[i].points(green);
            int duijiao1=(int)sqrt((green[0].x-green[2].x)*(green[0].x-green[2].x)+(green[0].y-green[2].y)*(green[0].y-green[2].y));
            int duijiao2=(int)sqrt((green[1].x-green[3].x)*(green[1].x-green[3].x)+(green[1].y-green[3].y)*(green[1].y-green[3].y));
            num++;

            int abc=33;
            if(biaoji>0)
            {
            for(int i=0;i<biaoji;i++)
            {
                if(green[3].x>biaojix[i]&&green[1].x<biaojix[i]&&green[0].y>biaojiy[i]&&biaojiy[i]>green[2].y)
                {
                    abc=44;
                    break;
                }
            }
            }
            if(abc=33)
            {
            if(abs(duijiao1-duijiao2)<5)
            {

            for(int j=0;j<4;j++)
            {
                line(frame,green[j],green[(j+1)%4],Scalar(0,0,113),5,8);//0最下,1最左,2最上,3最右
            }
            biaojix[biaoji]=(int)(abs(green[3].x-green[1].x)/2+green[1].x);
            biaojiy[biaoji]=(int)(abs(green[0].y-green[2].y)/2+green[2].y);
            zhongxinx[biaoji]=(int)(abs((green[3].x-green[1].x)/2+green[1].x));
            zhongxiny[biaoji]=(int)(abs((green[0].y-green[2].y)/2+green[2].y));
            juli[biaoji]=zhongxinx[biaoji]-green[1].x;
            //
            zuox[biaoji]=green[1].x;
            zuoy[biaoji]=green[1].y;
            shangx[biaoji]=green[2].x;
            shangy[biaoji]=green[2].y;
            youx[biaoji]=green[3].x;
            youy[biaoji]=green[3].y;
            xiax[biaoji]=green[0].x;
            xiay[biaoji]=green[0].y;
            areazong[biaoji]=(int)area;
            biaoji++;
            g++;
            }
            }
            }
        }

        //红色
        vector<vector<Point>> redcontours;
        vector<Vec4i>redhierarchy;
        findContours(red,redcontours,redhierarchy,RETR_LIST,CHAIN_APPROX_NONE,Point());
        vector<RotatedRect>boxred(redcontours.size());//定义最小外接矩形集合
        for (int i = 0; i < redcontours.size(); i++)
        {
            //drawContours(frame, redcontours, i, Scalar(6,155,255), 2, 8, redhierarchy);
            double area=contourArea(redcontours[i]);
            //Rect ju=boundingRect(Mat(redcontours[i]));
            if(area>800&area<6000)
            {
             boxred[i] = minAreaRect(Mat(redcontours[i]));//绿色
            Point2f red[4];
            boxred[i].points(red);
            int abc=33;
            for(int i=0;i<biaoji+1;i++)
            {
                if(red[3].x>biaojix[i]&&red[1].x<biaojix[i]&&red[0].y>biaojiy[i]&&biaojiy[i]>red[2].y)
                {
                    abc=44;
                    break;
                }
            }
            if(abc=33)
            {
            for(int j=0;j<4;j++)
            {
                line(frame,red[j],red[(j+1)%4],Scalar(55,123,44),5,8);//0最下,1最左,2最上,3最右
            }
            areazong[biaoji]=(int)area;
            //
            zhongxinx[biaoji]=(int)(abs((red[3].x-red[1].x)/2+red[1].x));
            zhongxiny[biaoji]=(int)(abs((red[0].y-red[2].y)/2+red[2].y));
            biaojix[biaoji]=(int)(abs(red[3].x-red[1].x)/2+red[1].x);
            biaojiy[biaoji]=(int)(abs(red[0].y-red[2].y)/2+red[2].y);
            juli[biaoji]=zhongxinx[biaoji]-red[1].x;
            //
            zuox[biaoji]=red[1].x;
            zuoy[biaoji]=red[1].y;
            shangx[biaoji]=red[2].x;
            shangy[biaoji]=red[2].y;
            youx[biaoji]=red[3].x;
            youy[biaoji]=red[3].y;
            xiax[biaoji]=red[0].x;
            xiay[biaoji]=red[0].y;
            num++;
            r++;
            biaoji++;
            }
            }
        }
//
        vector<vector<Point>> bluecontours;
        vector<Vec4i>bluehierarchy;
        findContours(blue,bluecontours,bluehierarchy,RETR_LIST,CHAIN_APPROX_NONE,Point());
        vector<RotatedRect>boxblue(bluecontours.size());//定义最小外接矩形集合
        for (int i = 0; i < bluecontours.size(); i++)
        {
            double area=contourArea(bluecontours[i]);
            if(area>800&area<6000)
            {
             boxblue[i] = minAreaRect(Mat(bluecontours[i]));//绿色
            Point2f blue[4];
            boxblue[i].points(blue);
            int abc=33;
            for(int i=0;i<biaoji;i++)
            {
                if(blue[3].x>biaojix[i]&&blue[1].x<biaojix[i]&&blue[0].y>biaojiy[i]&&biaojiy[i]>blue[2].y)
                {
                    abc=44;
                    break;
                }
            }
            if(abc==33)
            {
            for(int j=0;j<4;j++)
            {
                line(frame,blue[j],blue[(j+1)%4],Scalar(255,255,113),5,8);//0最下,1最左,2最上,3最右
            }
            areazong[biaoji]=(int)area;
            zhongxinx[biaoji]=(int)(abs((blue[3].x-blue[1].x)/2+blue[1].x));
            zhongxiny[biaoji]=(int)(abs((blue[0].y-blue[2].y)/2+blue[2].y));
            biaojix[biaoji]=(int)(abs(blue[3].x-blue[1].x)/2+blue[1].x);
            biaojiy[biaoji]=(int)(abs(blue[0].y-blue[2].y)/2+blue[2].y);
            juli[biaoji]=zhongxinx[biaoji]-blue[1].x;
            //
            zuox[biaoji]=blue[1].x;
            zuoy[biaoji]=blue[1].y;
            shangx[biaoji]=blue[2].x;
            shangy[biaoji]=blue[2].y;
            youx[biaoji]=blue[3].x;
            youy[biaoji]=blue[3].y;
            xiax[biaoji]=blue[0].x;
            xiay[biaoji]=blue[0].y;
            biaoji++;
            num++;
            blu++;
            }
            }
        }
        cvtColor(black,black,COLOR_BGR2GRAY);
        Sobel(black, sobx, CV_16S, 1, 0, 3,1,1,BORDER_DEFAULT);
             convertScaleAbs(sobx,sobx);
        Sobel(black, soby, CV_16S, 0,1,3,1,1,BORDER_DEFAULT);
             convertScaleAbs(soby, soby);
        addWeighted(sobx,2,soby,2,0,sob);
        morphologyEx(sob,sob,MORPH_ERODE,element);

        threshold(sob,sob,2,255,THRESH_OTSU|THRESH_BINARY);
        vector<vector<Point>> contours;
        vector<Vec4i>hierarchy;
        findContours(sob,contours,hierarchy,RETR_LIST,CHAIN_APPROX_NONE,Point());
        vector<vector<Point>>contours_poly(contours.size());
        vector<Rect>boundRect(contours.size());
        vector<RotatedRect>boxbw(contours.size());

        for(unsigned int i=0;i<contours.size();i++)
        {
          approxPolyDP(Mat(contours[i]),contours_poly[i],1,true);//用制定精度逼近多边形曲线
          boundRect[i]=boundingRect(Mat(contours_poly[i]));//计算点集的最外面(up-right)矩形边界
         }
        for (int i = 0; i < contours.size(); i++)
        {
            boxbw[i] = minAreaRect(Mat(contours[i]));//绿色
           Point2f bw[4];
           boxbw[i].points(bw);
           double area=contourArea(contours[i]);

           if(area>800&area<6000)
           {
               int du1=(int)sqrt((bw[0].x-bw[1].x)*(bw[0].x-bw[1].x)+(bw[0].y-bw[1].y)*(bw[0].y-bw[1].y));
               int du2=(int)sqrt((bw[1].x-bw[2].x)*(bw[1].x-bw[2].x)+(bw[1].y-bw[2].y)*(bw[1].y-bw[2].y));
               int du3=(int)sqrt((bw[2].x-bw[3].x)*(bw[2].x-bw[3].x)+(bw[2].y-bw[3].y)*(bw[2].y-bw[3].y));
               int du4=(int)sqrt((bw[3].x-bw[0].x)*(bw[3].x-bw[0].x)+(bw[3].y-bw[0].y)*(bw[3].y-bw[0].y));
               int duijiao1=(int)sqrt((bw[0].x-bw[2].x)*(bw[0].x-bw[2].x)+(bw[0].y-bw[2].y)*(bw[0].y-bw[2].y));
               int duijiao2=(int)sqrt((bw[1].x-bw[3].x)*(bw[1].x-bw[3].x)+(bw[1].y-bw[3].y)*(bw[1].y-bw[3].y));
               int chang=(int)abs(bw[3].x-bw[1].x);
               int kuang=(int)abs(bw[0].y-bw[2].y);
               int x=bw[1].x;
               int y=bw[2].y;
               int abc=33;
               for(int i=0;i<biaoji;i++)
               {
                   if(bw[3].x>biaojix[i]&&bw[1].x<biaojix[i]&&bw[0].y>biaojiy[i]&&biaojiy[i]>bw[2].y)
                   {
                       abc=44;
                       break;
                   }
               }
               if(abc==33)
               {
               if(abs(du1-du2)<20&&abs(du2-du3)<20&&abs(du3-du4)<20&&abs(du4-du1)<20)//正方形条件
               {
                   if(abs(duijiao1-duijiao2)<5)//正方形条件2
                   {
                   int ber=rate(x,y,chang,kuang,color);//比较比率
                   float ratebi=((float)ber/area);
                   if(ratebi>0.3&&ratebi<3)
                   {
                   for(int j=0;j<4;j++)
                   {
                       line(frame,bw[j],bw[(j+1)%4],Scalar(222,55,113),3,8);//0最下,1最左,2最上,3最右
                   }
                   //这里加
                   areazong[biaoji]=(int)area;
                   zhongxinx[biaoji]=(int)(abs((bw[3].x-bw[1].x)/2+bw[1].x));
                   zhongxiny[biaoji]=(int)(abs((bw[0].y-bw[2].y)/2+bw[2].y));
                   biaojix[biaoji]=(int)(abs(bw[3].x-bw[1].x)/2+bw[1].x);
                   biaojiy[biaoji]=(int)(abs(bw[0].y-bw[2].y)/2+bw[2].y);
                   juli[biaoji]=zhongxinx[biaoji]-bw[1].x;
                   //
                   zuox[biaoji]=bw[1].x;
                   zuoy[biaoji]=bw[1].y;
                   shangx[biaoji]=bw[2].x;
                   shangy[biaoji]=bw[2].y;
                   youx[biaoji]=bw[3].x;
                   youy[biaoji]=bw[3].y;
                   xiax[biaoji]=bw[0].x;
                   xiay[biaoji]=bw[0].y;
                   blac++;
                   biaoji++;
                   num++;
                   }
                   }
               }
               }
            }

        }
        int jueding=0;
        int jueding1=0;
        int jueding2=0;
        int jueding3=0;
        int jueding4=0;
        int jueding5=0;
        int jueding6=0;
        int jueding7=0;
        int jueding8=0;
        if(biaoji>=8)
        {
            int area=0;
            int biao=0;
            for(int i=0;i<biaoji;i++)
            {
                for(int j=0;j<biaoji;j++)
                {
                    if(abs(areazong[i]-areazong[j])<0.5*areazong[i])
                    {
                        biao++;
                    }
                }
                if(biao>biaoji-2)
                {
                    area=areazong[i];
                    break;
                }
                biao=0;
            }

            for(int i=0;i<biaoji;i++)
            {
                for(int j=0;j<biaoji;j++)
                {
                    if(abs(juli[i]-juli[j])>50)
                    {
                        jueding++;
                    }
                    if(abs(zuox[i]-zuox[j])>1.5*(youx[j]-zuox[j]))
                    {
                        jueding1++;
                    }
                    if(abs(xiay[i]-xiay[j])>200)
                    {
                        jueding2++;
                    }
                    if(abs(youx[j]<youx[i])>200)
                    {
                        jueding3++;
                    }
                    if(abs(zuox[i]-zuox[j])>200)//abs(zuox[i]-zuox[j])>200
                    {
                        jueding4++;
                    }
                    if(abs(shangy[i]-shangy[j])>200)
                    {
                        jueding5++;
                    }
                    if(abs(shangy[i]-xiay[i])>1.5*abs(shangy[j]-xiay[j])&&abs(zuox[i]-youx[i])>1.5*abs(zuox[j]-youx[j]))
                    {
                        jueding6++;
                    }
                    if(areazong[i]<areazong[j]&&abs(areazong[i]-areazong[j])>0.3*areazong[j])
                    {
                        jueding7++;
                    }
                    if(abs(xiay[i]-xiay[j])>1.8*abs(xiay[j]-shangy[j]))
                    {
                        jueding8++;
                    }
                }
                if(jueding>biaoji-2||jueding1>biaoji-3||jueding2>biaoji-2||jueding4>biaoji-2||jueding3>biaoji-2||jueding5>biaoji-2||jueding6>biaoji-2||jueding7>biaoji-2||jueding8>biaoji-2)
                {
                     zuox[i]=0;
                     zuoy[i]=0;
                     shangx[i]=0;
                     shangy[i]=0;
                     xiax[i]=0;
                     xiay[i]=0;
                     youx[i]=0;
                     youy[i]=0;
                }
                jueding=0;
                jueding1=0;
                jueding2=0;
                jueding3=0;
                jueding4=0;
                jueding5=0;
                jueding6=0;
                jueding7=0;
                jueding8=0;

        }
            int n=biaoji;
            for(int i=0;i<n;i++)
            {
                for(int j=i+1;j<n;j++)
                {
                    if(zuox[j]==0)
                    {
                        for(int t=j+1;t<n;t++)
                        {
                            zuox[t-1]=zuox[t];
                            zuoy[t-1]=zuoy[t];
                            shangx[t-1]=shangx[t];
                            shangy[t-1]=shangy[t];
                            xiax[t-1]=xiax[t];
                            xiay[t-1]=xiay[t];
                            youx[t-1]=youx[t];
                            youy[t-1]=youy[t];
                        }
                        n--;
                        j--;
                    }
                }
            }
            int k=0;
            for(int i=0;i<n;i++)
            {
                for(int j=i+1;j<n;j++)
                  {
                    if(zuox[i]>zuox[j])//小的往前
                     {
                       k=zuox[i];
                       zuox[i]=zuox[j];
                       zuox[j]=k;
                       k=zuoy[i];
                       zuoy[i]=zuoy[j];
                       zuoy[j]=k;
                     }
                    if(shangy[i]>shangy[j])
                    {
                        k=shangx[i];
                        shangx[i]=shangx[j];
                        shangx[j]=k;
                        k=shangy[i];
                        shangy[i]=shangy[j];
                        shangy[j]=k;
                    }
                    if(youx[i]<youx[j])
                    {
                        k=youx[i];
                        youx[i]=youx[j];
                        youx[j]=k;
                        k=youy[i];
                        youy[i]=youy[j];
                        youy[j]=k;
                    }
                    if(xiay[i]<xiay[j])
                    {
                        k=xiax[i];
                        xiax[i]=xiax[j];
                        xiax[j]=k;
                        k=xiay[i];
                        xiay[i]=xiay[j];
                        xiay[j]=k;
                    }
                  }
            }
            Point2f yuantu[4],touship[4];
            int a=0;
            if(abs(zuox[0]-zuox[1])<500&&abs(zuox[1]-zuox[2])<500&&abs(zuox[2]-zuox[0])<500)//gaile
            {
                zuoy[0]=shangy[0];
                shangx[0]=youx[0];
                youy[0]=xiay[0];
                xiax[0]=zuox[0];
                yuantu[0].x=xiax[0];yuantu[0].y=xiay[0];
                yuantu[1].x=zuox[0];yuantu[1].y=zuoy[0];
                yuantu[2].x=shangx[0];yuantu[2].y=shangy[0];
                yuantu[3].x=youx[0];yuantu[3].y=youy[0];
                a=1;

            }
            if(a==0)
            {
            yuantu[0].x=xiax[0];yuantu[0].y=xiay[0];
            yuantu[1].x=zuox[0];yuantu[1].y=zuoy[0];
            yuantu[2].x=shangx[0];yuantu[2].y=shangy[0];
            yuantu[3].x=youx[0];yuantu[3].y=youy[0];
            }
            touship[1]=Point2f(0,0);
            touship[2]=Point2f(frame.cols,0);
            touship[3]=Point2f(frame.cols,frame.rows);
            touship[0]=Point2f(0,frame.rows);
            int biaochang=(int)(abs(abs(yuantu[0].x-yuantu[3].x)-abs(yuantu[1].x-yuantu[2].x)));
            int biaokuang=(int)(abs(abs(yuantu[0].y-yuantu[1].y)-abs(yuantu[2].y-yuantu[3].y)));
            if(biaochang<1000&&biaokuang<500)
           {

            Mat tranMat=getPerspectiveTransform(yuantu,touship);
            warpPerspective(tidai,toushi,tranMat,frame.size());
            toushi.copyTo(colorblack);
            cvtColor(toushi,toushi,COLOR_BGR2HSV);
            line(frame,yuantu[0],yuantu[1],Scalar(77,255,113),5,8);
            line(frame,yuantu[1],yuantu[2],Scalar(77,255,113),5,8);
            line(frame,yuantu[2],yuantu[3],Scalar(77,255,113),5,8);
            line(frame,yuantu[3],yuantu[0],Scalar(77,255,113),5,8);

            //判断颜色
            Scalar lansel=Scalar(100,43,150);
            Scalar lanseh=Scalar(150,255,255);
            Scalar greenl=Scalar(35,68,100);
            Scalar greenh=Scalar(90,255,255);
            Scalar whilel=Scalar(0,0,150);
            Scalar whileh=Scalar(180,25,255);
            int greenarea=0,bluearea=0,redarea=0,whilearea=0,blackarea=0;
            inRange(toushi,lansel,lanseh,toushiblue);
            inRange(toushi,greenl,greenh,toushigreen);
            inRange(toushi,whilel,whileh,toushiwhile);

            for(int i=0;i<toushi.rows;i++)
            for(int j=0;j<toushi.cols;j++)
            {
                    int h,s,v;
                    h=toushi.at<Vec3b>(i,j)[0];
                    s=toushi.at<Vec3b>(i,j)[1];
                    v=toushi.at<Vec3b>(i,j)[2];
                    if(((h>=0&&h<=25)||h>=156)&&s>=46&&v>=150)//v得大于黑色的v,v得注意点
                    {
                        toushired.at<Vec3b>(i,j)[0]=255;
                        toushired.at<Vec3b>(i,j)[1]=255;
                        toushired.at<Vec3b>(i,j)[2]=255;
                    }
            }
            cvtColor(toushired,toushired,COLOR_BGR2GRAY);
            threshold(toushired,toushired,254,255,THRESH_BINARY);
            vector<vector<Point>> toubluecontours,touredcontours,tougreencontours,toublackcontours,touwhilecontours;
            vector<Vec4i>toubluehierarchy,touredhierarchy,tougreenhierarchy,toublackhierarchy,touwhilehierarchy;

            //蓝色
            findContours(toushiblue,toubluecontours,toubluehierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());

            for (int i = 0; i < toubluecontours.size(); i++)
            {
                    double area=contourArea(toubluecontours[i]);
                    if(area>700)
                    {
                    bluearea=bluearea+(int)contourArea(toubluecontours[i]);
                    //drawContours(colorblack, toubluecontours, i, Scalar(6,155,255), 5, 8, toubluehierarchy);
                    }
            }
            //绿色
            findContours(toushigreen,tougreencontours,tougreenhierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());
            for (int i = 0; i < tougreencontours.size(); i++)
            {
                    double area=contourArea(tougreencontours[i]);
                    if(area>700)
                    {
                    greenarea=greenarea+(int)contourArea(tougreencontours[i]);
                    //drawContours(colorblack, tougreencontours, i, Scalar(55,55,27), 5, 8, tougreenhierarchy);
                    }

            }
            //红色
            findContours(toushired,touredcontours,touredhierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());
            for (int i = 0; i < touredcontours.size(); i++)
            {
                    double area=contourArea(touredcontours[i]);
                    if(area>700)
                    {
                    redarea=redarea+(int)contourArea(touredcontours[i]);
                    //drawContours(colorblack, touredcontours, i, Scalar(5,255,100), 5, 8, touredhierarchy);
                    }

            }
            //bai色
            findContours(toushiwhile,touwhilecontours,touwhilehierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point());
            for (int i = 0; i < touwhilecontours.size(); i++)
            {
                    double area=contourArea(touwhilecontours[i]);
                    if(area>700)
                    {
                    whilearea=whilearea+(int)contourArea(touwhilecontours[i]);
                    //drawContours(colorblack, touwhilecontours, i, Scalar(0,0,0), 7, 8, touwhilehierarchy);
                    }

            }
            //黑色
            int b=0,g=0,r=0;
            for(int i=0;i<colorblack.rows;i++)
            {
                for(int j=0;j<colorblack.cols;j++)
                {
                    b=colorblack.at<Vec3b>(i,j)[0];
                    g=colorblack.at<Vec3b>(i,j)[1];
                    r=colorblack.at<Vec3b>(i,j)[2];
                    if(b<45&&g<45&&r<40)
                    {
                        blackarea++;
                    }

                }
                b=0;g=0;r=0;
            }
//            printf("blue=%d ",bluearea);
//            printf("red=%d ",redarea);
//            printf("green=%d ",greenarea);
//            printf("while=%d ",whilearea);
//            printf("black=%d ",blackarea);
            if(whilearea>bluearea&&whilearea>redarea&&whilearea>greenarea&&whilearea>blackarea)
            {
                           char b='2';
                             port(b);
                //cout<<"b = "<<endl;
                printf("白色面积最大为  ");
//                shaixuan[bili]={2};
//                bili++;
            }
            if(blackarea>bluearea&&blackarea>redarea&&blackarea>greenarea&&blackarea>whilearea)
            {
                            char b='4';
                              port(b);
                //cout<<"b = "<<endl;
                printf("黑色面积最大为  ");
//                shaixuan[bili]={4};
//                bili++;
            }
            if(greenarea>bluearea&&greenarea>redarea&&greenarea>whilearea&&greenarea>blackarea)
            {
                            char b='6';
                              port(b);
                //cout<<"b = "<<endl;
                printf("绿色面积最大为  ");
//                shaixuan[bili]={6};
//                bili++;
            }
            if(bluearea>whilearea&&bluearea>redarea&&bluearea>greenarea&&bluearea>blackarea)
            {
                            char b='8';
                              port(b);
                //cout<<"b = "<<endl;
                printf("蓝色面积最大为  ");
//                shaixuan[bili]={8};
//                bili++;
            }
            if(redarea>bluearea&&redarea>whilearea&&redarea>greenarea&&redarea>blackarea)
            {
                           char b='9';
                              port(b);
                //cout<<"b = "<<endl;
                printf("红色面积最大为");
//                shaixuan[bili]={9};
//                bili++;
            }
            imshow("toushi",colorblack);
//2,4,6,8,10 白,黑,绿,蓝,红
            }
            //0最下,1最左,2最上,3最右
        }

        imshow("sob",sob);
        imshow("yuan",frame);
        //imshow("red",red);
        //imshow("green",green);
        //imshow("blue",blue);
    waitKey(20);//每帧延时20毫秒
//    int two=0,four=0,six=0,eight=0,night=0;
//        if(bili==20)
//        {
//            for(int i=0;i<bili;i++)
//            {
//                if(shaixuan[i]==2)
//                {
//                    two++;
//                }
//                if(shaixuan[i]==4)
//                {
//                    four++;
//                }
//                if(shaixuan[i]==6)
//                {
//                    six++;
//                }
//                if(shaixuan[i]==8)
//                {
//                    eight++;
//                }
//                if(shaixuan[i]==9)
//                {
//                    night++;
//                }

//            }
//        }
//        if(two>four&&two>six&&two>eight&&two>night)
//        {
//            char b='2';
//            flag = 2;
//              port(b);

//        }
//        if(four>two&&four>six&&four>eight&&four>night)
//        {
//            char b='4';
//              port(b);

//        }
//        if(six>four&&six>two&&six>eight&&six>night)
//        {
//            char b='6';
//              port(b);

//        }
//        if(eight>four&&eight>six&&eight>two&&eight>night)
//        {
//            char b='8';
//              port(b);

//        }
//        if(night>four&&night>six&&night>eight&&night>two)
//        {
//            char b='9';
//              port(b);

//        }

            }
            cap.release();//释放资源
}