OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加

  • 一、OpenCV中的绘图函数
    • 1.1 线段绘制
    • 1.2 矩形绘制
    • 1.3 圆绘制
    • 1.4 椭圆的绘制
    • 1.5 多边形绘制
    • 1.6 添加文字

上两次笔记主要知识点回顾:

  • 数字图像基本概念
  • 图像的读取、显示与保存
  • 图像直方图的绘制
  • 图像通道以及通道的分离与合并
  • 颜色空间及其互相转换

以上是图像与OpenCV的基础知识。

###############################################################################
####################################分割线######################################
###############################################################################

这次笔记以及后两次笔记将聚焦于图像的基本操作,包括:

  1. OpenCV中的绘图函数
  2. 图像几何变换
  3. 图像的滤波与增强
  4. 图像形态学的知识

再次给出OpenCV官方给出的python版文档:https://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html

这次笔记所用到的部分文档为:https://docs.opencv.org/4.1.2/dc/da5/tutorial_py_drawing_functions.html

一、OpenCV中的绘图函数

1.1 线段绘制

函数:

img  = cv2.line( img, pt1, pt2, color[, thickness[, lineType[, shift]]] )

参数:

  1. img:待绘制的图像,也称为画板或背景图。
  2. pt1:线段起点的坐标。
  3. pt2:线段终点的坐标。
  4. color:线段的颜色,以元组的形式,如(255,0,0)。
  5. thickness:线条的粗细,默认为1,若为-1则会进行填充(闭合图形)。
  6. lineType:线条类型,有 8型cv2.LINE_AA型,默认为8型,cv2.LINE_AA型因为可以抗锯齿所以更适合画曲线。

看一下例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512,512,3), np.uint8)
cv2.imshow("black", img)
cv2.waitKey(0)
cv2.destroyWindow("black")
# 绘制一条线宽为5的线段,起点为(0,0),终点为(200,500),颜色为红色
cv2.line(img,(0,0),(200,500),(0,0,255),5)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

输出结果为:

注意:OpenCV中默认的色彩空间为BGR,所以color参数为(0,0,255)表示的是红色。

1.2 矩形绘制

函数:

img  =  cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType[, shift]]] )

参数:

  1. pt1:矩形的左上角。
  2. pt2:矩形的右下角。
  3. 其余同上条。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512, 512, 3), np.uint8)# 画一个黄色边框的矩形,参数2:左上角坐标,参数3:右下角坐标
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 255), 1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:

因为矩形是一个闭合的形状,所以我们将 thickness 参数改成 -1,看一下效果:

cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 255), -1)


它进行了填充操作,即绘制了一个实心的矩形。

1.3 圆绘制

函数:

img  = cv2.circle( img, center, radius, color[, thickness[, lineType[, shift]]] )

参数:

  1. center:圆心位置。
  2. radius:半径大小。
  3. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img=np.zeros((512, 512, 3), np.uint8)# 画一个填充红色的圆,参数2:圆心坐标,参数3:半径
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下图所示:

1.4 椭圆的绘制

函数:

img  = cv2.ellipse( img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]] )

参数:

  1. center:椭圆的中心。
  2. axes:x轴和y轴的大小,即半长、短轴的大小,如(100, 50),即半长轴(x轴方向)为100,半短轴(y轴方向)为50。
  3. angle:旋转角度。
  4. startAngle:绘制的起始角度。
  5. endAngle:绘制的结束角度。
  6. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 在图中心画一个填充的半圆
cv2.ellipse(img, (256, 256), (100, 50), 0, 30, 180, (255, 0, 0), -1)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:

从这个结果也可以进一步知道,起始和结束角度都是按照顺时针方向来算的。

1.5 多边形绘制

函数:

img  = cv2.polylines(   img, pts, isClosed, color[, thickness[, lineType[, shift]]] )

参数:

  1. pts:表示多边形的点对,具体看下面的例子。
  2. isClosed:布尔型,True表示的是线段闭合,False表示不闭合,即起点和终点的那条线段不链接。
  3. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 定义四个顶点坐标
pts = np.array([[10, 5],  [50, 10], [70, 20], [20, 30]])
print(pts)
print(pts.shape)
# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2))
print(pts)
# 绘制椭圆
cv2.polylines(img, [pts], False, (0, 255, 255))
winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

这里需要将多边形的点对统一为(-1, 1, 2)这种维度的形式,这里的-1是与点的个数相适应的,后面的1和2是表示每个点是有两个坐标(x和y),然后再放入函数中,而且在函数中外面还需要再加上一个中括号使之是列表的形式。

结果如下所示:

[[10  5][50 10][70 20][20 30]]
(4, 2)
[[[10  5]][[50 10]][[70 20]][[20 30]]]


这是不闭合的情况,下面我们将False改为True,结果为:

cv2.polylines(img, [pts], True, (0, 255, 255))

