28 OpenCV 轮廓周围绘制图形

文章目录

  • approxPolyDP 轮廓周围绘制矩形
  • boundingRect
  • minAreaRect
  • 绘制圆和椭圆
  • 示例

approxPolyDP 轮廓周围绘制矩形

approxPolyDP(InputArray  curve, OutputArray approxCurve,  double  epsilon,  bool  closed)
    curve:输入点集,二维点向量的集合
    approxCurve:输出点集,表示拟合曲线或多边形,数据与输入参数 curve 一致
    epsilon:指定的近似精度,原始曲线与近似曲线之间的最大距离
    close: 闭合标志,True 表示闭合多边形,False 表示多边形不闭合

boundingRect

boundingRect(InputArray points)得到轮廓周围最小矩形左上交点坐标和右下角点坐标,绘制一个矩形

minAreaRect

minAreaRect(InputArray  points)得到一个旋转的矩形,返回旋转矩形

绘制圆和椭圆

cv::minEnclosingCircle(InputArray points, //得到最小区域圆形
	Point2f& center, // 圆心位置
	float& radius)// 圆的半径
cv::fitEllipse(InputArray  points)得到最小椭圆

示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.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("D:/vcprojects/images/hotball.png");
	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);
	namedWindow(output_win);
	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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干货!Python正则表达式之匹配分组和其他功能函数

1.匹配分组 ()&#xff1a;表示一个整体&#xff0c;表示分组&#xff0c;然后捕获 2.匹配分组实例 # 导入re模块 import re ​ tel "0755-98776754" ​ # 定义正则表达式 pattern "(\\d{4})-(\\d{8})" result re.search(pattern, tel) print(result…

offer选择:创业公司 VS 大厂外包

面试拿到两个offer&#xff0c;一个是规模只有几十人的初创小公司&#xff0c;另一个是大厂外包岗位。都是功能测试&#xff0c;两者薪水待遇也差不多&#xff0c;该如何选择?更有利于之后的职业发展...... 这是一个比较典型的问题&#xff0c;对于要转行的同学或者是刚入行没…

Leetcode 200. 岛屿数量

心路历程&#xff1a; 在没有看图论这一章之前看这道题没什么直接的思路&#xff0c;在看完图论之后&#xff0c;学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅&#xff0c;但是需要处理的细节第一次没怎么处理好&#xff0c;花了很多…

VC++ error C1001: 内部编译器错误 c\error.h”,第 1291 行) 原因和解决

原因是使用模板时实现方法没写分号 #include <iostream>template <class T> class A { public:A() {};~A() {};void GetName() {return}; };int main(int argc, char* argv[]) {return 0; }

Linux:执行命令的命令eval与Bash解析命令的方式

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 eval命令用于接收参数&#xff0c;并将这些参数作为一行命令执行&#xff0c;这也许会使人困惑&#xff0c;为什么我不能直接执行命令而需要使用eval命令间接执行呢&…

【题目】【网络系统管理】2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A:网络构建

2022 年全国职业院校技能大赛 网络系统管理赛项 模块 A&#xff1a;网络构建 目录 考试说明 … 3 任务描述 … 3 任务清单 … 3 &#xff08;一&#xff09;基础配置 … 3 &#xff08;二&#xff09;有线网络配置 … 4 &#xff08;三&#xff09;无线网络配置 … 5 &…

仿muduo库实现one thread one loop式并发服务器

文章目录 一、项目简介 二、项目整体认识 2、1 HTTP服务器 2、2 Reactor模型 三、预备知识 3、1 C11 中的 bind 3、2 简单的秒级定时任务实现 3、3 正则库的简单使用 3、4 通用类型any类型的实现 四、服务器功能模块划分与实现 4、1 Buffer模块 4、2 Socket模块 4、3 Channel模…

数据结构--树(二叉树)

定义 树的结点 如上图A的结点为2&#xff0c;B的结点为1&#xff0c;树的结点就是最多的那个&#xff0c;这棵树的结点就是3. 树的存储结构 树的存储结构可以是多样的 typedef struct BiTNode /* 结点结构 */ {DATATYPE data; /* 结点数据 */struct BiTNode *lchild,*rchi…

