OpenCV学习笔记(十六)之绘制包围轮廓的矩形和圆形

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. 减少多边形轮廓点数

       API : cv::approxPolyDP

cv::approxPolyDP(
	InputArray curve,
	OutputArray approxCurve,
	double epsilon,
	bool closed
)

二. 绘制包围轮廓矩形

API :

  1. cv::boundingRect
cv::boundingRect(
	InputArray points
)

得到包围轮廓最小矩形的左上角点坐标和右下角点坐标,绘制一个矩形

  1. cv::minAreaRect
cv::minAreaRect(InputArray points)

       得到一个旋转的矩形,返回旋转矩形

三. 绘制包围轮廓的圆和椭圆

API :

  1. cv::minEnclosingCircle
cv::minEnclosingCircle(
InputArray points,
Point2f& center,		//圆心位置
float& radius			//圆的半径
)
  1. cv::fitEllipse
cv::fitEllipse(InputArray points)

       得到最小椭圆

四. 代码思路:

  1. 图像转为二值图像
  2. 找到图像轮廓
  3. 通过相关API在轮廓点上找到包围轮廓的最小矩形和圆,旋转矩形和椭圆
  4. 绘制出来

五. 代码实现

/*****轮廓周围绘制矩形框和圆形框*****/

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;

int threshold = 50;
int threshold_max = 255;
void Contours_Callback(int, void*);
cv::Mat src, dst, gray_src;
cv::RNG rng;

int main(int argc, char** argv) {
	src = cv::imread("矩形,圆形.png");
	cv::namedWindow("in", cv::WINDOW_NORMAL);
	cv::imshow("in", src);

	cv::cvtColor(src, gray_src, cv::COLOR_BGR2GRAY);
	//模糊,去噪
	cv::blur(gray_src, gray_src, cv::Size(3, 3), cv::Point(-1, -1));

	cv::namedWindow("ou", cv::WINDOW_NORMAL);
	cv::createTrackbar("Threshold Value:", "ou", &threshold, threshold_max,
		Contours_Callback);
	Contours_Callback(0, 0);

	cv::waitKey(0);
	return 0;
}

void Contours_Callback(int, void*) {
	//二值化
	cv::Mat binary_output;
	cv::threshold(gray_src, binary_output, threshold, threshold * 2,
		cv::THRESH_BINARY);
	//找出轮廓
	vector<vector<cv::Point>> contours;		//多个轮廓的点
	vector<cv::Vec4i> hierarchy;			//轮廓的层次结构
	cv::findContours(binary_output, contours, hierarchy, cv::RETR_TREE,
		cv::CHAIN_APPROX_SIMPLE, cv::Point(-1, -1));

	//找到轮廓后,找轮廓周围的矩形,圆形
	//轮廓周围的多边形
	vector<vector<cv::Point>> contours_poly(contours.size());
	//多边形被矩形包围
	vector<cv::Rect> poly_rects(contours.size());
	//轮廓周围的圆形圆心
	vector<cv::Point2f> ch(contours.size());
	//圆形的半径
	vector<float> radius(contours.size());
	
	//减少轮廓的点数,找出每个轮廓的包围矩形和圆的位置
	for (size_t i = 0; i < contours.size(); ++i) {
		//减少每个轮廓的点数
		cv::approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 3, true);
		//找出被包围的矩形位置
		poly_rects[i] = cv::boundingRect(contours_poly[i]);
		//找出被包围的圆的位置
		cv::minEnclosingCircle(contours_poly[i], ch[i], radius[i]);
	}

	//画出这些矩形和圆
	cv::Mat finalImg;
	src.copyTo(finalImg);
	for (size_t t = 0; t < contours.size(); ++t) {
		//颜色
		cv::Scalar color = cv::Scalar(rng.uniform(0, 255), rng.uniform(0, 255),
			rng.uniform(0, 255));
		//矩形
		cv::rectangle(finalImg, poly_rects[t], color, 2, 8);
		cv::circle(finalImg, ch[t], radius[t], 2, 8);
	}
	cv::imshow("ou", finalImg);

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值