1.6 添加文字

img  = cv2.putText( img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]] )

参数:

  1. text:待写入的文字。
  2. org:文字的左下角的位置,也叫起点。
  3. fontFace:字体,具体见 OpenCV中的HersheyFonts。
  4. fontScale:字体的缩放比例。
  5. bottomLeftOrigin:若为True,图像的原点在左下角,若为False,则为左上角。
  6. 其他同上。

看个例子:

import numpy as np
import cv2# 创建一张黑色的背景图
img = np.zeros((512, 512, 3), np.uint8)# 添加文字“OpenCV”,起点(50,200)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'OpenCV', (50,200), font, 3, (0, 255, 255), 5)winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyWindow(winname)

结果如下所示:

以上就是OpenCV中最常用的绘图函数,下次笔记介绍图像的几何缩放。

OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加相关推荐

  1. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  2. OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换

    OpenCV与图像处理学习五--图像滤波与增强:线性.非线性滤波.直方图均衡化与Gamma变换 三.图像滤波与增强 3.1 线性滤波 3.1.1 方框滤波 3.1.2 均值滤波 3.1.3 高斯滤波 ...

  3. OpenCV与图像处理学习十六——模板匹配

    OpenCV与图像处理学习十六--模板匹配 一.模板匹配介绍 二.代码应用 一.模板匹配介绍 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定目标的图像位于图像的什么地方,进而对图像进行定位. ...

  4. OpenCV数字图像处理学习平台

    原始图像1-1 处理中的图像1-2 处理结果1-3(检测到所有圆) OpenCV数字图像处理学习平台,是一款可视化.交互式方式学习OpenCV的工具软件,由资深计算机视觉专家精心打造,花费近两年整理成 ...

  5. OpenCV与图像处理学习十七——OpenCV人脸检测(含代码)

    OpenCV与图像处理学习十七--OpenCV人脸检测(含代码) 一.人脸识别概要 1.1 人脸检测 1.2 人脸对齐(Face Alignment) 1.3 人脸特征提取(Face Feature ...

  6. OpenCV与图像处理学习十五——LBP纹理特征(含代码)

    OpenCV与图像处理学习十五--LBP纹理特征(含代码) 一.LBP介绍 二.LBP原理 三.代码应用 一.LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种 ...

  7. OpenCV与图像处理学习十四——SIFT特征(含代码)

    OpenCV与图像处理学习十四--SIFT特征(含代码) 一.SIFT算法 二.SIFT实现过程 三.代码实现 一.SIFT算法 SIFT, 即尺度不变特征变换算法(Scale-invariant f ...

  8. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

  9. OpenCV与图像处理学习十二——图像形状特征之HOG特征

    OpenCV与图像处理学习十二--图像形状特征之HOG特征 一.图像特征理解 1.1 颜色特征 1.2 纹理特征 1.3 形状特征 1.4 空间关系特征 二.形状特征描述 2.1 HOG特征 2.1. ...

最新文章

  1. full paper(long paper),short paper,oral,poster,workshop,findings
  2. network: Android 网络判断(wifi、3G与其他)
  3. mysql5.5更改端口后初始化_centos7 修改mysql5.7默认端口后启动异常
  4. [2020.10.25NOIP模拟赛]序列【Splay】
  5. LeetCode算法入门- Longest Valid Parentheses -day12
  6. C++面向对象编程之类的使用(从struct到class的进阶)
  7. mysql主从复制的流程_MYSQL主从复制部署流程
  8. [暴力]JZOJ 100036 随机
  9. 转载:牛客练习赛17 c 规律题
  10. 在过程中要正式批准可交付成果_2014年PMP考试模拟题
  11. 推荐6款办公软件,好用还免费,效率翻倍
  12. 《计算机世界》封面报道:互联网10年孤独[z]
  13. javascript 字符串的排列与组合
  14. JS Array转JSON
  15. mac虚拟机(windows10)装powerdesigner界面模糊或图形菜单很小问题
  16. laravel laravel-admin 语言包的问题 trans('demo.user_not_exists'); trans(admin::passwords.password);
  17. ijkplayer播放器
  18. Ouster激光雷达获取点云线数ring(通道)信息
  19. 实用 | Mybatis事务管理
  20. matlab导出图片背景_matlab美化图片之添加背景颜色

热门文章

  1. Spring Cloud构建微服务架构:服务网关(过滤器)【Dalston版】
  2. Java经典基础与高级面试36题和答案
  3. 论文浅尝 | 探索将预训练语言模型用于事件抽取和事件生成
  4. (设计模式)简单工厂模式之通过配置文件动态创建实现类
  5. 【Java】函数式编程
  6. 面试-重写基础功能函数
  7. c#之using关键字
  8. sql server select和set赋值的区别
  9. 4.3.6无分类编址CIDR(构成超网)
  10. 图像处理理论-颜色模式