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

这篇具有很好参考价值的文章主要介绍了opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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;
}
  • 过程图像如下:
    opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
  • 椭圆拟合一般用于轮廓提取之后:

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

opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

  • 凸包绘制
 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);

opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++

3. 关于最小外接矩形

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

其接口返回值可读取如下:其中,其角度指的是width与物理坐标系y轴正方向逆时针所成的夹角
opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
赋值时也可以读出如下数据:中心、角度、尺寸大小、外接矩形
opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++文章来源地址https://www.toymoban.com/news/detail-703002.html

  • 画图详解一下吧:
    opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
  • 想要看真实的效果图的话,可以参考:biubiubiu~
    opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
  • 它也可以用于:
    opencv 外接圆,# C++ - opencv,opencv,人工智能,计算机视觉,深度学习,c++
  • 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)
  • 还有一些想法,后边再补充吧

到了这里,关于opencv 之 外接多边形(矩形、圆、三角形、椭圆、多边形)使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python:opencv画点、圆、线、多边形、矩形

    简介 :机器学习视觉方向一般都需要在图像中添加标注框,标注框有着很大的用处,特别是对图像中某些需要关注的特征起到圈定的效果,方便对特征选择进行处理。 相关攻略: 机器学习:基本流程 Python:调用摄像头使用cv2库录制视频 Python:视频拆分成一帧一帧的图片

    2024年02月04日
    浏览(92)
  • python opencv 绘制矩形、圆、线、多边形

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2024年02月03日
    浏览(123)
  • Android OpenCV(三十七):轮廓外接多边形

    参数四:closed,逼近曲线是否闭合的标志,true表示封闭,false,表示不封闭。 该方法使用的是 Douglas-Peucker algorithm(道格拉斯-普克算法) 。 Douglas-Peukcer算法 由D.Douglas和T.Peueker于1973年提出,也称为 拉默-道格拉斯-普克算法 、 迭代适应点算法 、 分裂与合并算法 、 D-P算法

    2024年04月13日
    浏览(69)
  • OpenCV(10): 轮廓近似—多边形拟合,边界矩形与边界圆形

    轮廓近似(Contour Approximation)是指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。 多边形拟合(Approximating Polygons)是将轮廓逼近成一个由直线段构成的多边形。常见的有最小包围矩形

    2024年02月10日
    浏览(47)
  • Python OpenCV实现鼠标绘制矩形框和多边形

    目录 Python OpenCV实现鼠标绘制矩形框和多边形 1. OpenCV鼠标事件操作说明 (1)setMouseCallback函数说明 (2)回调函数onMouse说明 (3)event 具体说明: (4)flags 具体说明 2. OpenCV实现鼠标绘制矩形框和多边形框 (1)绘制矩形框 (2)绘制多边形 (3)键盘控制 3. 完整的代码 本篇将

    2024年02月06日
    浏览(79)
  • OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

    目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse()  4.绘制矩形rectangle() 5.绘制多边形 fillPoly()  6.绘制文字putText() 7.例子 1.绘制直线line() img:绘制圆形的图像 ptl:直线起始点在图像中的坐标 pt2: 直线终点在图像中的坐标 color:圆形的颜色,用三通道表示 thickness:轮廓的宽

    2024年02月09日
    浏览(64)
  • Opencv(C++)笔记--绘制直线、矩形、椭圆、圆、填充多边形、绘制字体和随机产生坐标点

    目录 1--cv::line()绘制直线 2--cv::Rect()绘制矩形 3--cv::ellipse()绘制椭圆 4--cv::circle()绘制圆 5--cv::fillPoly()填充多边形 6--cv::putText()绘制字体 6--cv::RNG随机产生坐标点 使用 cv::Point p1 定义坐标点; 使用 cv::line() 绘制直线,传入的参数依次为:背景图、两个点的坐标、直线的颜色、直线

    2024年02月14日
    浏览(59)
  • 利用fabric绘画矩形和多边形

    需求在一张图片上标注矩形和多边形,支持回显; fabric版本:4.6.0; Fabric.js 是一个功能强大且操作简单的 Javascript HTML5 canvas 工具库。 官方文档 参考链接 组件代码drawer.vue createUuid 是为了让每一个图形有自己的id;方便用于获取用户点击的那个图形等操作; defaultRectStyle、d

    2024年02月08日
    浏览(71)
  • 【opencv】示例-minarea.cpp 如何寻找一组随机生成的点的最小外接矩形、三角形和圆...

    此段代码的主要功能是:利用OpenCV库生成随机点集,并计算并展示这些点的最小外包矩形、三角形和圆形。用户可以通过按键重新生成不同的随机点集,或者按ESC/Q退出程序。程序中利用了OpenCV的随机数生成函数、绘图函数以及几何形状的计算函数。

    2024年04月14日
    浏览(56)
  • cesium学习记录08-鼠标绘制实体(点,线,矩形,圆,多边形)

    上一篇学习了创建实体的一些基础知识,但有时还需要我们使用鼠标进行手动绘制,这一篇就来进行鼠标绘制实体的实现(点,线,矩形,圆,多边形)。 (这里需要掌握三个知识点,一是上一篇中的创建实体、二是鼠标事件、三是回调函数) 既然是鼠标绘制,自然离不开

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包