opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形
寻找包裹轮廓的最小正矩形:boundingRect 函数
返回矩阵应满足:① 轮廓上的点均在矩阵空间内。② 矩阵是正矩阵(矩形的边界与图像边界平行)。
Rect boundingRect(InputArray points);
- 唯一一个参数是输入的二维点集,可以是 vector 或 Mat 类型。
代码示例:
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(){
Mat src = imread("C:/Users/齐明洋/Desktop/7.jpg");
imshow("src", src); Mat gray, bin_img;
cvtColor(src, gray, COLOR_BGR2GRAY); //将原图转换为灰度图
imshow("gray", gray); //二值化
threshold(gray, bin_img, , , THRESH_BINARY_INV);
imshow("bin_img", bin_img); //寻找最外围轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); //绘制边界矩阵
RNG rngs = { };
Mat dst = Mat::zeros(src.size(), src.type());
for (int i = ; i < contours.size(); i++) {
Scalar colors = Scalar(rngs.uniform(, ), rngs.uniform(, ), rngs.uniform(, ));
drawContours(dst, contours, i, colors, );
Rect rects = boundingRect(contours[i]);
rectangle(dst, rects, colors, );
}
imshow("dst", dst); waitKey();
}
效果演示:

寻找包裹轮廓的最小斜矩形:minAreaRect 函数
返回矩阵应满足:① 轮廓上的点均在矩阵空间内。② 没有面积更小的满足条件的矩阵(与 boundingRect 返回结果的区别是:矩形的边界不必与图像边界平行)。
需要补充的是,求点集的拟合椭圆(fitEllipse() https://www.cnblogs.com/bjxqmy/p/12354750.html)便是求斜矩阵内最大的椭圆(矩阵长宽分别做椭圆长轴、短轴)。
RotatedRect minAreaRect(InputArray points);
- 唯一一个参数是输入的二维点集,可以是 vector 或 Mat 类型。
代码示例:
#include<opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/7.jpg");
imshow("src", src); Mat gray, bin_img;
cvtColor(src, gray, COLOR_BGR2GRAY); //将原图转换为灰度图
imshow("gray", gray); //二值化
threshold(gray, bin_img, , , THRESH_BINARY_INV);
imshow("bin_img", bin_img); //寻找最外围轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); //绘制最小边界矩阵
RNG rngs = { };
Mat dst = Mat::zeros(src.size(), src.type());
Point2f pts[];
for (int i = ; i < contours.size(); i++) {
Scalar colors = Scalar(rngs.uniform(, ), rngs.uniform(, ), rngs.uniform(, ));
drawContours(dst, contours, i, colors, );
RotatedRect rects = minAreaRect(contours[i]);
rects.points(pts);//确定旋转矩阵的四个顶点
for (int i = ; i < ; i++) {
line(dst, pts[i], pts[(i + ) % ], colors, );
}
}
imshow("dst", dst); waitKey();
}
效果演示:

借鉴博客:https://www.cnblogs.com/little-monkey/p/7429579.html
http://www.pianshen.com/article/4286104294/
opencv —— boundingRect、minAreaRect 寻找包裹轮廓的最小正矩形、最小斜矩形的更多相关文章
- opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆
寻找包裹轮廓的最小圆:minEnclosingCircle 函数 返回圆应满足:① 轮廓上的点均在圆形空间内.② 没有面积更小的满足条件的圆. void minEnclosingCircle(Inpu ...
- opencv的实用研究--分析轮廓并寻找边界点
opencv的实用研究--分析轮廓并寻找边界点 轮廓是图像处理中非常常见的.对现实中的图像进行采样.色彩变化.灰度变化之后,能够处理得到的是“轮廓”.它直接地反应你了需要分析对象的边界特 ...
- OpenCV学习代码记录—— Snake轮廓
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan
BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤ ...
- exgcd求解同余方程的最小正整数解 poj1061 poj2115
这两题都是求解同余方程,并要求出最小正整数解的 对于给定的Ax=B(mod C) 要求x的最小正整数解 首先这个式子可转化为 Ax+Cy=B,那么先用exgcd求出Ax+Cy=gcd(A,C)的解x ...
- [学习笔记]最小割之最小点权覆盖&&最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- 树形DP求树的最小支配集,最小点覆盖,最大独立集
一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...
随机推荐
- 建立MVC的依赖项注入 Setting up MVC Dependency Injection 精通ASP-NET-MVC-5-弗瑞曼
The result of the three steps I showed you in the previous section is that the knowledge about the i ...
- Dynamics CRM CE 怎样从 UCI 改为 classic UI
dynamics 现在大力推UCI. 但是对于大部分人来说还是使用不习惯. 怎样从UCI改为classic UI呢 1. 快速的方法 https://xxx.crm.dynamics.com/main ...
- WebAPI接口开发实践
背景 在团队两年多陆续负责了几个项目的开发上线已经代码的review,特别是对老项目的重构过程中,发现之前的API设计是没有任何规范和约定的,不同的开发同学有不同的习惯,因此需要一套规范去约定,现在分 ...
- zookeeper3.4.6安装
1.关闭防火墙 service iptables stop chkconfig iptables off 2.编辑hosts文件: vi /etc/hosts 192.168.99.6 JacK6 1 ...
- Docker和Kubernetes
Docker和Kubernetes Docker Docker是一个容器的开放平台,但它不是最早的.自20世纪70年代以来,容器平台一直存在.他们的开发可以追溯到Unix中的chroot系统调用.在2 ...
- 科普文,搭建python开发环境
Python简介!首先,是一门面向对象的程序设计语言,先说3个优点!1.有条理,简单,易学,易用.2.强大!可以把其他编程语言制作的模块利用起来.3.拥有丰富的库.Python作为高级编程语言,拥有的 ...
- mybatis 源码分析中的知识点
1. resultMap 和 resultType 之间的优劣 resultMap: 在联合查询的时候, 可以不用写Join (因为在resultMap 的定义里面已经写了这些东西了<asso ...
- java.io 包下的类有哪些 + 面试题
java.io 包下的类有哪些 + 面试题 IO 介绍 IO 是 Input/Output 的缩写,它是基于流模型实现的,比如操作文件时使用输入流和输出流来写入和读取文件等. IO 分类 传统的 IO ...
- sass css样式:@for循环、样式变量与#{} 变量插值
/* sass 可以用写JS的思想来写CSS代码 * #{} 用来插值,大括号中填写需要插入的变量 * @for 变量 from ...
- mint ui的tabBar监听路由变化实现tabBar切换
说明 最近学习vue,使用了mint ui的tabBar,感觉好难受,结合 tab-container使用更难受,因为它不是根据路由来切换页面的.mui与它基本相反,因此它能根据搜索栏的路由变化,相应 ...