win10+Python3.7.3+OpenCV3.4.1入门学习(十九 绘图及交互)————19.1 绘画基础

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

第19章 绘图及交互

OpenCV提供了方便的绘图功能,使用其中的绘图函数可以绘制直线、矩形、圆、椭圆等多种几何图形,还能在图像中的指定位置添加文字说明。
在处理图像时,可能需要与当前正在处理的图像进行交互。OpenCV提供了鼠标事件,使用户可以通过鼠标与图像交互。鼠标事件能够识别常用的鼠标操作,例如:针对不同按键的单击、双击,鼠标的滑动、拖曳等。
OpenCV还提供了滚动条用于实现交互功能。用户可以拖动滚动条在某一个范围内设置特定的值,并将该值应用于后续的图像处理中。而且,如果设置为二值形式,滚动条还可以作为开关选择器使用。
绘图、鼠标交互、滚动条交互都是OpenCV中GUI的重要知识,本章将对上述内容做简单介绍。

19.1 绘画基础

OpenCV提供了绘制直线的函数cv2.line()、绘制矩形的函数cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的函数cv2.ellipse()、绘制多边形的函数cv2.polylines()、在图像内添加文字的函数cv2.putText()等多种绘图函数。
这些绘图函数有一些共有的参数,主要用于设置源图像、颜色、线条属性等。下面对这些共有参数做简单的介绍。
● img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
● color:绘制形状的颜色。通常使用BGR模型表示颜色,例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。需要注意,颜色通道的顺序是BGR,而不是RGB。
● thickness:线条的粗细。默认值是1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
● lineType:线条的类型,默认是8连接类型。lineType参数的值及说明如下表所示。
在这里插入图片描述
● shift:数据精度。该参数用来控制数值(例如圆心坐标等)的精度,一般情况下不需要设置。

19.1.1 绘制直线

OpenCV提供了函数cv2.line()用来绘制直线(线段)。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType的含义如前面的说明所示。
● pt1表示线段的第1个点(起点)。
● pt2表示线段的第2个点(终点)。

eg1:使用cv2.line()函数在一个黑色背景图像内绘制三条线段。
代码如下:

import numpy as np
import cv2
n = 300
img = np.zeros((n+1,n+1,3), np.uint8)
img = cv2.line(img,(0,0),(n,n),(255,0,0),3)
img = cv2.line(img,(0,100),(n,100),(0,255,0),1)
img = cv2.line(img,(100,0),(100,n),(0,0,255),6)
winname = 'Demo19.1'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

运行程序,结果如下图所示。该程序在图像img中使用函数cv2.line()绘制了三条不同起始点、颜色和粗细的直线。

19.1.2 绘制矩形

OpenCV提供了函数cv2.rectangle()用来绘制矩形。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType的含义如前面的说明所示。
● pt1为矩形顶点。
● pt2为矩形中与pt1对角的顶点。

eg2:使用函数cv2.rectangle()在一个白色背景图像内绘制一个实心矩形。
代码如下:

import numpy as np
import cv2
n = 300
img = np.ones((n,n,3), np.uint8)*255
img = cv2.rectangle(img,(50,50),(n-100,n-50),(0,0,255),-1)
winname = 'Demo19.1'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.rectangle()绘制了一个红色的实心矩形
在这里插入图片描述

19.1.3 绘制圆形

OpenCV提供了函数cv2.circle()用来绘制圆。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType的含义如前面的说明所示。
● center为圆心。
● radius为半径。

eg3:使用函数cv2.circle()在一个白色背景图像内绘制一组同心圆。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
#将图像的中心作为圆心,实际值为=d/2
red = (0,0,255)#设置白色变量
for r in range(5,round(d/2),12):
    cv2.circle(img,(centerX,centerY),r,red,3)
    #circle(载体图像,圆心,半径,颜色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.circle()绘制了一组同心圆。
在这里插入图片描述
eg4:使用函数cv2.circle()在一个白色背景图像内绘制一组位置和大小均随机的实心圆。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
#生成白色背景
for i in range(0,100):
    centerX = np.random.randint(0,high = d)
    #生成随机圆心X,确保在画布img内
    centerY = np.random.randint(0,high = d)
    #生成随机圆心Y,确保在画布img内
    radius = np.random.randint(5,high = d/5)
    #生成随机半径,值范围:[5,d/5),最大半径是d/5
    color = np.random.randint(0,high = 256,size = (3,)).tolist()
    #生成随机颜色,3个[0,256)的随机数    
    cv2.circle(img,(centerX,centerY),radius,color,-1)
    #使用上述随机数,在画布img内画圆
