OpenCV的Rect矩形类简介和使用
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_
的类模板中的数据类型_Tp
在Rect_<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:
- Use the OpenCV function boundingRect
- 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矩形类简介和使用相关推荐
- 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类): Rect(矩形) Circle(圆形)Rect类的子类: Square(正方形)不同的子类会有不同的计算周长和面
设计一个形状类(接口)Shape,方法:求周长和求面积 形状类(接口)的子类(实现类): Rect(矩形) Circle(圆形) Rect类的子类: Square(正方形) ...
- 按要求编写一个Java应用程序:(1)编写一个矩形类Rect,包含:两个属性...2、定义一个接口Shape,包括计算图形面积(getArea)和周长(getcir)...
1.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含:两个属性:矩形的宽width和高height:一个带有两个参数的构造方法,用于将width和height属性初化:两个方法:求 ...
- 绘图用的函数及矩形类CRect和矩形结构RECT
绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如: void CTestView::OnDraw(CDC* /pDC/) { CTestDoc* pDoc = GetDocu ...
- Rect、RectF矩形类
1:Rect介绍 Rect.RectF都表示矩形类,他由4个坐标(left,top,right,bottom) 来组成一个矩形,在 android中很多地方都用到矩形,用他来确定位置这是android ...
- python opencv最小外接矩形_Opencv绘制最小外接矩形、最小外接圆
Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...
- java shape 空间操作类_设计三个类:几何形状类(Shape)、圆类(Circle)、矩形类(.,请编写 Java程序,设计一个“形状rdquo...
问题标题 设计三个类:几何形状类(Shape).圆类(Circle).矩形类(.,请编写 Java程序,设计一个"形状&rdquo 2019-5-10来自ip:17.175.174. ...
- CSS clip:rect矩形剪裁功能
CSS中有一个属性叫做clip,为修剪,剪裁之意.配合其属性关键字rect可以实现元素的矩形裁剪效果.此属性安安稳稳地存在于CSS2.1中,且使用上基本上没有类似于max-height/display ...
- CSS clip:rect矩形剪裁功能及一些应用介绍
CSS clip:rect矩形剪裁功能及一些应用介绍 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...
- 【Qt炫酷动画】0.Qt动画类简介
动画类继承关系 #mermaid-svg-ghWzAqD79vPW4ai1 {font-family:"trebuchet ms",verdana,arial,sans-serif ...
最新文章
- 免费报名 | WPS专家教你文本分类在企业中的应用实践
- 计算机语言中索引什么意思,算法索引
- redis cli 删除key 模糊_redis 常用函数
- [二分查找] 二:二分查找的经典例题
- seer文献_文献解读 | 师兄带你读一篇免疫浸润3分文章!
- 工作192:vue项目如何刷新当前页面
- 斜齿轮受力计算:理论计算virtual.lab motion 仿真
- vb教材笔记_VB课堂笔记-----第五章 数据的输入与输出
- 浅谈JSONP 的本质工作原理
- Java IO流常用操作方法总结
- netty权威指南第二版源码
- Windows 键盘按键 测试
- 【面试题】15.项目相关
- 如何在指板上寻找特殊和弦
- 自动输入填写qq 旺旺密码
- 累死你的不是工作,而是工作方式
- AI工具是帮手还是助手:
- 极智开发 | ubuntu 安装有线网卡驱动
- sso php 实现,Jasny-SSO
- mac中没有my.cnf文件 mysql
热门文章
- 2021年全球自动浓缩咖啡机行业调研及趋势分析报告
- kafka 报错: IllegalArgumentException: Error creating broker listeners from ‘PLAINTEXT:xxx.xxx.xxx.xx
- 新一代开源免费的轻量级 SSH 终端,非常炫酷好用
- 第50节:初识搜索引擎_上机动手实战多搜索条件组合查询
- python小乌龟绘制迷宫_python小乌龟turtle数学作图
- 黑鲨helo支持html吗,黑鲨Helo的实用功能有哪些 黑鲨Helo的使用技巧
- 中望3D 2021 插入基准面 - 2实体构面法
- 在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
- 2021-07-15 声音一些基本概念
- 前端面试题及答案(字节跳动)(二)