算法打卡Day14

今日任务&#xff1a; 1&#xff09;104.二叉树的最大深度 2&#xff09;559.n叉树的最大深度 3&#xff09;111.二叉树的最小深度 4&#xff09;222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#…

视频讲解|基于非对称纳什谈判的多微网电能共享运行优化策略

1 主要内容 该讲解视频对应的程序链接为基于非对称纳什谈判的多微网电能共享运行优化策略_吴锦领&#xff0c;主要内容是对《基于非对称纳什谈判的多微网电能共享运行优化策略》的matlab复现&#xff0c;解决的是微网间基于非对称纳什谈判的P2P电能交易共享问题&#xff0c;基…

js生成笛卡尔集合

let arr[[黑, 金, 白],[16G, 32G],[电信, 移动, 联通], ]let listarr.reduce((a, b) > { return a.flatMap(x > b.map(y > [...x, y]))}, [[]] )console.log(list)生成结果

20240322,结构类型,枚举,

一&#xff0c;枚举 1.1 常量符号化 程序中用符号表达数字&#xff0c;增加程序的可读性&#xff1f; #include<stdio.h>//能跑&#xff0c;但是报错不推荐将字符串转为CHAR** const int red0; const int yellow1; const int green2; //为撒在前面&#xff1f; int…

移动硬盘加Type-C接口充电:革新存储与充电体验

随着科技的飞速发展&#xff0c;电子设备的功能和性能也在不断提升。近年来&#xff0c;移动硬盘作为数据存储的重要工具&#xff0c;其接口和充电方式的革新也备受关注。特别是Type-C接口的普及&#xff0c;为移动硬盘带来了前所未有的便利。本文将深入探讨移动硬盘加入Type-C…

Linux 源码安装: PostgreSQL 15.6数据库

Linux 源码安装&#xff1a; PostgreSQL 15.6数据库 1、下载 postgresql-15.6.tar.gz 源码包2、安装postgresql-15.62.1、解压 tar.gz 文件2.2、进入解压后的目录2.3、创建 "postgres" 用户和对应的用户组2.4、创建data目录&#xff0c;授权2.5、编译 PostgreSQL2.6、…

【Qt】使用Qt实现Web服务器(五):QtWebApp上传文件、详解请求数据处理过程

1、示例 1)演示 2)上传图片 3)显示图片 2、源码 示例源码Demo1->FileUploadController void FileUploadController::service(HttpRequest& request, HttpResponse& response)

Linux docker7--私有镜像仓库registry和UI搭建及使用

一、对于开源的镜像&#xff0c;如redis&#xff0c;nginx等&#xff0c;可以通过官方仓库Docker Hub&#xff0c;或者国内的阿里云等共有仓库下载获取到镜像。但是企业内对于自己的研发产品不可能往公共仓库去发布镜像的&#xff0c;一般都会搭建私有的镜像仓库&#xff0c;保…

快速排序(递归)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所有元素均大…

哲♂学家带你深♂入了♂解结构体及结构体内存大小问题

目录 概要 一、结构体的声明 二、结构体变量的创建和初始化 三、结构体的特殊声明 四、结构体内存对齐 1、对齐原则 2、例一 对齐数 计算方法 3、例二 总结 概要 结构体是我们日常编程中经常要用到的一种自定义类型&#xff0c;使用起来也是十分的方便。接下来就由…

Git常用操作命令

Git常用操作命令 前言 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理软件开发项目的版本历史。Git 是我们日常工作中使用频率极高的工具&#xff0c;各种指令让人眼花缭乱&#xff0c;这里对Git的一些相关命令进行总结。 常用命令 一般来说&#xff0c;日常使用g…

今日AI:Gemini Pro1.5向所有人开放;Stable Diffusion核心团队集体离职;HeyGen5.0上线视频翻译功能;剪映内测视频翻译功能

欢迎来到【今日AI】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 &#x1f91…
最新文章