OpenCV的Rect矩形类用法

摘自 https://blog.csdn.net/kh1445291129/article/details/51149849

//如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:

rect.area();     //返回rect的面积 5000

rect.size();     //返回rect的尺寸 [50 × 100]

rect.tl();       //返回rect的左上顶点的坐标 [100, 50]

rect.br();       //返回rect的右下顶点的坐标 [150, 150]

rect.width();    //返回rect的宽度 50

rect.height();   //返回rect的高度 100

rect.contains(Point(x, y));  //返回布尔变量,判断rect是否包含Point(x, y)点

//还可以求两个矩形的交集和并集

rect = rect1 & rect2;

rect = rect1 | rect2;

//还可以对矩形进行平移和缩放

rect = rect + Point(-100, 100);    //平移,也就是左上顶点的x坐标-100,y坐标+100

rect = rect + Size(-100, 100);    //缩放,左上顶点不变,宽度-100,高度+100

//还可以对矩形进行对比,返回布尔变量

rect1 == rect2;

rect1 != rect2;

//OpenCV里貌似没有判断rect1是否在rect2里面的功能,所以自己写一个吧

bool isInside(Rect rect1, Rect rect2)

{

return (rect1 == (rect1&rect2));

}

//OpenCV貌似也没有获取矩形中心点的功能,还是自己写一个

Point getCenterPoint(Rect rect)

{

Point cpt;

cpt.x = rect.x + cvRound(rect.width/2.0);

cpt.y = rect.y + cvRound(rect.height/2.0);

return cpt;

}

//围绕矩形中心缩放

Rect rectCenterScale(Rect rect, Size size)

{

rect = rect + size;

Point pt;

pt.x = cvRound(size.width/2.0);

pt.y = cvRound(size.height/2.0);

return (rect-pt);

}

Opencv 使用Rect选取与设置窗口ROI

文章链接: http://blog.csdn.net/yhl_leo/article/details/50593825

首先看一下Rect对象的定义:

typedef Rect_<int> Rect;

再看Rect_的定义:

/*!The 2D up-right rectangle classThe class represents a 2D rectangle with coordinates of the specified data type.Normally, cv::Rect ~ cv::Rect_<int> is used.
*/
template<typename _Tp> class Rect_
{
public:typedef _Tp value_type;//! various constructorsRect_();Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);Rect_(const Rect_& r);Rect_(const CvRect& r);Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);Rect_& operator = ( const Rect_& r );//! the top-left cornerPoint_<_Tp> tl() const;//! the bottom-right cornerPoint_<_Tp> br() const;//! size (width, height) of the rectangleSize_<_Tp> size() const;//! area (width*height) of the rectangle_Tp area() const;//! conversion to another data typetemplate<typename _Tp2> operator Rect_<_Tp2>() const;//! conversion to the old-style CvRectoperator CvRect() const;//! checks whether the rectangle contains the pointbool contains(const Point_<_Tp>& pt) const;_Tp x, y, width, height; //< the top-left corner, as well as width and height of the rectangle
};

从上面的定义至少可以发现两点:

一,类Rect_的类模板中的数据类型_TpRect_<int>中被指定为整型;

二,从Rect_的构造函数可以看出,其形参列表一共有6种形式:

Rect_(),形参列表为空,即定义一个空窗口(默认值为:x=y=width=height=0);
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height),定义一个左上角点坐标为(_x, _y)的_width*_height矩形窗口;
Rect_(const Rect_& r),使用其他的Rect_对象初始化;
Rect_(const CvRect& r),使用CvRect对象初始化;
Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz),分别将位置坐标(_x, _y)和窗口大小(_width, _height)用Point_和Size_对象初始化;
Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2),分别将坐标位置(_x, _y)和窗口大小(_width, _height)用Point_和Point_对象初始化。

在OpenCV库中,图像像素坐标与所在行列数的对应关系为:x -> col, y -> row, width -> cols, height -> rows

下面给出一段代码,基本可以把Rect的常见用法涵盖:

Mat image = imread("C:\\Users\\Leo\\Desktop\\lena.jpg");
Rect rect1(256, 256, 128, 128);
Rect rect2(224, 224, 128, 128);Mat roi1;
image(rect1).copyTo(roi1); // copy the region rect1 from the image to roi1
imshow("1", roi1);
waitKey(0);Mat roi2;
image(rect2).copyTo(roi2); // copy the region rect2 from the image to roi2
imshow("2", roi2);
waitKey(0);cv::Rect rect3 = rect1&rect2; // intersection of the two sets
Mat roi3;
image(rect3).copyTo(roi3);
imshow("3", roi3);
waitKey(0);Rect rect4 = rect1|rect2; // union of the two sets (the minimum bounding rectangle)
Mat roi4;
image(rect4).copyTo(roi4);
imshow("4", roi4);
waitKey(0);Rect rect5(10, 10, 128, 128);
roi1.copyTo(image(rect5)); // copy the region rect1 to the designated region in the image
imshow("5", image);
waitKey(0);

结果为:

vector<Rect> 使用

vector<vector<Point> >

https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html#bounding-rects-circles

Creating Bounding boxes and circles for contours

Goal

In this tutorial you will learn how to:

  1. Use the OpenCV function boundingRect
  2. Use the OpenCV function minEnclosingCircle

Theory

Code

