寻找包裹轮廓的最小正矩形: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 寻找包裹轮廓的最小正矩形、最小斜矩形的更多相关文章

  1. opencv —— minEnclosingCircle、fitEllipse 寻找包裹轮廓的最小圆、点集拟合椭圆

    寻找包裹轮廓的最小圆:minEnclosingCircle 函数 返回圆应满足:① 轮廓上的点均在圆形空间内.② 没有面积更小的满足条件的圆. void minEnclosingCircle(Inpu ...

  2. opencv的实用研究--分析轮廓并寻找边界点

    opencv的实用研究--分析轮廓并寻找边界点 ​      轮廓是图像处理中非常常见的.对现实中的图像进行采样.色彩变化.灰度变化之后,能够处理得到的是“轮廓”.它直接地反应你了需要分析对象的边界特 ...

  3. OpenCV学习代码记录—— Snake轮廓

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  4. POJ3308 Paratroopers(最小割/二分图最小点权覆盖)

    把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...

  5. 51nod 1065 最小正子段和

    题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...

  6. BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan

    BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤ ...

  7. exgcd求解同余方程的最小正整数解 poj1061 poj2115

    这两题都是求解同余方程,并要求出最小正整数解的 对于给定的Ax=B(mod C) 要求x的最小正整数解 首先这个式子可转化为 Ax+Cy=B,那么先用exgcd求出Ax+Cy=gcd(A,C)的解x ...

  8. [学习笔记]最小割之最小点权覆盖&&最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  9. 树形DP求树的最小支配集,最小点覆盖,最大独立集

    一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合时此点还需要被覆盖,被覆盖也有两种状态,即被子节点覆盖或者被父节点覆盖.总结起来就是三种状态,现对 ...

随机推荐

  1. ios--->const 用法总结

    const 用法总结 宏.变量.常量区分 宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化.只保存一份到 .rodata 段.甚至有相同后缀的字符串也可以 ...

  2. Hyper-V虚拟机设置外部网络访问

    在Hyper-V管理器中新建一个虚拟交换机,类型为 内部 ,修改名称为 nat 在虚拟机的设置页面中,将网络适配器设置为新建的虚拟交换机 nat 打开win10->控制面板->网络和共享中 ...

  3. springboot mybatis 多数据源配置支持切换以及一些坑

    一 添加每个数据源的config配置,单个直接默认,多个需要显示写出来 @Configuration @MapperScan(basePackages ="com.zhuzher.*.map ...

  4. Idea-LifecycleException when deploying

    案例 今天第一次用idea构建项目,出现了如下问题: FAIL - Application at context path /myWebApp could not be started FAIL - ...

  5. HTML5的web 存储localStorage、sessionStorage

    说明 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,HTML5规范提出了相关解决方案.我们可以使用localStorage ...

  6. 【原创】在 ASP.NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息

    下面在 Web 空应用里展示一个简单的例子来实现发送文本消息. 本文目录: 创建 Web 空应用 命令行方式创建 添加SDK引用 命令行方式 进入项目目录 添加包引用 配置和使用SDK 添加appse ...

  7. 三、通过 FactoryBean 来配置bean

    一般情况下,Spring 通过反射机制利用 <bean> 的 class 属性指定实现类实例化 Bean ,在某些情况下,实例化 Bean 过程比较复杂,如果按照传统的方式,则需要在 &l ...

  8. 浅谈C语言的数据存储(一)

    作者:冯老师,华清远见嵌入式学院讲师. 程序由指令和数据组成,C语言程序亦是如此.开发者在编写程序的时候往往需要根据不同数据的特点以及程序需求来选择不同的数据存储方式,那么在C语言中数据的存储分为哪些 ...

  9. Kittenblock画笔基础,移动留下痕迹的蝴蝶,图形化编程经验分享

    Kittenblock画笔基础,移动留下痕迹的蝴蝶,图形化编程经验分享 跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关 ...

  10. 基于 Google-S2 的地理相册服务实现及应用

    马蜂窝技术原创内容,更多干货请关注公众号:mfwtech 随着智能手机存储容量的增大,以及相册备份技术的普及,我们可以随时随地用手机影像记录生活,在手机中存储几千张甚至上万张照片已经是很常见的事情.但 ...