OpenCV——contours学习笔记(三)

下面进行第三节的学习,首先上实验的原图
OpenCV——contours学习笔记(三)_第1张图片

求出轮廓的最小外接圆

#include
#include
#include

using namespace cv;

int main()
{
	Mat srcImage = imread("1.png");
	imshow("【原始图像】", srcImage);

	cvtColor(srcImage, srcImage, CV_BGR2GRAY);
	threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
	imshow("【二值化图像】", srcImage);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

	Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
	if (!contours.empty() && !hierarchy.empty())
	{
		for (int i = 0; i< contours.size(); i++)
		{
			drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
		}
	}
	imshow("边缘图像", contoursImage);
	
	Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
	for (int i = 0; i < contours.size(); i++)
	{
		//寻找最小包围圆形 
		Point2f center; //圆心
		float radius; //半径
		minEnclosingCircle(contours[i], center, radius);
		//由minEnclosingCircle函数得到的圆形和半径来绘制最小外接圆 
		circle(resultImage, center, radius, Scalar((rand() & 255), (rand() & 255), (rand() & 255)), 3);
	}

	imshow("【最小包围圆】", resultImage);
	waitKey(0);
	return 0;
}

实验结果
OpenCV——contours学习笔记(三)_第2张图片

绘制轮廓的最小外接矩形

#include
#include
#include

using namespace cv;

int main()
{
	Mat srcImage = imread("1.png");
	imshow("【原始图像】", srcImage);

	cvtColor(srcImage, srcImage, CV_BGR2GRAY);
	threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
	imshow("【二值化图像】", srcImage);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

	Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
	if (!contours.empty() && !hierarchy.empty())
	{
		for (int i = 0; i< contours.size(); i++)
		{
			drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
		}
	}
	imshow("边缘图像", contoursImage);
	
	Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
	for (int i = 0; i < contours.size(); i++)
	{
		//寻找外包矩形
		Rect maxRect = boundingRect(contours[i]);
		//绘制外包矩形
		rectangle(resultImage, maxRect, Scalar((rand() & 255), (rand() & 255), (rand() & 255)));
	}

	imshow("【外接矩形】", resultImage);
	waitKey(0);
	return 0;
}

实验结果:
OpenCV——contours学习笔记(三)_第3张图片

绘制轮廓的最小外接矩形

#include
#include
#include

using namespace cv;

int main()
{
	Mat srcImage = imread("1.png");
	imshow("【原始图像】", srcImage);

	cvtColor(srcImage, srcImage, CV_BGR2GRAY);
	threshold(srcImage, srcImage, 0, 255, THRESH_OTSU);
	imshow("【二值化图像】", srcImage);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

	Mat contoursImage(srcImage.rows, srcImage.cols, CV_8U, Scalar(0));
	if (!contours.empty() && !hierarchy.empty())
	{
		for (int i = 0; i< contours.size(); i++)
		{
			drawContours(contoursImage, contours, i, Scalar(255), 1, 8, hierarchy);
		}
	}
	imshow("边缘图像", contoursImage);
	
	Mat resultImage(srcImage.rows, srcImage.cols, CV_8UC3, Scalar(0));
	for (int i = 0; i < contours.size(); i++)
	{
		//寻找最小外接矩形
		RotatedRect minRect = minAreaRect(contours[i]);
		Point2f fourPoints[4];
		//将minRect对象的四个顶点坐标值放到fourPoints数组中 
		minRect.points(fourPoints);
		//根据得到的四个点的坐标  绘制矩形 
		for (int i = 0; i < 3; i++)
		{
			line(resultImage, fourPoints[i], fourPoints[i + 1], Scalar(0, 255, 0), 3);
		}
		line(resultImage, fourPoints[0], fourPoints[3], Scalar(0, 255, 0), 3);
	}

	imshow("【最小外接矩形】", resultImage);
	waitKey(0);
	return 0;
}

实验结果
OpenCV——contours学习笔记(三)_第4张图片

在opencv中,坐标的原点在左上角,与x轴平行的方向为角度为0,逆时针旋转角度为负,顺时针旋转角度为正。而RotatedRect类是以矩形的哪一条边与x轴的夹角作为角度的呢?angle 是水平轴(x轴)逆时针旋转,与碰到的第一个边的夹角,而opencv默认把这个边的边长作为width,angle的取值范围必然是负的
OpenCV——contours学习笔记(三)_第5张图片

你可能感兴趣的:(OpenCV)