OpenCV 学习笔记

  • day14 图像几何形状绘制
    • 数据类型
      • rect类
      • RotatedRect 类
    • 函数
      • rectangle()绘制矩形
      • circle() 绘制圆形函数
      • line()画线函数
      • ellipse() 函数
    • 代码

day14 图像几何形状绘制

用rectangle函数直接在图像上绘制一个矩形框或者先用rect函数先绘制一个矩形框再用rectangle标记在图像上,rectangle通常用在图片的标记上

数据类型

rect类

用来绘制矩形
Rect(int x, int y, int width, int height)
Rect(矩形左上角 x 坐标,矩形左上角 y 坐标,矩形的宽,矩形的高)
rect类详解–rect类详解
例1

Rect rect;
rect.x = 200;
rect.y = 180;
rect.width = 150;
rect.height = 150;
//Rect(int x, int y, int width, int height),
//Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)

RotatedRect 类

RotatedRect是一个存储旋转矩形的类
类型中的成员:
RotatedRect该类表示平面上的旋转矩形(外接矩阵)
包含以下三部分:

椭圆外接最小矩形中心点(质心)-center
边长(长和宽)-height,width
旋转角度-angle

//定义
class CV_EXPORTS RotatedRect
{public://构造函数RotatedRect();RotatedRect(const Point2f& center, const Size2f& size, float angle);RotatedRect(const CvBox2D& box);void points(Point2f pts[]) const;//!返回矩形的4个顶点Rect boundingRect() const; //返回包含旋转矩形的最小矩形operator CvBox2D() const;    //!转换到旧式的cvbox2d结构Point2f center; //矩形的质心Size2f size;   //矩形的边长float angle;  //旋转角度,当角度为0、90、180、270等时,矩形就成了一个直立的矩形
};


转自另一个博主的详解– RotatedRect类 详解

例2

//绘制椭圆
RotatedRect rrt;//绘制椭圆
rrt.center = Point(100, 100); //矩形中心点(质心)
rrt.size = Size(100,150);//边长(长和宽)
rrt.angle = 90.0; //旋转角度
ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上

函数

  1. rectangle()绘制矩形

rectangle函数是用来绘制一个矩形框的,通常用在图片的标记上

//定义1
CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
参数 说明
img Mat类型 输入输出图像
rec Rect类型 绘制好的矩形框(左上角坐标和长宽已确定)
color 用Scalar函数绘制颜色
thickness 矩形框填充方式 thickness>0为矩形框, thickness<0为填充 默认为1
lineType 矩形框的线条类型 默认为8
shift 点坐标小数数位 默认为0

将绘制好的矩形框rec放置在输出图像img中

例3
将左上角坐标为(400,200),长宽为150*150的矩形框放置在图像image中

Rect rect;//Rect(int x, int y, int width, int height),Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)
rect.x = 400;
rect.y = 280;
rect.width = 150;
rect.height = 150;
rectangle(image,rect,Scalar(0,255,255),1,8,0);//在image上绘制一个左上坐标为(200,200),100*100的矩形框
//rectangle(输入输出图像,绘制矩形,颜色,填充方式(>0为矩形框,<0为填充),线条规格,点坐标小数数位

//定义2
CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
参数 说明
img Mat类型 输入输出图像
pt1 左上顶点坐标
pt2 右下点坐标 (左上角坐标和长宽要在ptr中决定)
color 用Scalar函数绘制颜色
thickness 矩形框填充方式 thickness>0为矩形框, thickness<0为填充 默认为1
lineType 矩形框的线条类型 默认为8
shift 点坐标小数数位 默认为0

例4

Point left,right;//左上和右下的坐标点
left.x = 200;
left.y = 200;
right.x = 350;
right.y = 350;
rectangle(image,left,right,Scalar(0,255,255),-1,8,0);
//thickness==-1 为填充
  1. circle() 绘制圆形函数

//定义
CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
参数 说明
img Mat类型 输入输出图像
center 画圆的圆心坐标
radius 圆的半径
color 用Scalar函数绘制圆颜色
thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType 线条类型 默认为8
shift 圆心坐标点和半径值的小数点位数

例5

circle(image,Point(100,100),15,Scalar(0,0,255),2,8,0);
//圆心坐标为(100,100)
//半径为15
//颜色(0,0,255)
//线条粗细程度为2
  1. line()画线函数

//定义
CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
参数 说明
img Mat类型 输入输出图像
ptr1 point类型 线段起点
ptr2 point类型 线段终点
color 用Scalar函数绘制圆颜色
thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType 线条类型 默认为8
shift 坐标点的小数点位数

例6

