
#include <QCoreApplication>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat src=imread("../image/11.png",IMREAD_GRAYSCALE);
if(src.empty())
{
printf("could not load image ...");
return ;
}
imshow("src",src);
Mat binary,morhpImg;
threshold(src,binary,0,255,THRESH_BINARY|THRESH_OTSU);
Mat kernel=getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
morphologyEx(binary,morhpImg,MORPH_CLOSE,kernel,Point(-1,-1));
kernel=getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
morphologyEx(morhpImg,morhpImg,MORPH_OPEN,kernel,Point(-1,-1));
imshow("output1",morhpImg);
vector<vector<Point>> contours;
vector<Vec4i> hireachy;
findContours(morhpImg,contours,hireachy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
Mat resultImg=Mat::zeros(src.size(),CV_8UC3);
Point cc;
for(int i=0;i<contours.size();++i)
{
double aera=contourArea(contours[i]);
if(aera <200 ||aera>6000) continue;
printf("aera:%2f\n",aera);
Rect rec=boundingRect(contours[i]);
float ratio=float(rec.width)/float(rec.height);
drawContours(resultImg,contours,i,Scalar(0,0,255),-1,8,Mat(),0,Point());
printf("aera:%2f\n",aera);
printf("aera:%2f\n",arcLength(contours[i],true));
int x=rec.x+rec.width/2;
int y=rec.y+rec.height/2;
cc=Point(x,y);
circle(resultImg,cc,2,Scalar(0,0,255),2,8,0);
}
imshow("output2",resultImg);
Mat circleImg=src.clone();
cvtColor(circleImg,circleImg,COLOR_GRAY2BGR);
circle(circleImg,cc,2,Scalar(0,0,255),2,8,0);
imshow("output3",circleImg);
waitKey(0);
retur 0;
}
