- 轮廓周围绘制矩形框和圆形框
- 轮廓周围绘制多边形
approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
- 轮廓周围绘制矩形
cv::boundingRect(InputArray points)得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形
cv::minAreaRect(InputArray points)得到一个旋转的矩形,返回旋转矩形
- 轮廓周围绘制圆和椭圆
cv::minEnclosingCircle(
InputArray points, //得到最小区域圆形
Point2f& center, // 圆心位置
float& radius)// 圆的半径
- 得到最小椭圆
cv::fitEllipse(InputArray points)
- 步骤
①首先将图像变为二值图像; ②发现轮廓,找到图像轮廓; ③通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆; ④绘制
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat src, gray, temp, dst;
RNG rng;
int value = 128;//低阈值
void Trackbar_Callback(int, void*);
int main(int argc, char** argv)
{
src = imread("../path.jpg");
if (src.empty())
{
cout << "could not load image1..." << endl;
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("src", src);
cvtColor(src, gray, COLOR_BGR2GRAY);//转换为灰度图
GaussianBlur(gray , gray, Size(3, 3), 11, 0);//高斯平滑
createTrackbar("Trackbar", "dst", &value, 255, Trackbar_Callback);
Trackbar_Callback(0, 0);
waitKey(0);
return 0;
}
void Trackbar_Callback(int, void*)
{
threshold(gray, temp, value, 255, THRESH_BINARY);//二值化
vector<vector<Point>> contours;//定义轮廓
vector<Vec4i> hierachy;//定义轮廓数
findContours(temp, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1));//查找轮廓
vector<vector<Point>>contours_ploy(contours.size());//定义多边形数组(初始化大小)
vector<Rect>ploy_rects(contours.size());//矩形(初始化大小)
vector<Point2f>circlecenter(contours.size());//圆心(初始化大小)
vector<float>radius(contours.size());//圆半径(初始化大小)
vector<RotatedRect>minRects(contours.size());//定义非轴对称(任何斜度)矩形
vector<RotatedRect>myellipse(contours.size());//定义非轴对称(任何斜度)椭圆
for (size_t i = 0; i < contours.size(); i++)
{
//多边形逼近
approxPolyDP(Mat(contours[i]),//输入的轮廓
contours_ploy[i], //输出的轮廓
3,//逼近准确度
true);//true表示曲线闭合
ploy_rects[i] = boundingRect(contours_ploy[i]);//获得轮廓的矩形包围框
//获得最小包围圆
minEnclosingCircle(contours_ploy[i], //输入的轮廓
circlecenter[i],//输出的数组圆心
radius[i]);//输出的数组半径
if (contours_ploy[i].size() > 5)
{
minRects[i] = minAreaRect(contours_ploy[i]);//轮廓的最小矩形包围框
myellipse[i] = fitEllipse(contours_ploy[i]);//轮廓的最小椭圆包围框
}
}
//绘制(轮廓)图形
dst = Mat::zeros(src.size(), src.type());
Point2f pts[4];//包含四个点坐标
for (size_t j = 0; j < contours.size(); j++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机颜色
/*
//绘制矩形
rectangle(dst, //输入输出数组
ploy_rects[j],//矩形
color, 2, 8);
//绘制圆
circle(dst,//输入输出数组
circlecenter[j], //圆心
radius[j],//半径
color, 2, 8);
*/
if (contours_ploy[j].size() > 5)
{
ellipse(dst, myellipse[j], color, 1, 8);//绘制椭圆//轮廓的最小椭圆包围框
minRects[j].points(pts); //轮廓的最小矩形包围框
for (int k = 0; k < 4; k++)
{
line(dst, pts[k], pts[(k + 1) % 4], color, 1, 8);//绘制线
}
}
}
imshow("dst", dst);
return;
}
输出结果:
|