void thresh_callback(int, void*) //只是一个回调函数
{
Mat src_copy = src.clone();
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Point p;
int s;
/// 寻找轮廓
findContours(threshold_output, contours, hierarchy, RETR_LIST, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); //注意第四个参数
/*Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);*/
cout<<"轮廓的个数是: "<<contours.size()<<endl;
for(unsigned int i=0;i<contours.size();i++)
{
double ContourLength = arcLength(contours[i], true);
double Contourarea = fabs(contourArea(contours[i]));
s=contours[i].size();//第一个轮廓的大小
if(ContourLength>50&&s>20)//?要删除小轮廓——长度点数小于设定值
{
//符合留下的条件。
numlongCon = numlongCon+1;
cout<<"第"<<i<<"个轮廓的点个数是: "<<s;
cout<<"第"<<i<<"个轮廓的ContourLength是: "<<ContourLength;
cout<<"第"<<i<<"个轮廓的Contourarea是: "<<Contourarea<<endl; //只是为了看一下留下的轮廓
}else
{
numshortcon=numshortcon+1;
contours.erase(contours.begin() + i);//删除短轮廓
}
}
cout<<"short轮廓的个数是: "<<numshortcon<<endl;
cout<<"long轮廓的个数是: "<<numlongCon<<endl;//short+long!=contour.size ?????
/* 输出某个轮廓的所有坐标
s=contours[41].size();//第一个轮廓的大小
if( s>0)
{
cout<<"第41个轮廓的点个数是: "<<s<<endl;
for(unsigned int i=0;i<s;i++)
{
p = contours[41].at(i);
x = p.x;
y = p.y;
cout<<setw(4)<<x<<","<<setw(4)<<y<<" ";
}
//获取j条轮廓的,输出每个轮廓的所有坐标点
/* w=contours.size();
cout<<w;
//s=contours[0].size();//第一个轮廓的大小
for(unsigned int j=0;j<w;j++)
{
// s=contours[j].size();
for(unsigned int i=0,s=contours[j].size();i<s;i++)
{
cout<<"第"<<j<<"个轮廓的点个数是: "<<s<<endl;
p = contours[j].at(i);
x = p.x;
y = p.y;
cout<<x<<","<<y<<endl;
}
}*/
/* 对每个轮廓计算其凸包*/
vector<vector<Point> >poly(contours.size());
for (unsigned int i = 0; i < contours.size(); i++)
{
approxPolyDP(Mat(contours[i]), poly[i], 1,0); //第三个参数为逼近精度,1为最小
}
/* 绘出轮廓及其凸包*/
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (unsigned int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours(drawing, poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); //绘出轮廓
}
/// 把结果显示在窗体
namedWindow("contour", CV_WINDOW_AUTOSIZE);
imshow("Hull demo", drawing);
{
Mat src_copy = src.clone();
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Point p;
int s;
/// 寻找轮廓
findContours(threshold_output, contours, hierarchy, RETR_LIST, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); //注意第四个参数
/*Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);*/
cout<<"轮廓的个数是: "<<contours.size()<<endl;
for(unsigned int i=0;i<contours.size();i++)
{
double ContourLength = arcLength(contours[i], true);
double Contourarea = fabs(contourArea(contours[i]));
s=contours[i].size();//第一个轮廓的大小
if(ContourLength>50&&s>20)//?要删除小轮廓——长度点数小于设定值
{
//符合留下的条件。
numlongCon = numlongCon+1;
cout<<"第"<<i<<"个轮廓的点个数是: "<<s;
cout<<"第"<<i<<"个轮廓的ContourLength是: "<<ContourLength;
cout<<"第"<<i<<"个轮廓的Contourarea是: "<<Contourarea<<endl; //只是为了看一下留下的轮廓
}else
{
numshortcon=numshortcon+1;
contours.erase(contours.begin() + i);//删除短轮廓
}
}
cout<<"short轮廓的个数是: "<<numshortcon<<endl;
cout<<"long轮廓的个数是: "<<numlongCon<<endl;//short+long!=contour.size ?????
/* 输出某个轮廓的所有坐标
s=contours[41].size();//第一个轮廓的大小
if( s>0)
{
cout<<"第41个轮廓的点个数是: "<<s<<endl;
for(unsigned int i=0;i<s;i++)
{
p = contours[41].at(i);
x = p.x;
y = p.y;
cout<<setw(4)<<x<<","<<setw(4)<<y<<" ";
}
//获取j条轮廓的,输出每个轮廓的所有坐标点
/* w=contours.size();
cout<<w;
//s=contours[0].size();//第一个轮廓的大小
for(unsigned int j=0;j<w;j++)
{
// s=contours[j].size();
for(unsigned int i=0,s=contours[j].size();i<s;i++)
{
cout<<"第"<<j<<"个轮廓的点个数是: "<<s<<endl;
p = contours[j].at(i);
x = p.x;
y = p.y;
cout<<x<<","<<y<<endl;
}
}*/
/* 对每个轮廓计算其凸包*/
vector<vector<Point> >poly(contours.size());
for (unsigned int i = 0; i < contours.size(); i++)
{
approxPolyDP(Mat(contours[i]), poly[i], 1,0); //第三个参数为逼近精度,1为最小
}
/* 绘出轮廓及其凸包*/
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (unsigned int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours(drawing, poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); //绘出轮廓
}
/// 把结果显示在窗体
namedWindow("contour", CV_WINDOW_AUTOSIZE);
imshow("Hull demo", drawing);
}