cv2.imshow("demo19.4",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在画布中使用函数cv2.circle()绘制了一组随机的实心圆。
在这里插入图片描述

19.1.4 绘制椭圆

OpenCV提供了函数cv2.ellipse()用来绘制椭圆。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType的含义如前面的说明所示。
● center为椭圆的圆心坐标。
● axes为轴的长度。
● angle为偏转的角度。
● startAngle为圆弧起始角的角度。
● endAngle为圆弧终结角的角度。
为了方便理解,OpenCV官网上对上述参数的含义做了配图说明,有兴趣的读者可以去官网进一步了解。

eg5:使用函数cv2.ellipse()在一个白色背景图像内随机绘制一组空心椭圆。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
#生成白色背景
center=(round(d/2),round(d/2))
#注意数值类型,center=(d/2,d/2)不可以
size=(100,200)
#轴的长度
for i in range(0,10):
    angle = np.random.randint(0,361)
    #偏移角度    
    color = np.random.randint(0,high = 256,size = (3,)).tolist()
    #生成随机颜色,3个[0,256)的随机数    
    thickness = np.random.randint(1,9)
    cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo19.5",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.ellipse()绘制了一组随机的空心椭圆。
在这里插入图片描述

19.1.5 绘制多边形

OpenCV提供了函数cv2.polylines()用来绘制多边形。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType和shift的含义如前面的说明所示。
● pts为多边形的各个顶点。
● isClosed为闭合标记,用来指示多边形是否是封闭的。若该值为True,则将最后一个点与第一个点连接,让多边形闭合;否则,仅仅将各个点依次连接起来,构成一条曲线。
在使用函数cv2.polylines()绘制多边形时,需要给出每个顶点的坐标。这些点的坐标构建了一个大小等于“顶点个数12”的数组,这个数组的数据类型必须为numpy.int32。下面的例19.6绘制了一个黄色的具有四个顶点的多边形。

eg6:使用函数cv2.polylines()在一个白色背景图像内绘制一个多边形。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
#生成白色背景
pts=np.array([[200,50],[300,200],[200,350],[100,200]], np.int32)
#生成各个顶点,注意数据类型为int32
pts=pts.reshape((-1,1,2))
#第1个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
cv2.polylines(img,[pts],True,(0,255,0),8)
#调用函数polylines完成多边形绘图,注意第3个参数控制多边形封闭
# cv2.polylines(img,[pts],False,(0,255,0),8)  #不闭合的的多边形
cv2.imshow("demo19.6",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.polylines()绘制了一个封闭的多边形。
在这里插入图片描述

函数cv2.polylines()中的第3个参数isClosed是闭合标记,将该值设置为False时,仅仅将各个顶点用线段连接,多边形是不封闭的。此时的代码为:

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

上述代码绘制的结果如下图所示。

在这里插入图片描述

因此,可以使用函数cv2.polylines()来绘制多条首尾相连的线段。只要把线段的各个点放在一个数组中,将这个数组传给函数cv2.polylines()的第2个参数pts就可以了。

19.1.6 在图形上绘制文字

OpenCV提供了函数cv2.putText()用

来在图形上绘制文字。该函数的语法格式为:

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

式中:
● 参数img、color、thickness、lineType和shift的含义如前面的说明所示。
● text为要绘制的字体。
● org为绘制字体的位置,以文字的左下角为起点。
● fontFace表示字体类型,其参数类型及含义如下表所示。
● fontScale表示字体大小。
● bottomLeftOrigin用于控制文字的方向。默认值为False,当设置为True时,文字是垂直镜像的效果。
在这里插入图片描述
eg7:使用函数cv2.putText()在一个白色背景图像内绘制文字。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
#生成白色背景
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(0,200),font, 3,(0,0,255),15)
cv2.putText(img,'OpenCV',(0,200),font, 3,(0,255,0),5)
cv2.imshow("demo19.7",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.putText()绘制了文字“OpenCV”。

在这里插入图片描述

在上述程序中,第1次调用函数cv2.putText()绘制了一个宽度(由参数thickness控制)为15的文字“OpenCV”,第2次调用函数cv2.putText()时,在第1次绘制的“OpenCV”内部绘制了一个稍细的宽度为5的
“OpenCV”。因为两次使用的颜色不一样,所以实现了文字的“描边”效果。

eg8:使用函数cv2.putText()在一个白色背景图像内绘制一段镜像的文字。
代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
#生成白色背景
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(0,150),font, 3,(0,0,255),15)
cv2.putText(img,'OpenCV',(0,250),font, 3,(0,255,0),15,
            cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,True)
cv2.imshow("demo19.7",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行程序,结果如下图所示。该段程序在图像img中使用函数cv2.putText()绘制了两种不同形式的文字“OpenCV”。

在这里插入图片描述
在上述程序中,第1次调用函数cv2.putText()绘制了上方的正常显示的文字“OpenCV”;第2次调用函数cv2.putText()时,参数bottomLeftOrigin的值被设置为True,实现绘制镜像文字效果,绘制了下方的倒置文字“OpenCV”。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值