OpenCV里通常定义一个矩形有两种方式,一种是通过矩形左上角和矩形宽高来定义:

Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height)

另一种是通过矩形左上角点坐标和右下角点坐标来定义:

Rect_ (const Point_< _Tp > &pt1, const Point_< _Tp > &pt2)

Rect类常用的成员函数有:

area(),返回Rect的面积;size(),返回Rect的长宽;tl(),返回左上角坐标;br(),返回右下角坐标;width,返回矩形宽度;height,返回矩形高度。

另外,还有几个很方便的用法,比如:

  • rect = rect ± point (shifting a rectangle by a certain offset)
  • rect = rect ± size (expanding or shrinking a rectangle by a certain amount)
  • rect = rect1 & rect2 (rectangles intersection)
  • rect = rect1 | rect2 (union of rectangles)

因为求矩形交集和并集在我自己的工程里用的比较多,所以就拿这两个来做个示例:

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace std;
using namespace cv;int main()
{Mat img = imread("dog.jpg");cout << "img.size() = " << img.cols << "  " << img.rows << endl;Rect rect1(100,100,200,200);  //使用左上角顶点坐标和矩形宽高定义矩形Rect rect2(150,150,300,400);Rect rect3(Point(200,200), Point(400,500));     //使用左上角顶点坐标和右下角顶点坐标来定义矩形Rect rect4(Point(600,600), Point(900,900));      cout << "rect4.width = " << rect4.width << ", rect4.height = " << rect4.height << endl;    //注意width和height后面不带括号  cout << "rect1.tl() = " << rect1.tl() << ", rect1.br() = " << rect4.br() << endl;   // 输出左上角和右下角坐标//绘制rect1 ~ rect4rectangle(img, rect1, Scalar(255,0,0), 2);putText(img, "rect1", Point(100,100), FONT_HERSHEY_PLAIN, 1, Scalar(255, 0,0));rectangle(img, rect2, Scalar(0,255,0), 2);putText(img, "rect2", Point(150,150), FONT_HERSHEY_PLAIN, 1, Scalar(0, 255,0));rectangle(img, rect3, Scalar(0,0,255), 2);putText(img, "rect3", Point(200,200), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255));rectangle(img, rect4, Scalar(0,255,255), 2);putText(img, "rect4", Point(600,600), FONT_HERSHEY_PLAIN, 1, Scalar(0, 255,255));imwrite("rectangles.bmp", img);Rect rect1v2 = rect1 & rect2;  //两相交矩形的交集Rect rect1or3 = rect1 | rect3;  //两相交矩形的并集Rect rect1or4 = rect1 | rect4;  //两不相交矩形的并集Rect rect4Resize = rect4 + Size(100,100);   //将矩形rect4的宽高分别扩展100cout << "rect4Resize.width = " << rect4Resize.width << ", rect4Resize.height = " << rect4Resize.height << endl;rectangle(img, rect1v2, Scalar(0), 4);putText(img, "rect1v2", Point(150+50,150), FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0));rectangle(img, rect1or3, Scalar(255,255,255), 4);putText(img,"rect1or3", Point(100+50, 100), FONT_HERSHEY_COMPLEX, 1, Scalar(255,255,255));rectangle(img, rect1or4, Scalar(255,255,255), 4);putText(img,"rect1or4", Point(100+300, 100), FONT_HERSHEY_COMPLEX, 1, Scalar(255,255,255));rectangle(img, rect4Resize, Scalar(255,255,0), 4);putText(img,"rect4Resize", Point(600+50, 600), FONT_HERSHEY_COMPLEX, 1, Scalar(255,255,0));imwrite("rect_calc.bmp", img);imshow("img", img);waitKey(0);
}

编译:
g++ -std=c++11 test_rect.cpp -o test_rect `pkg-config --cflags --libs opencv`

运行结果:

最初的四个矩形:

求并集、交集和resize之后:

OpenCV里的常用Rect用法相关推荐

  1. python【Opencv计算机视觉库】opencv模块cv2常用函数用法(全)

    文章目录 CV2实践所用到的图片 1.简单读写 2.图片翻转 3.色彩变换 4.给图片加文本 5.绘图 6.图像的表示 CV2实践所用到的图片 bug.png 1.简单读写 import cv2# 读 ...

  2. python中rect用法_【opencv基础】Rect类的神奇用法

    前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...

  3. python Pool常用函数用法总结

    在本篇内容里小编给大家整理的是一篇关于python Pool常用函数用法总结内容,有需要的朋友们可以学习下. 1.说明 apply_async(func[,args[,kwds]):使用非堵塞调用fu ...

  4. C++string类常用函数 c++中的string常用函数用法总结

    string类的构造函数: string(const char *s);    //用c字符串s初始化 string(int n,char c);     //用n个字符c初始化 此外,string类 ...

  5. [转]jQuery的each方法的几种常用的用法

    下面提一下jQuery的each方法的几种常用的用法 复制代码 代码如下:  var arr = [ "one", "two", "three&quo ...

  6. 在OpenCV里用drawContours画轮廓

    在OpenCV里,找到物体的轮廓是最常用的功能,为什么这样说呢?因为太多的应用要使用这个功能了,比如数物体的个数,在种子实验室里常常要使用计算种子的个数,这时就需要拍照种子的照片,然后根据照片来数出种 ...

  7. 汉语中常用标点符号用法

    在项目的开发管理过程,书写文档是不可以避免的事情.正确的使用标点符号能够正确表达自己的意思,也方便别人理解自己书写的文档. 常用标点符号用法简表 一.基本定义 句子,前后都有停顿,并带有一定的句调,表 ...

  8. RectF Rect用法

    RectF Rect用法 一.Canvas类android.graphics.Canvas Canvas类好比手机中的画纸,我们可以在Canvas上画图形或者图像.一般我们用android来绘画的时候 ...

  9. sqlite3里类似top的用法

    sqlite3里类似top的用法 在sqlserver中使用top是很正常的,类似这样的语句: SELECT TOP 10 * FROM [index] ORDER BY id DESC; 但是很不幸 ...

最新文章

  1. vb matlab 比较,【笔记】VB.NET和MATLAB读取二进制文件(中文+数值)之比较
  2. java异常及日志注意事项
  3. ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...
  4. 利用 Arthas 解决启动 HDFS StandbyNameNode 加载 EditLog 慢的问题
  5. 判断dialog是否显示_如何成为一流的仪表维修工之液位测量仪表故障检查判断思路...
  6. PHP 如何准确取得服务器地址IP[非代理]
  7. Dell poweredge r210进BIOS修改磁盘控制器(SATA Controller)接口模式
  8. 这九张动态图诠释什么是自然与科技的完美结合
  9. BugkuCTF-MISC题三色绘恋
  10. 如何:将项添加到缓存中
  11. (转)gcc 的简单使用说明
  12. Vue 集成 PDF.js 实现 PDF 预览和添加水印
  13. javascript清理IE内存
  14. unity 神笔画画
  15. 滤波反投影重建算法(FBP)实现及应用(matlab)
  16. 2019年安徽省大学生网络攻防赛赛前培训——Day1
  17. java使用三目运算符来判断成绩
  18. SQL Server修改表结构,表和列名加注释说明
  19. linux发邮件到126,使用126邮箱发送邮件的python脚本
  20. 出现Unexpected token u in JSON at position 0 报错原因及解决方案

热门文章

  1. K3s - 安装部署
  2. keil5的暗色配色方案
  3. 在linux文件下执行.kjb文件和trans文件
  4. Unity3d设置鼠标指针的样式
  5. 阿里范皓宇:互联网汽车会为汽车行业带来全新的用户价值
  6. 高性能网站架构之缓存篇—Redis集群搭建
  7. BK7256,上海博通Wi-Fi6SOC芯片,高度集成-支持100w像素,详细资料
  8. RandomAccess接口使用
  9. x在计算机中是哪个按键,电脑键盘x号怎么打出来
  10. win7 台式电脑怎么调节屏幕亮度