//绘制线条
line(bg,point(150,150),point(370,370),scalar(0,255,0),2,8,0);
  1. ellipse() 函数

定义1
用椭圆外接矩形参数绘制椭圆

CV_EXPORTS_W void ellipse(InputOutputArray img, const RotatedRect& box, const Scalar& color,int thickness = 1, int lineType = LINE_8);
参数 说明
img Mat类型 输入输出图像
box RotatedRect类型 旋转好的外接矩阵内嵌椭圆(包括外接矩形的中心,变长和旋转角度)
color 用Scalar函数绘制圆颜色
thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
lineType 线条类型 默认为8

例7

 RotatedRect rrt;//绘制椭圆rrt.center = Point(100, 100); //矩形中心点(质心)rrt.size = Size(100,150);//边长(长和宽)rrt.angle = 90.0; //旋转角度ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上

定义2 直接用函数带参数绘制椭圆

CV_EXPORTS_W void ellipse(InputOutputArray img, Point center, Size axes,double angle, double startAngle, double endAngle,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
参数 说明
img Mat类型 输入输出图像
center point类型 椭圆中心坐标
axes Size类型 椭圆的边长(注意有两个参数)
angle 椭圆旋转角度(短轴相当于x轴的角度,具体看以下画椭圆实例)
color 用Scalar函数绘制圆颜色
thickness 线条的粗细程度
lineType 线条类型 默认为8
shift 坐标点和边长的小数点位数

例8

ellipse(bg, Point(220, 220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);

代码

quickopencv.h

#pragma once#include <opencv2\highgui.hpp>#include <opencv2\imgproc.hpp>using namespace cv;
//定义类
class QuickDemo{public:void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27void pixel_vist_Demo(Mat &image);//图像像素的读写操作2022-1-3void operators_demo(Mat &image);//图像像素的算数操作2022-1-4void tracking_bar_demo(Mat &image);//滚动条操作演示2022-1-7void key_demo(Mat &image);//键盘响应操作2022-1-12void color_style_demo(Mat &image);//OpenCV自带颜色表操作2022-1-12void bitwise_demo(Mat &image);//位操作(逻辑操作)2022-1-17void channels_demo(Mat &image);//通道分离与合并2022-1-17void inrange_demo(Mat &image);//roi区域提取 2022-1-20void pixel_statistic_demo(Mat &image);//像素值统计2022-1-21void drawing_demo(Mat &image);//图像几何形状绘制 2022-2-8};

QuickDemo.cpp

#include <opencv2\highgui.hpp>#include <opencv2\imgproc.hpp>#include<quickopencv.h>#include <iostream>
void QuickDemo::drawing_demo(Mat &image)
{Rect rect;//Rect(int x, int y, int width, int height),Rect(左上角 x 坐标,左上角 y 坐标,矩形的宽,矩形的高)rect.x = 200;rect.y = 180;rect.width = 150;rect.height = 150;Point left,right;left.x = 150;left.y = 150;right.x = 370;right.y = 370;//rectangle(image,rect,Scalar(0,255,255),1,8,0);//在image上绘制一个左上坐标为(200,200),100*100的矩形框//rectangle(输入输出图像,绘制矩形,颜色,填充方式(>0为矩形框,<0为填充),线条规格,点坐标小数数位)--显示效果1//rectangle(image,left,right,Scalar(0,255,255),-1,8,0);//填充-显示效果2//imshow("绘制演示", image);//画圆Mat bg = Mat::zeros(image.size(), image.type());//circle(bg,Point(100,100),15,Scalar(0,0,255),2,8,0);//LINE_AA反锯齿 ---显示效果3//imshow("画圆", bg);//填充的矩形框框选人脸//rectangle(bg, left, right, Scalar(0, 0, 255), -1, 8, 0);//Mat dst;//addWeighted(image,0.7, bg, 1, 0, dst); /*void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype = -1); dst = src1*alpha + src2*beta + gamma; *///---显示效果4//imshow("填充的矩形框框选人脸",dst);//绘制线条//line(bg,point(150,150),point(370,370),scalar(0,255,0),2,8,0);//addweighted(image,0.7,bg,1,0,dst);//将绘制的线条绘制在图像上//imshow("线条",dst);//---显示效果5//绘制椭圆RotatedRect rrt;//绘制椭圆rrt.center = Point(100, 100); //矩形中心点(质心)rrt.size = Size(100,150);//边长(长和宽)rrt.angle = 90.0; //旋转角度ellipse(bg, rrt, Scalar(0, 0, 255), 2, LINE_AA);//将绘制的椭圆绘制在图像上//imshow("绘制椭圆",bg);//---显示效果6ellipse(bg, Point(220, 220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);imshow("绘制椭圆2", bg);
}
#include <iostream>
//#include "opencv2\core.hpp"
//#include <opencv2\opencv.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>using namespace cv;
using namespace std;int main()
{Mat scr = imread("D:\\学习\\OpenCV学习\\pictures\\image\\2.webp");//打开一张图if (!scr.data == 1)//判空return -1;namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口imshow("窗口1",scr);//在创建的窗口显示QuickDemo qd;qd.drawing_demo(scr);waitKey(0);return 0;
}

显示效果1 矩形框显示

显示效果2 填充

显示效果3 画圆

画圆 去锯齿

显示效果4 填充的矩形框框选人脸

显示效果5 画线条 将绘制的线条绘制在图像上

显示效果6 画椭圆
旋转角度为0.0

旋转角度为10.0

旋转角度为45.0

旋转角度为 90.0

显示效果7 绘制圆弧
中心坐标(220,220),
轴长50,30 ,
偏转角度为0,
起始角角度为0,
终止角度为360
ellipse(bg,Point(220,220),Size(50,30),0,0,360,Scalar(0,0,255),2,8,0);

OpenCV 学习笔记-day14 图像几何形状绘制 (rect类 RotatedRect 类,rectangle绘制矩形 circle绘制圆形函数 line画线函数 ellipse画椭圆函数)相关推荐

  1. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  2. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  3. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  4. OpenCV学习笔记02--图像像素处理--二值图像、灰度图像、彩色图像像素的处理、numpy.array中的对应的函数

    目录 (一)灰度图像像素处理 (二)彩色图像像素处理 (三)numpy.array库在图像处理中的应用 (四)查看图像的属性信息 接着笔记01继续总结,当我们读取一幅图像的时候,一般为二值图像.灰度图 ...

  5. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  6. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  7. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

  8. opencv学习笔记之图像尺寸、翻转与仿射变换

    文章目录 前言 一.图像尺寸变换 二.图像翻转变换 三.图像仿射变换 getRotationMatrix2D()函数用于计算旋转矩阵 getAffineTransform()函数 warpAffine ...

  9. OpenCV学习笔记五-图像混合

    将两张图片混合 P6 图像混合 #include<iostream> #include<opencv2/opencv.hpp>using namespace std; usin ...

  10. Opencv学习笔记四——图像形态学操作

    需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...

最新文章

  1. 《使女的故事》大火,AI是背后最大推手?
  2. 算法设计与分析 Fibonacci数列问题的词典法(动态规划:词典)
  3. 13个对Android开发者有帮助的工具和资源(转自android吧(www.and8.com))
  4. 一个秒杀系统的设计思考
  5. 项目实战大全,提升经验的最好办法(一)
  6. AI 工程师:他们是做什么的,以及他们值多少钱?
  7. Redis持久化-RDB
  8. open cv+C++错误及经验总结(三)
  9. 现场操作前,软件界面的各个功能面板应该通过拖动进行合理布局.请看参考图
  10. 使用ConcurrentDictionary实现轻量缓存
  11. CQOI2015 解题报告
  12. Altium Designer20下绘制封装、布局、布线及裁板等操作
  13. 用谷歌浏览器如何下载哔哩哔哩中的视频
  14. react-ssr之路由配置
  15. 论治理与创新,2022 开放原子全球开源峰会 OpenAnolis 分论坛圆满落幕
  16. Python大作业-爬取成都链家租房信息(大作业)源码
  17. 海外媒体传播必做的三大社交媒体平台
  18. 【渝粤教育】广东开放大学 普通心理学 形成性考核 (30)
  19. 从图像中提取特定颜色区域。
  20. 小米手机运行linux,小米6成功刷入UOS国产操作系统,可开机运行

热门文章

  1. Ps修改更换证件照背景色(底色颜色)
  2. OpenStack 从ISO启动并安装VM
  3. 自己来制作iso镜像用于安装OpenBSD
  4. 递归函数python有什么特点_递的笔顺 笔画数:10 拼音:dì 部首:辶 - 智慧山
  5. 从转行到入行(27岁跨行+跨专业+培训机构)
  6. html+css仿写小米商城
  7. 硬盘录播服务器,高清录播主机录播服务器HT-7500_航天广电录播系统设备
  8. 医学知识-骨密度以及骨密度测量
  9. linux 下svn: E175002: 方法 REPORT 失败于 “/svn/GameSvn/!svn/me”: 不能读块分割符: 安全连接切断 (https://192.168.0.88)
  10. c#删除sheet_C#中实现插入、删除Excel分页符的方法