rectangle函数使用

  • rect类
    • Rect对象的定义:
  • rectangle函数
    • 连续绘制多个矩形

rect类

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_中被指定为整型;
  • 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

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);

rectangle函数

void rectangle(InputOutputArray img, Point pt1, Point pt2,const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);

简介:使用对角线的两点pt1,pt2画一个矩形轮廓或者填充矩形

@param img Image.
@param pt1 Vertex of the rectangle.
@param pt2 Vertex of the rectangle opposite to pt1 .
@param color Rectangle color or brightness (grayscale image).color 线条颜色 (RGB) 或亮度(灰度图像 )
@param thickness Thickness of lines that make up the rectangle. Negative values, like CV_FILLED ,
mean that the function has to draw a filled rectangle.thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形
@param lineType Type of the line.

连续绘制多个矩形


#include <iostream>
#include <opencv2/opencv.hpp>#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"//连续画矩形框
using namespace cv;
using namespace std;
//去掉以上两行代码注释之后就可以不用在下面的代码中加上cv::和std::
//cv::为OpenCV的函数库
//std::为C++的标准函数库void OnMouseAction(int event, int x, int y, int flags, void *ustc);  //鼠标回调事件函数
Rect rect,temp;
Mat src, src1;void draw_rec(Mat str, Mat src1);
void draw_rec1(Mat str, Mat src1);
int static times; //记录调用次数
int DrawRect();
int rec_num;int main(int argc, char*argv[])
{//以下的方法如果想运行,直接把前头的注释去掉即可//运行代码的时候请改掉filename里的地址//我的opencv是安装在C盘目录下//一些目录地址请自行修改一下//DrawRect(); //在图像上画四边形const char* filename = "E:\\projects\\darknet-master\\build\\darknet\\x64\\data\\voc\\VOCdevkit\\VOC2007\\JPEGImages\\img1.bmp";src = imread(filename);imshow("title", src);rec_num = 0;setMouseCallback("title", OnMouseAction, 0);waitKey(0);return 0;
}
//*******************************************************************//
//鼠标回调函数void OnMouseAction(int event, int x, int y, int flags, void *ustc)
{times++;switch (event){//左键按下事件case EVENT_LBUTTONDOWN://左键按下 定义起始点rect.x = x;rect.y = y;rect.width = 1;rect.height = 1;cout << "触发左键按下坐标为" << x << "," << y << endl;break;//鼠标移动事件case CV_EVENT_MOUSEMOVE://当左键按下时根据左键起始点绘制生成的矩形if (flags&EVENT_FLAG_LBUTTON){rect = Rect(Point(rect.x, rect.y), Point(x, y));draw_rec1(src,src1);   //鼠标移动过程中显示移动轨迹}break;//左键松开事件case CV_EVENT_LBUTTONUP:if (rect.width > 1 && rect.height > 1){draw_rec(src,src1);rec_num++;}cout << "触发左键松开坐标为" << x << "," << y << endl;cout << "选中区域个数为" << rec_num << endl;default:break;}//cout << "第 " << times << " 次回调鼠标事件" << endl;//if (event == CV_EVENT_MOUSEMOVE)//{//    cout << "触发鼠标移动事件" << endl;//}//if (event == CV_EVENT_LBUTTONDOWN)//{// cout << "触发左键按下事件" << endl;//}//if (event == CV_EVENT_LBUTTONUP)//{//   cout << "触发左键抬起事件" << endl;//}//if (event == CV_EVENT_RBUTTONDOWN)//{// cout << "触发右键按下事件" << endl;// DrawRect(); //在图像上画四边形//}//if (event == CV_EVENT_RBUTTONUP)//{//  cout << "触发右键抬起事件" << endl;//}//if (event == CV_EVENT_LBUTTONDBLCLK)//{//   cout << "触发左键双击事件" << endl;//}//if (event == CV_EVENT_RBUTTONDBLCLK)//{//   cout << "触发右键双击事件" << endl;//}
}void draw_rec(Mat src, Mat src1)
{src.copyTo(src1);rectangle(src1, rect, Scalar(0, 0, 255));src1.copyTo(src);imshow("title", src1);}void draw_rec1(Mat src, Mat src1)
{src.copyTo(src1);rectangle(src1, rect, Scalar(0, 0, 255));imshow("title", src1);}int DrawRect() {const char* filename = "E:\\projects\\darknet-master\\build\\darknet\\x64\\data\\voc\\VOCdevkit\\VOC2007\\JPEGImages\\img1.bmp";cv::Mat mat = cv::imread(filename);if (mat.empty()) {throw("Faild open file.");}cv::Point p0 = cv::Point(mat.cols / 8, mat.rows / 8);cv::Point p1 = cv::Point(mat.cols * 7 / 8, mat.rows * 7 / 8);//设定点的起始和终止坐标rectangle(mat, p0, p1, cv::Scalar(0, 255, 0), 5, 8);//画四边形的函数//第一个参数为画图的目标图像//第二个参数为画图的起始坐标//第三个参数为画图的终止坐标//第四个参数为画图的颜色cv::Point p2 = cv::Point(mat.cols * 2 / 8, mat.rows * 2 / 8);cv::Point p3 = cv::Point(mat.cols * 6 / 8, mat.rows * 6 / 8);rectangle(mat, p2, p3, cv::Scalar(0, 255, 255), 2, 4);cv::imshow("mat", mat);//cv::imwrite("C:\\Code\\FirstOpenCVProgramming\\DrawRect.jpg", mat);cv::waitKey();return 0;
}

openCV实战(一):rectangle函数使用相关推荐

  1. OpenCV——解决使用rectangle()函数时出现“TypeError: function takes exactly 4 arguments (2 given)”错误

    1 问题描述 今天在使用cv.rectangle()函数时,出现了这样的报错: TypeError: function takes exactly 4 arguments (2 given) 源代码我 ...

  2. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  3. OpenCV的Rect()函数、Rectangle()函数、matchTemplate()参数详解

    OpenCV的函数 Rect()函数 cvRectangle与cv::rectangle matchTemplate() 归一化函数normalize() Rect()函数 基本概念: Rect(in ...

  4. OpenCV这么简单为啥不学——1.4、基础标识绘制(绘制线line函数、rectangle函数绘制四边形、circle函数绘制圆形、putText函数绘制文字、putText绘制中文文字)

    OpenCV这么简单为啥不学--1.4.基础标识绘制(绘制线line函数.rectangle函数绘制四边形.circle函数绘制圆形.putText函数绘制文字.putText绘制中文文字) 目录 O ...

  5. 基于opencv实战眼睛控制鼠标

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方 ...

  6. 【OpenCV实战】OpenCV实现人脸检测详解(含代码)

    OpenCV中有许多可以进行人脸.人眼检测的特征文件,今天我们利用OpenCV中自带的特征文件haarcascade_frontalface_default.xml来进行人脸检测. [OpenCV实战 ...

  7. OpenCV实战系列:高通滤波器及其应用

    OpenCV实战系列:高通滤波器及其应用 0. 前言 1. 检测图像边缘 1.2 Sobel 滤波器 1.2 梯度算子 1.3 高斯导数 2. 图像拉普拉斯算子 2.1 拉普拉斯算子 2.2 使用拉普 ...

  8. OpenCV实战(1)——OpenCV与图像处理基础

    OpenCV实战(1)--OpenCV与图像处理基础 0. 前言 1. OpenCV 基础 1.1 安装 OpenCV 1.2 OpenCV 主要模块 1.3 使用 Qt 进行 OpenCV 开发 2 ...

  9. 基于OpenCV实战:3步实现图像降噪

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在本文中,我们将展示如何通过三个简单的步骤来实现降噪.我们将使用机 ...

最新文章

  1. Sprinig泛型依赖注入
  2. Hive 2.3.2 Installation Guide
  3. 一种基于游戏引擎的AR模式探讨(下)
  4. Linux 服务器注意事项
  5. MAC电脑使用vue-cli脚手架搭建vue项目;mac使用脚手架vue-cli搭建vue项目
  6. Vue + Spring Boot 项目实战(二):使用 CLI 搭建 Vue.js 项目
  7. NYOJ 擅长排列的小明 II---Problem B
  8. matlab randi 函数,MATLAB中的randi函数
  9. 安装nokogiri前提
  10. java语言采用16位颜色标准_华为Java笔试题一
  11. 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)
  12. 采用new分配内存失败时为什么会出现两种错误报告方式?
  13. java 网页转pdf_JAVA中将html转换成pdf
  14. BoundsChecker安装下载及使用教程攻略
  15. Web Polygraph 安装
  16. 有趣的深度学习——使用 BERT 实现一个古体诗生成器
  17. 用计算机求算术平方根,6.1用计算机计算算术平方根.ppt
  18. 写日报、写日报,每天都要写,写工作日报到底有什么意义?
  19. mendeley引用参考文献不显示_ubuntu下使用mendeley插入参考文献
  20. 【C语言你真的学会了吗】C语言深度剖析(1)【关键字深度剖析】

热门文章

  1. 第六届蓝桥杯省赛javaB组真题及答案
  2. Tomcat配置问题解决方法
  3. struts.xml配置文件(二)
  4. javascript的window.open()详解
  5. cropbox php,jQuery用户头像裁剪插件cropbox.js实例分享
  6. (Mybaitis)分页
  7. 三角形最小路径和(动态规划)
  8. Spring Cloud(六) 服务网关GateWay 入门
  9. Gentoo 安装日记 08 (安装stage3: 设置时区 和 Hostname)
  10. max格式转obj小工具_PDF文件转JPG等图片格式的小工具