OpenCV(3.2)+Python(3.6)学习(基于官方API)(三)

1.3 Drawing Functions in OpenCV


Goal
  • 学习如何用 OpenCV 画各种不同的图形。
  • 我们将学习这些函数:cv2.line(),cv2.circle(),cv2.rectangle,cv2.ellipse(),cv2.putText() 等等。

Code

在上面提到的所有函数中,他们都有一些共同的参数:

  • img : 画板,也就是你要在哪个图像上画图。
  • color : 你所画图形的颜色。BGR模式,需要传递一个元组,例如(255,0,0)就表示蓝色。对于灰度图传递一个标量值就行了。
  • thickness : 直线、圆环等图形的线条的粗细。如果这个值是-1就代表闭合的图形,这时图形将被 color 填充。这个参数的默认值是1.
  • lineType : 线型,生成线条的方式,默认值是 8-connected,对这个感兴趣的可以参考这里。其中cv2.LINE_AA可以让曲线获得抗锯齿的效果,从而使曲线更加平滑。

Drawing Line

要画一条直线,我们需要传递直线起始点的坐标。下面的代码我们将在一张黑色的图片上画一条从左上角到右下角的蓝色直线。

import numpy as np
import cv2

# 创建一个黑色的背景
img = np.zeros((512,512,3),np.uint8)

# 画一个宽度为5个像素,颜色为蓝色的对角线。
img = cv2.line(img,(0,0),(511,511),(255,0,0),5)

这里说明一下numpy.zeros()函数把一个图像所需要的长宽和通道数用一个三维数组表示出来,并且里面的数据都用0填充,这样我们就会得到一个纯黑的背景。要了解 numpy 里面的array可以参考这里


Drawing Rectangle

要画一个长方形,你需要知道它的左上角与右下角顶点的坐标,我们在背景的右上角画一个绿色的长方形。

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

Drawing Circle

要画一个圆,我们需要指定圆心位置与半径。我们在之前画的长方形内部画一个圆。

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

Drawing Ellipse

要画一个椭圆,我们需要传递一系列的参数。第一个参数是中心点的位置。下一个参数是椭圆长轴与短轴的长度。angle 参数代表椭圆本身以逆时针方向偏转的角度。startAngle 和 endAngle 代表椭圆的哪一部分被渲染,从长轴开始顺时针方向从 startAngle 到 endAngle 的部分会被渲染。下面我们在背景的中心位置画一个半椭圆。

img = cv2.ellipse(img,(255,255),(100,50),0,0,180,(255,0,0),-1)

Drawing Polygon

要画一个多边形,我们首先需要知道它顶点的坐标。然后把所有的顶点放到一个形状为ROWSx1x2的数组里面。这里ROWS就是顶点的个数,它必须是 int32 类型的值。

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

现在我们讨论上面的几个函数,第一个是numpy.array()这个函数用来生成一个数组,它比 Python 自带的 list 性能要好。这里我们给它传了一个二维数组,我们要用reshape()函数将它转换为一个ROWSx1x2格式的三维数组。reshape函数里面的-1代表这个维度是有其他两个维度计算而来的,数组的转换规律是不能改变原数组中的元素,原来二维数组中有8个元素,那么转换后的三维数组也是8个元素,所以其实上面的-1的位置就是4,对numpy.array不熟悉的请参考这里。接下来使用画多条直线的函数cv2.polylines()将多边形画出来。其中的第三个参数如果是 False 的话图形第一个点和最后一个点不会连起来,你就得不到一个闭合的图形了。

提示:cv2.polylines()可以被用来画一组直线,它比用cv2.line()一条一条的画直线效率高很多。


Adding Text to Images

要在图像上显示文字,你需要指定以下内容

  • 你想要写的文字数据
  • 你想要放置文字的坐标位置
  • 字体
  • 字号
  • 颜色、粗细、线型等等,这里推荐使用lineType = cv2.LINE_AA线型

我们写一个白色的 RYAN 在图像的底部。

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

下面将上面的代码整合一下(部分数据做了更改)

import numpy as np 
import cv2

# zeros() 函数第一个参数是一个元组(高,宽,通道数(1,3或4的一个枚举值))
# 第二个参数是一个 DataType [参考](https://docs.scipy.org/doc/numpy-dev/reference/c-api.dtype.html) 
img = np.zeros((512,512,3),np.uint8)

# line() 函数第一个参数是画板,第二个第三个分别是起始点(左上角为(0,0))
# 第四个参数是线的颜色(BGR模式),最后一个是线的粗细。  
img = cv2.line(img,(10,10),(501,501),(255,0,0),1)
img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),2)
img = cv2.circle(img,(255,255),63,(0,0,255),-1)

# 画椭圆需要这么几个参数
# 画板、中心点坐标、长短轴的长度、椭圆的旋转角度、椭圆的起始角度、颜色、线的粗细
img = cv2.ellipse(img,(255,255),(100,50),0,30,360,(0,255,0),-1)

pts = np.array([[15,15],[100,90],[210,70],[300,20]],np.int32)
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,[pts],True,(0,255,255))

font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.putText(img,'Ryan',(10,450),font,6,(255,255,255),2,cv2.LINE_AA)

cv2.imshow('img',img)
cv2.waitKey(0)

cv2.destroyAllWindows()

效果如下图所示

画简单的几何图形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值