OpenCV 轮廓周围绘制矩形框和圆形框的方法

 更新时间:2022年01月27日 11:09:25   作者:流楚丶格念  
这篇文章主要介绍了OpenCV 轮廓周围绘制矩形框和圆形框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

轮廓周围绘制介绍

没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像:

相关API

减少多边形轮廓点数:approxPolyDP

函数作用:基于RDP算法实现,目的是减少多边形轮廓点数

函数原型:

//减少多边形轮廓点数
approxPolyDP(
	InputArray curve, 			// 一般是由图像的轮廓点组成的点集 Mat(vector)
	OutputArray approxCurve, 	// 表示输出的多边形点集
	double epsilon, 			// 主要表示输出的精度,就是两个轮廓点之间最大距离数,5,6,7,,8,,,,
	bool closed 				// 表示输出的多边形是否封闭
)

RDP算法介绍:

  • 判断起始点(当前点)与终点的距离是否小于 epsilon, 若小于,结束,不小于执行2
  • 选取起始点(当前点)A的后两个位置的点C,判断它们之间的距离是否小于 epsilon, 若小于,点C与它们的中间点B都舍弃,若不小于,执行3
  • 判断A与B,B与C的距离,若有一者小于 epsilon,则点B舍弃,否则保留。然后点C作为起始点(当前点)重复 1 2 3 步骤,直到终点(这里得出的是一系列符合要求的点)

轮廓周围绘制矩形:boundingRect、minAreaRect

cv::boundingRect(InputArray points) 得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形
cv::minAreaRect(InputArray points) 得到一个旋转的矩形,返回旋转矩形

轮廓周围绘制圆和椭圆:minEnclosingCircle、fitEllipse

// 得到轮廓周围最小椭圆
cv::minEnclosingCircle(
InputArray points, 	// 得到最小区域圆形
Point2f& center, 	// 圆心位置 输出参数
float& radius		// 圆的半径 输出参数
)
// 得到轮廓周围最小椭圆
cv::fitEllipse(InputArray points) 

绘制步骤

  • 将图像变为二值图像
  • 发现轮廓,找到图像轮廓
  • 通过相关API在轮廓点上找到最小包含矩形和圆,旋转矩形与椭圆
  • 绘制周围

代码示例

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h> 

using namespace std;
using namespace cv;
Mat src, gray_src, drawImg;
int threshold_v = 170;
int threshold_max = 255;
const char* output_win = "rectangle-demo";
RNG rng(12345);
void Contours_Callback(int, void*);
int main(int argc, char** argv) {
	src = imread("./test2.jpg");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	blur(gray_src, gray_src, Size(3, 3), Point(-1, -1));
	
	const char* source_win = "input image";
	namedWindow(source_win, CV_WINDOW_AUTOSIZE);
	namedWindow(output_win, CV_WINDOW_AUTOSIZE);
	imshow(source_win, src);
	createTrackbar("Threshold Value:", output_win, &threshold_v, threshold_max, Contours_Callback);
	Contours_Callback(0, 0);
	waitKey(0);
	return 0;
}
void Contours_Callback(int, void*) {
	Mat binary_output;
	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;
	threshold(gray_src, binary_output, threshold_v, threshold_max, THRESH_BINARY);
	imshow("binary image", binary_output);
	findContours(binary_output, 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> 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_ploy[i], 3, true);
		ploy_rects[i] = boundingRect(contours_ploy[i]);
		minEnclosingCircle(contours_ploy[i], ccs[i], radius[i]);
		if (contours_ploy[i].size() > 5) {
			myellipse[i] = fitEllipse(contours_ploy[i]);
			minRects[i] = minAreaRect(contours_ploy[i]);
		}
	// draw it
	drawImg = Mat::zeros(src.size(), src.type());
	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(drawImg, ploy_rects[t], color, 2, 8);
		//circle(drawImg, ccs[t], radius[t], color, 2, 8);
		if (contours_ploy[t].size() > 5) {
			ellipse(drawImg, myellipse[t], color, 1, 8);
			minRects[t].points(pts);
			for (int r = 0; r < 4; r++) {
				line(drawImg, pts[r], pts[(r + 1) % 4], color, 1, 8);
			}
	imshow(output_win, drawImg);
	return;

到此这篇关于OpenCV 轮廓周围绘制矩形框和圆形框的文章就介绍到这了,更多相关OpenCV 绘制矩形框和圆形框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Dev-C++无法使用bits/stdc++.h问题及解决

    Dev-C++无法使用bits/stdc++.h问题及解决

    这篇文章主要介绍了Dev-C++无法使用bits/stdc++.h问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言详解float类型在内存中的存储方式

    C语言详解float类型在内存中的存储方式

    在c语言中float函数是单精度的。它在内存中以二进制的形式存储。分为符号位,阶码与尾数三部分,下面我们详细来了解一下
    2022-04-04
  • C语言进度条的实现原理详解

    C语言进度条的实现原理详解

    这篇文章主要介绍了C语言进度条的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • VC判断一个文件为目录的方法

    VC判断一个文件为目录的方法

    这篇文章主要介绍了VC判断一个文件为目录的方法,在Windows应用程序设计中非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C++超详细分析type_traits

    C++超详细分析type_traits

    C++的type_traits是一套纯粹编译期的逻辑,可以进行一些类型判断、分支选择等,主要用于模板编程。使用type_traits并不难,但是我们希望能够更加深入了解其实现方式,与此同时,可以更进一步体验C++的模板编程
    2022-08-08
  • C 语言中strstr函数实例详解

    C 语言中strstr函数实例详解

    这篇文章主要介绍了C 语言中strstr函数实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 用VC++6.0的控制台实现2048小游戏的程序

    用VC++6.0的控制台实现2048小游戏的程序

    本文是作者拜读刘地同学的《C语言控制台版2048》之后感觉非常不错,添加了注释之后分享给大家的,方便更多的初学者阅读学习,有需要的小伙伴参考下。
    2015-03-03
  • C语言实现简易停车场管理系统

    C语言实现简易停车场管理系统

    这篇文章主要为大家详细介绍了C语言实现简易停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 深入讲解C++中的构造函数

    深入讲解C++中的构造函数

    这篇文章主要介绍了C++中的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言SetConsoleCursorPosition函数使用方法

    C语言SetConsoleCursorPosition函数使用方法

    这篇文章介绍了C语言SetConsoleCursorPosition函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论