一、绘制简单的几何形状和添加文本

opencv中绘制图形很简单,我们只需要使用下面这些常用函数即可。

#画线
cv2.line()
#画圆
cv2.circle()
#画矩形
cv. rectangle()
#画椭圆
cv.ellipse()
#向图像添加文本
cv.putText()

在上述所有功能中,我们可以看到一些常见的参数,如下所示:

  • img:我们要绘制形状的图像
  • color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)就是蓝色。灰度图的话,我们只需要传递标量值即可。
  • 厚度:线或圆等的粗细。如果对闭合图形(如圆)传递-1,它就会填充整个形状。默认厚度=1
  • line Type:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。(我们曲线的话可以选择*CV. LINE AA*,这是一种抗锯齿的线条)

下面我们具体来看看各个函数的具体应用:

画线:

要绘制一条线,我们需要传递线的开始和结束坐标。下面我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。

import numpy as np
import cv2 as cv # 创建黑色的图像
img = np.zeros((512,512,3), np.uint8)
# 绘制一条厚度为5的蓝色对角线
cv.line(img,(0,0),(511,511),(255,0,0),5)

画矩形:

要绘制矩形,我们需要矩形的左上角和右下角的坐标。这次,我们将在图像的右上角绘制一个绿色矩形。

cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

画圆圈:

要绘制一个圆,我们需要其中心坐标和半径。下面我们将在上面绘制的矩形内绘制一个圆。

cv.circle(img,(447,63), 63, (0,0,255), -1)

画椭圆:
要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。下一个参数是轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。如果我们传递0和360的话,就可以得到一个完整的椭圆。下面我们在图像的中心绘制一个椭圆形。

cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

如果我们想要画不规则的多边形该怎么做呢?

画多边形:

要绘制多边形,我们首先需要顶点的坐标。将这些点组成形状为 ROWSx1x2 的数组,其中ROWS 是顶点数,并且其类型应为int32。下面我们绘制一个带有四个顶点的黄色小多边形。

pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

注意:cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。如果第三个参数为False,将获得一条连接所有点的折线,而不是闭合形状。

向图像添加文本:

要将文本放入图像中,我们需要传递以下参数:

  • 要写入的文字数据。
  • 要放置它的位置坐标(即文字开始的左下角)。
  • 字体类型(我们可以检查**cv.putText**文档以获取受支持的字体)。
  • 字体比例(我们可以指定字体大小)。
  • 常规的内容,例如颜色,厚度,线条类型等。为了获得更好的外观,我们可以使用lineType = cv.LINE_AA。

下面我们在图像上写上‘opencv’这六个字母:

font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)

我们来看一下最终的图像:

# 创建黑色的图像
img = np.zeros((512, 512, 3), np.uint8)
# 绘制一条厚度为5的蓝色对角线
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv.polylines(img, [pts], True, (0, 255, 255))
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

最终实现的效果:

OpenCV入门系列教学(三)绘制几何形状及添加文本的更多相关文章

  1. opencv入门系列教学(四)处理鼠标事件

    一.鼠标事件的简单演示 opencv中的鼠标事件,值得是任何与鼠标相关的任何事物,例如左键按下,左键按下,左键双击等.我们先来看看鼠标事件有哪些,在python中执行下面代码: import cv2 ...

  2. opencv入门系列教学(二)图像入门:读取、展示并保存视频

    一.从相机读取视频 通常情况下,我们必须用摄像机捕捉实时画面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.        要捕获视频,我们需要 ...

  3. openCV入门系列教学(一) 图像的读取、展示与保存

    序言 笔者最近做了两个CV领域的项目,因为数据量不足所以主要使用的是传统的CV方法.这时候不得不夸一句opencv库,让复杂的算法原理变得如此简单(调包调参侠表示很骄傲).所以闲暇下来对opencv的 ...

  4. opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)

    0.序言 每个图像是由一个个点组成的,而这些点可以表示为像素值的形式. 这篇博客里我们将学会: 访问像素值并修改它们 . 访问图像属性 . 设置感兴趣区域(ROI) . 分割和合并图像. 对于图像的基 ...

  5. opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)

    0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...

  6. opencv入门系列教学(七)改变颜色空间、提取彩色对象

    ​ 0.序言 之前的博客里我们介绍了opencv在图像上的基本操作,下面我们来进行稍微深入一点的介绍,从这里开始我们可以发现opencv库能给我们带来的更多更有趣的功能.从现在开始,我们将逐步深入了解 ...

  7. 爬虫入门系列(三):用 requests 构建知乎 API

    爬虫入门系列目录: 爬虫入门系列(一):快速理解HTTP协议 爬虫入门系列(二):优雅的HTTP库requests 爬虫入门系列(三):用 requests 构建知乎 API 在爬虫系列文章 优雅的H ...

  8. Cordova入门系列(三)Cordova插件调用 转发 https://www.cnblogs.com/lishuxue/p/6018416.html

    Cordova入门系列(三)Cordova插件调用   版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了cordova android项目是如何运行的,这一章我们介绍cordova的核心 ...

  9. Vue入门系列(三)之Vue列表渲染及条件渲染实战

    Vue官网: https://cn.vuejs.org/v2/guide/forms.html#基础用法 [入门系列] (一)  http://www.cnblogs.com/gdsblog/p/78 ...

随机推荐

  1. c# 将checkedListBox选择的值保存再数组中并转换成以指定字符连接的字符串

    经常忘记,所以记一下: string[] arr =new string[3]; int b = 0; foreach (string outstr in checkedListBox1.Checke ...

  2. 记一次 .NET 某云采购平台API 挂死分析

    一:背景 1. 讲故事 大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈,手里面也攒了1 ...

  3. 什么是TCP?什么是TCP协议?

    一.什么是TCP >>>TCP是一种传输控制协议,是面向连接的.可靠的.基于字节流之间的传输层通信协议 >>>在因特网协议族里面,TCP层是在IP层上面,应用层下面 ...

  4. P2491 消防/P1099 树网的核

    P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...

  5. 纯C语言(C89)实现动态数组

    起因 工作很少接触纯C项目,业余写着玩玩,不断雕琢 目标 纯C实现动态数组,提供方便易用泛型接口,避免依赖 实现 完全封装,隐藏结构体细节,不支持栈创建 拷贝存储,轻微性能代价换来易用性 vector ...

  6. 2020厦门大学综述翻译:3D点云深度学习(Remote Sensiong期刊)

    目录 摘要 1.引言: 2.点云深度学习的挑战 3.基于结构化网格的学习 3.1 基于体素 3.2 基于多视图 3.3 高维晶格 4.直接在点云上进行的深度学习 4.1 PointNet 4.2 局部 ...

  7. java小程序之随机任务发布器

    需求 自定义任务 随机定时 随机排序 集合输出 搭建 简单项目,所以我使用java 的maven来搭建一个控制台程序,并且使用excel来记录任务 创建任务类(sub) package com.mic ...

  8. shell的编程规范和变量

    目录 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell 三.shell脚本的构 ...

  9. PPT学习总结

    [一]关注 1. 内容 2. 结构 3. 配色 4. 素材 5. 构图 6. 动画 [二]技巧 1. 颜色对比 2. 动画突出 [三]参考 https://www.zhihu.com/question ...

  10. 针对不同场景的Python合并多个Excel方法

    大家好,我是辰哥~ 在辰哥看来,技术能够减少繁琐工作带来的枯燥,技术+实际=方便.最近辰哥也是在弄excel文件的时候发现手动去整理有点繁琐枯燥,想着技术可以代替我去处理这部分繁琐的工作那何乐而不为呢 ...