#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define window "【原始图】"
#define windowx "【结果图1】"
#define windowy "[结果图2]"
//绘制最小包围圆,旋转矩阵,以及多边拟合曲线。。
Mat edge;
Mat src;
Mat result;
int thresh = 50;
void on_thresh(int,void*);
int main()
{
//1.read map
Mat image=imread("牧马.jpg",0);
resize(image,image,Size(0,0),0.6,0.6);
//2.blur
blur(image,src,Size(3,3));
//3.thresh
namedWindow(windowx);
createTrackbar("thresh",windowx,&thresh,255,on_thresh);
cv::waitKey(0);
return 0;
}
void on_thresh(int, void*)
{
threshold(src, edge, thresh, 255, THRESH_BINARY);
//3.findcontours
vector<vector<Point>> contours;
vector<Vec4i> h;
findContours(edge,contours,h,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
//4.circle,rotate rect,appro_poly
result=Mat::zeros(src.size(),CV_8UC3);
drawContours(result,contours,-1,Scalar(255,0,0));
vector<vector<Point>> appr_points(contours.size());//........................................................一定要带上空间大小。
for (int i = 0; i < contours.size(); ++i)
{
Point2f center;
float radius;
minEnclosingCircle(contours[i],center,radius);
circle(result,center,radius,Scalar(0,0,255));
RotatedRect rect=minAreaRect(contours[i]);
Point2f re[4];
rect.points(re);
Point2f pre = re[3];
for (int j = 0; j < 4; ++j)
{
line(result,pre,re[j],Scalar(0,255,0));
pre = re[j];
}
approxPolyDP(Mat(contours[i]),appr_points[i],15,true);
drawContours(result,appr_points,i,Scalar(255,255,0),1,8);//...................。。。。。。。。.....注意这里appr_points 为arry of arry。
}
imshow(windowx, result);
}
绘制最小包围圆,旋转矩阵,以及多边拟合曲线
最新推荐文章于 2022-11-01 22:18:41 发布