opencv29-轮廓周围绘制矩形框和圆形框
#include<opencv2\opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat src, temp, dst, src_gray;
int threshold_v = 170;
int threshold_max = 255;
char *output = "output image";
RNG rng;
void Contours_Callback(int, void*);
int main()
{
//加载图像
src = imread("E:\\vs2015\\opencvstudy\\29police.jpg");
if (!src.data)
{
cout << "could not load image!" << endl;
return -1;
}
imshow("inputImage", src);
cvtColor(src, src_gray, CV_BGR2GRAY);
blur(src_gray, src_gray, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);
namedWindow(output, CV_WINDOW_AUTOSIZE);
createTrackbar("Size", output, &threshold_v, threshold_max, Contours_Callback);
Contours_Callback(0, 0);
waitKey(0);
return 0;
}
void Contours_Callback(int, void*)
{
Mat bin_image;
vector<vector<Point>> contours;
vector<Vec4i> hierarhy;
threshold(src_gray, bin_image, threshold_v, threshold_max, THRESH_BINARY);
findContours(bin_image, contours, hierarhy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1));
vector<vector<Point>> contours_poly(contours.size()); //外接多边形
vector<Rect> ploy_rects(contours.size()); //多边形的外接矩形
vector<Point2f> ccs(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_poly[i], 3, true); //输出结果放在contours_poly里
ploy_rects[i]=boundingRect(contours_poly[i]); //第i个外接矩形
minEnclosingCircle(contours_poly[i], ccs[i], radius[i]);
if (contours_poly[i].size() > 5)
{
myellipse[i] = fitEllipse(contours_poly[i]);
minRects[i] = minAreaRect(contours_poly[i]);
}
}
//绘制
src.copyTo(dst);
Point2f pts[4];
for (size_t t = 0; t < contours.size(); t++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
//rectangle(dst, ploy_rects[t], color, 2, 8);
//circle(dst, ccs[t], radius[t], color, 2, 8);
ellipse(dst, myellipse[t], color, 2, 8);
minRects[t].points(pts);
for (int r = 0; r < 4; r++)
{
line(dst, pts[r], pts[(r+1) % 4], color, 2, 8);
}
}
imshow("result", dst);
}
运行结果: