opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

news2024/11/28 15:57:18

opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解

  • 本文主要讲述opencv中的外接多边形的使用:

    • 多边形近似
    • 外接矩形、最小外接矩形
    • 最小外接圆
    • 外接三角形
    • 椭圆拟合
    • 凸包
  • 将重点讲述最小外接矩形的使用

1. API介绍

#多边形近似
void cv::approxPolyDP(InputArray 	curve,
          OutputArray 	approxCurve,
          double 	epsilon,
          bool 	closed )		
Python:
cv.approxPolyDP(curve, epsilon, closed[, approxCurve]	) ->	approxCurve

#计算点到多边形的距离或者判断是否在多边形内部
double cv::pointPolygonTest	(InputArray 	contour,
           Point2f 	pt,
           bool 	measureDist )		
Python:
cv.pointPolygonTest(contour, pt, measureDist) ->	retval


#外接矩形
Rect cv::boundingRect(InputArray 	array)	

Python:
cv.boundingRect(array) ->	retval

#最小外接矩形
RotatedRect cv::minAreaRect	(InputArray 	points)	
Python:
cv.minAreaRect(	points) ->	retval

#求矩形交集
int cv::rotatedRectangleIntersection(const RotatedRect & 	rect1,
        const RotatedRect & 	rect2,
        OutputArray 	intersectingRegion )		
Python:
cv.rotatedRectangleIntersection(rect1, rect2[, intersectingRegion]	) ->	retval, intersectingRegion


#最小外接圆
void cv::minEnclosingCircle	(InputArray 	points,
        Point2f & 	center,
        float & 	radius )		
Python:
cv.minEnclosingCircle(points) ->	center, radius

#最小外接三角形
double cv::minEnclosingTriangle	(InputArray 	points,
        OutputArray 	triangle)		
Python:
cv.minEnclosingTriangle(points[, triangle]	) ->	retval, triangle

#椭圆拟合
void cv::ellipse(InputOutputArray 	img,
        Point 	center,
        Size 	axes,
        double 	angle,
        double 	startAngle,
        double 	endAngle,
        const Scalar & 	color,
        int 	thickness = 1,
        int 	lineType = LINE_8,
        int 	shift = 0 )		
Python:
cv.ellipse(	img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]]	) ->	img
cv.ellipse(	img, box, color[, thickness[, lineType]]	) ->	img

2. 例程

  • 给一个opencv官方的例程:
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
static void help()
{
	cout << "This program demonstrates finding the minimum enclosing box, triangle or circle of a set\n"
		<< "of points using functions: minAreaRect() minEnclosingTriangle() minEnclosingCircle().\n"
		<< "Random points are generated and then enclosed.\n\n"
		<< "Press ESC, 'q' or 'Q' to exit and any other key to regenerate the set of points.\n\n";
}
int main(int /*argc*/, char** /*argv*/)
{
	help();
	Mat img(500, 500, CV_8UC3, Scalar::all(0));
	RNG& rng = theRNG();
	for (;;)
	{
		int i, count = rng.uniform(1, 101);
		vector<Point> points;
		// Generate a random set of points
		for (i = 0; i < count; i++)
		{
			Point pt;
			pt.x = rng.uniform(img.cols / 4, img.cols * 3 / 4);
			pt.y = rng.uniform(img.rows / 4, img.rows * 3 / 4);
			points.push_back(pt);
		}
		// Find the minimum area enclosing bounding box
		Point2f vtx[4];
		RotatedRect box = minAreaRect(points);
		box.points(vtx);
		// Find the minimum area enclosing triangle
		vector<Point2f> triangle;
		minEnclosingTriangle(points, triangle);
		// Find the minimum area enclosing circle
		Point2f center;
		float radius = 0;
		minEnclosingCircle(points, center, radius);

		img = Scalar::all(0);
		// Draw the points
		for (i = 0; i < count; i++)
			circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);
		// Draw the bounding box
		for (i = 0; i < 4; i++)
			line(img, vtx[i], vtx[(i + 1) % 4], Scalar(0, 255, 0), 1, LINE_AA);

		//绘制外接矩形
		rectangle(img, box.boundingRect(), cv::Scalar(10, 100, 20), 2);
        
		//也可以:
		/*cv::Rect _rect = boundingRect(points);
		rectangle(img, _rect, cv::Scalar(10, 100, 20), 2);*/

		// Draw the triangle
		for (i = 0; i < 3; i++)
			line(img, triangle[i], triangle[(i + 1) % 3], Scalar(255, 255, 0), 1, LINE_AA);
		// Draw the circle
		circle(img, center, cvRound(radius), Scalar(0, 255, 255), 1, LINE_AA);
		imshow("Rectangle, triangle & circle", img);
		char key = (char)waitKey();
		if (key == 27 || key == 'q' || key == 'Q') // 'ESC'
			break;
	}
	return 0;
}
  • 过程图像如下:
    在这里插入图片描述
  • 椭圆拟合一般用于轮廓提取之后:

//获取拟合椭圆的外包围矩形  
cv::RotatedRect rotate_rect = cv::fitEllipse(points);  
//绘制拟合椭圆  
cv::ellipse(image, rotate_rect, cv::Scalar(0, 255, 255), 2, 8);  

在这里插入图片描述

  • 凸包绘制
 vector<Point> hull;
 convexHull(points, hull, true);
 img = Scalar::all(0);
 for( i = 0; i < count; i++ )
 circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);
 polylines(img, hull, true, Scalar(0, 255, 0), 1, LINE_AA);
 imshow("hull", img);
 #多边形填充绘制:
 polylines(img, hull, true, Scalar(0, 255, 0), -1, LINE_AA);
  • 计算两个旋转矩形交集:
vector<Point2f> intersectingRegion;
rotatedRectangleIntersection(rect1, rect2, intersectingRegion);

在这里插入图片描述

3. 关于最小外接矩形

  • C++版的最小外接矩形使用:
RotatedRect rect = minAreaRect(points);
float angle = rect.
box.points(vtx);

其接口返回值可读取如下:其中,其角度指的是width与物理坐标系y轴正方向逆时针所成的夹角
在这里插入图片描述
赋值时也可以读出如下数据:中心、角度、尺寸大小、外接矩形
在这里插入图片描述

  • 画图详解一下吧:
    在这里插入图片描述
  • 想要看真实的效果图的话,可以参考:biubiubiu~
    在这里插入图片描述
  • 它也可以用于:
    在这里插入图片描述
  • python版本的最小外接矩形:
 _rect = cv2.minAreaRect(conts_new[i])
 (x, y), (w, h), ang = _rect
 box = cv2.boxPoints(_rect)
 # 标准化坐标到整数
 box = np.int32(box)
 cv2.drawContours(mask_c3, [box], 0, (int(bgr[0]), int(bgr[1]), int(bgr[2])),2)
  • 还有一些想法,后边再补充吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyUI Datagrid 应用

两种为 datagrid 赋值表格 number 1 <div class"easyui-layout" data-options"fit:true"><div data-options"region:center"><table id"storeTable" class"easyui-datagrid" style"width:100%;height:…

STM32(HAL库)驱动(2.0寸)TFT-LCD彩屏(240*320)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改 3.2.3 lcd.c修改 3.2.4 lcd_inut.c修改 3.3 主函数代码 3.3…

重新思考半监督医学图像分割:方差减少的视角

文章目录 Rethinking Semi-Supervised Medical Image Segmentation: A Variance-Reduction Perspective摘要本文方法实验结果 Rethinking Semi-Supervised Medical Image Segmentation: A Variance-Reduction Perspective 摘要 在医学图像分割中&#xff0c;对比学习是通过对…

Flink简介及部署模式

文章目录 1、Flink简介2、Flink部署2.1 本地模式2.1 Standalone模式部署2.2 Standalone模式下的高可用2.3 Yarn模式Yarn模式的高可用配置&#xff1a;yarn模式中三种子模式的区别&#xff1a; 3、并行度4、提交命令执行指定任务Application Mode VS yarn per-job 5、注意事项5、…

1 请使用js、css、html技术实现以下页面,表格内容根据查询条件动态变化。

1.1 创建css文件&#xff0c;用于编辑style 注意&#xff1a; 1.背景颜色用ppt的取色器来获取&#xff1a; 先点击ppt的形状轮廓&#xff0c;然后点击取色器&#xff0c;吸颜色&#xff0c;然后再点击形状轮廓的其他轮廓颜色&#xff0c;即可获取到对应颜色。 2.表格间的灰色线…

二,创建支付微服务提供者 第二章

<dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--监控--><dependency><groupId>org.springframewor…

微信小程序瀑布流组件

1.创建文件夹 /components/waterfall/ 文件夹结构如图 各文件内容&#xff1a; .wxml<view class"waterfallView"><view wx:for"{{resultData}}" wx:for-item"i" wx:for-index"iIndex" wx:key"iIndex" class&…

Idea 设置类和方法的注释(获取参数)

Idea 添加注释&#xff1a;类注释、方法注释 类注释 方法注释 类注释 File–Setting–Editor–File and Code Templates–Class: 注释模板&#xff1a; /** **description: *author: fqtang*time: ${DATE} ${TIME}* */ 操作截图&#xff1a; 效果&#xff1a; 方法注释 为了…

06.计算机网络——IP协议

文章目录 网络层IP协议基本概念协议头格式如何解包如何交付网段划分子网掩码特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 网络层 IP协议 IP协议提供一种将数据从A主机送达到B主机的能力&#xff0c;进行网络层的通信。 ​ IP协议 基本概念 主机 —— 配有IP地址…

HTML Audio对象属性、方法、事件及音乐播放器应用

分为两部分&#xff0c;前面主要介绍Html5为Audio对象提供了用于DOM操作的方法、属性和事件&#xff1b; 后面主要通过使用audio jquery bootstrap在浏览器底部实现的音乐播放器。 效果&#xff1a; 目录 Audio对象 常用方法 常用属性 常用事件 音乐播放器 Html页面 样式…

C进阶:内存操作函数

内存操作函数 memcpy 头文件&#xff1a;string.h 基本用途&#xff1a;进行不相关&#xff08;不重叠的内存&#xff09;拷贝。 函数原型&#xff1a;void* memcpy(void* destination,//指向目标数据的指针 const void* source,//指向被拷贝数据的指针 size_t num);//拷贝的数…

ES6解构对象、数组、函数传参

目录 1.对象解构 2.对象解构的细节处理 2.1.解构的值对象中不存在时 2.2.给予解构值默认参数 2.3.非同名属性解构 3.数组解构 3.1基础解构语法 3.2数组嵌套解构 4.函数解构传参 5.解构小练习 在ES6的新语法中新增了解构的方法&#xff0c;它可以让我们很方便的从数组或…

如何实现两个对象之间的属性拷贝

两个对象之间的属性拷贝 你可以使用Java的BeanUtils类或类似工具来实现两个对象之间的属性拷贝。以下是一个示例代码&#xff1a; import org.apache.commons.beanutils.BeanUtils;public class CopyPropertiesExample {public static void main(String[] args) throws Excep…

java学习路程之篇一、进阶知识、面向对象高级、static关键字、继承、final关键字、this、super

文章目录 面向对象高级static关键字继承final关键字 面向对象高级 static关键字 继承 final关键字

【统计课堂】SPSS统计分析- R×C列联表资料统计方法的选择

之前我们提到RC列联表资料&#xff0c;列联表根据变量是否有序可以分为双向无序、单项有序、双向有序列联表&#xff0c;他们的统计方法是不同的 一、双向无序列联表 双向无序列联表是指行、列变量均为无序的列联表&#xff0c;比如不同污染地区的动物畸形率是否有差异&#x…

RT1052的时钟

文章目录 时钟主时钟图时钟树 系统时钟 时钟 主时钟图表明了各个 PLL 时钟&#xff08;总共 7 个 PLL&#xff09;的由来和通路&#xff1b;时钟树图&#xff0c;则表明了 RT1052 内部各个根时钟&#xff08;CLK ROOT&#xff09;的由来和通路。 主时钟图 图中总共有7个PLL&…

mybatis sql 参数自动填充

项目中打印sql&#xff0c;参数都是需要自己复制进去,很不方便&#xff0c;例如: Preparing: SELECT id,product_code,product_name,del_flag,create_time,create_by,update_time,update_by,remark FROM product_info WHERE (del_flag ?) LIMIT ? > Parameters: false(B…

结构型设计模式之外观模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

DNS协议详解

DNS协议详解 DNS协议介绍DNS解析过程DNS查询的方式递归查询迭代查询区别 DNS协议介绍 DNS 协议是一个应用层协议&#xff0c;它建立在 UDP 或 TCP 协议之上&#xff0c;默认使用 53 号端口。该协议的功能就是将人类可读的域名 (如&#xff0c;www.qq.com) 转换为机器可读的 IP…

【深度学习】RNN学习笔记

RNN学习笔记 时间序列 将单词序列转换为向量&#xff0c;这里有五个单词&#xff0c;然后对于每一个单词都进行独热编码&#xff0c;编码成一个特定的向量。 对于RNN网络&#xff0c;需要一次性读取多个句子&#xff0c;那么涉及到batch_size&#xff0c;这里第二个表达就是&a…