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();//释放资源
}