This tutorial code’s is shown lines below. You can also download it from here

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>using namespace cv;
using namespace std;Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);/// Function header
void thresh_callback(int, void* );/** @function main */
int main( int argc, char** argv )
{/// Load source image and convert it to graysrc = imread( argv[1], 1 );/// Convert image to gray and blur itcvtColor( src, src_gray, CV_BGR2GRAY );blur( src_gray, src_gray, Size(3,3) );/// Create Windowchar* source_window = "Source";namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );thresh_callback( 0, 0 );waitKey(0);return(0);
}/** @function thresh_callback */
void thresh_callback(int, void* )
{Mat threshold_output;vector<vector<Point> > contours;vector<Vec4i> hierarchy;/// Detect edges using Thresholdthreshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );/// Find contoursfindContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );/// Approximate contours to polygons + get bounding rects and circlesvector<vector<Point> > contours_poly( contours.size() );vector<rect> boundRect( contours.size() );vector<Point2f>center( contours.size() );vector<float>radius( contours.size() );for( int i = 0; i < contours.size(); i++ ){ approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );boundRect[i] = boundingRect( Mat(contours_poly[i]) );minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );}/// Draw polygonal contour + bonding rects + circlesMat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );for( int i = 0; i< contours.size(); i++ ){Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );}/// Show in a windownamedWindow( "Contours", CV_WINDOW_AUTOSIZE );imshow( "Contours", drawing );
}

原文地址:https://blog.csdn.net/KYJL888/article/details/82217192

OpenCV的Rect矩形类简介和使用相关推荐

  1. 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类): Rect(矩形) Circle(圆形)Rect类的子类: Square(正方形)不同的子类会有不同的计算周长和面

    设计一个形状类(接口)Shape,方法:求周长和求面积 形状类(接口)的子类(实现类):     Rect(矩形)     Circle(圆形) Rect类的子类:     Square(正方形)   ...

  2. 按要求编写一个Java应用程序:(1)编写一个矩形类Rect,包含:两个属性...2、定义一个接口Shape,包括计算图形面积(getArea)和周长(getcir)...

    1.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含:两个属性:矩形的宽width和高height:一个带有两个参数的构造方法,用于将width和height属性初化:两个方法:求 ...

  3. 绘图用的函数及矩形类CRect和矩形结构RECT

    绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如: void CTestView::OnDraw(CDC* /pDC/) { CTestDoc* pDoc = GetDocu ...

  4. Rect、RectF矩形类

    1:Rect介绍 Rect.RectF都表示矩形类,他由4个坐标(left,top,right,bottom) 来组成一个矩形,在 android中很多地方都用到矩形,用他来确定位置这是android ...

  5. python opencv最小外接矩形_Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  6. java shape 空间操作类_设计三个类:几何形状类(Shape)、圆类(Circle)、矩形类(.,请编写 Java程序,设计一个“形状rdquo...

    问题标题 设计三个类:几何形状类(Shape).圆类(Circle).矩形类(.,请编写 Java程序,设计一个"形状&rdquo 2019-5-10来自ip:17.175.174. ...

  7. CSS clip:rect矩形剪裁功能

    CSS中有一个属性叫做clip,为修剪,剪裁之意.配合其属性关键字rect可以实现元素的矩形裁剪效果.此属性安安稳稳地存在于CSS2.1中,且使用上基本上没有类似于max-height/display ...

  8. CSS clip:rect矩形剪裁功能及一些应用介绍

    CSS clip:rect矩形剪裁功能及一些应用介绍 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  9. 【Qt炫酷动画】0.Qt动画类简介

    动画类继承关系 #mermaid-svg-ghWzAqD79vPW4ai1 {font-family:"trebuchet ms",verdana,arial,sans-serif ...

最新文章

  1. 免费报名 | WPS专家教你文本分类在企业中的应用实践
  2. 计算机语言中索引什么意思,算法索引
  3. redis cli 删除key 模糊_redis 常用函数
  4. [二分查找] 二:二分查找的经典例题
  5. seer文献_文献解读 | 师兄带你读一篇免疫浸润3分文章!
  6. 工作192:vue项目如何刷新当前页面
  7. 斜齿轮受力计算:理论计算virtual.lab motion 仿真
  8. vb教材笔记_VB课堂笔记-----第五章 数据的输入与输出
  9. 浅谈JSONP 的本质工作原理
  10. Java IO流常用操作方法总结
  11. netty权威指南第二版源码
  12. Windows 键盘按键 测试
  13. 【面试题】15.项目相关
  14. 如何在指板上寻找特殊和弦
  15. 自动输入填写qq 旺旺密码
  16. 累死你的不是工作,而是工作方式
  17. AI工具是帮手还是助手:
  18. 极智开发 | ubuntu 安装有线网卡驱动
  19. sso php 实现,Jasny-SSO
  20. mac中没有my.cnf文件 mysql

热门文章

  1. 2021年全球自动浓缩咖啡机行业调研及趋势分析报告
  2. kafka 报错: IllegalArgumentException: Error creating broker listeners from ‘PLAINTEXT:xxx.xxx.xxx.xx
  3. 新一代开源免费的轻量级 SSH 终端,非常炫酷好用
  4. 第50节:初识搜索引擎_上机动手实战多搜索条件组合查询
  5. python小乌龟绘制迷宫_python小乌龟turtle数学作图
  6. 黑鲨helo支持html吗,黑鲨Helo的实用功能有哪些 黑鲨Helo的使用技巧
  7. 中望3D 2021 插入基准面 - 2实体构面法
  8. 在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
  9. 2021-07-15 声音一些基本概念
  10. 前端面试题及答案(字节跳动)(二)